STM32F10XXXX---SysTick滴答定时器

来源:互联网 发布:mac口红玫红色 编辑:程序博客网 时间:2024/04/27 20:21

关于SysTick滴答定时器详细说明《STM32F10xxx的Cortex-M3编程手册英文文档》:如下图



网上流传的汉化寄存器说明如下:



参考:http://blog.sina.com.cn/s/blog_4f09c0b501015fq8.html


基础应用实例:

/**  ******************************************************************************  * @file    SysTick/main.c   * @author  guo  * @version V3.5.0  * @date    03-February-2015  * @brief   GPIO_Pin_10 引脚输出周期2s的方波  ******************************************************************************  */ /* Includes ------------------------------------------------------------------*/#include "stm32f10x.h"/** @addtogroup STM32F10x_StdPeriph_Examples  * @{  *//** @addtogroup SysTick_TimeBase  * @{  */ /* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*///static u8  us_value=0;//us延时倍乘数static u16 ms_value=0;//ms延时倍乘数/* Private function prototypes -----------------------------------------------*/void Delay_ms(uint32_t nms);void  RCC_Configuration(void);void  GPIO_Configuration(void);void SysTick_init(void);/* Private functions ---------------------------------------------------------*//**  * @brief  Main program.  * @param  None  * @retval None  */int main(void){/* Initialize Leds mounted on STM3210X-EVAL board */RCC_Configuration();  //LED 输出配置GPIO_Configuration(); //使用的资源时钟配置  SysTick_init();   //初始配置while (1)  {  /* 引脚置低  */GPIO_ResetBits(GPIOC, GPIO_Pin_10);    /* Insert 1000 ms delay */Delay_ms(1000);    /* 引脚置高*/GPIO_SetBits(GPIOC, GPIO_Pin_10);    /* Insert 100 ms delay */Delay_ms(100);}}void  RCC_Configuration(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);}void  GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC,&GPIO_InitStructure);}void SysTick_init(void)  {      SysTick->CTRL = 0x01; //选择外部时钟9MHz(HCLK/8),并使能定时器ms_value = 9000;  //数据手册:系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。} void Delay_ms(uint32_t nms)  {       uint32_t temp;       SysTick->LOAD = (uint32_t)nms*ms_value - 1;  //时间加载(SysTick->LOAD为32 bit)     SysTick->VAL = 0x00;   //清空计数器     do       {          temp = SysTick->CTRL;       }       while(temp&0x01&&!(temp&(1<<16)));  //等待时间到达,COUNTFLAG 标志位会置位--> 读值清零}  /*******************END OF FILE *******************************************/

中断实例:

文件:main.c

/**  ******************************************************************************  * @file    SysTick\SysTick_IT\main.c   * @author  guo  * @version V3.5.0  * @date    04-February-2015  * @brief   GPIO_Pin_10 引脚输出周期2s的方波  ******************************************************************************  */ /* Includes ------------------------------------------------------------------*/#include "stm32f10x.h"/** @addtogroup STM32F10x_StdPeriph_Examples  * @{  *//** @addtogroup SysTick_TimeBase  * @{  */ /* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*//* Private function prototypes -----------------------------------------------*/void Delay_ms(uint32_t nms);void  RCC_Configuration(void);void  GPIO_Configuration(void);void SysTick_init(void);/* Private functions ---------------------------------------------------------*//**  * @brief  Main program.  * @param  None  * @retval None  */int main(void){/* Initialize Leds mounted on STM3210X-EVAL board */RCC_Configuration();  //LED 输出配置GPIO_Configuration(); //使用的资源时钟配置  SysTick_init();   //初始配置while(1)  {}}void  RCC_Configuration(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);}void  GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC,&GPIO_InitStructure);}void SysTick_init(void)  {      SysTick->CTRL = 0x00; //失能SysTick->LOAD = (uint32_t)(9000000-1); //数据手册:系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。SysTick->VAL =0x00;                    //清空计数器SysTick->CTRL = 0x03; //选择外部时钟9MHz(HCLK/8),并使能定时器+中断} /*******************END OF FILE *******************************************/


中断处理stm32f10x_it.c:

................extern void  GPIO_Configuration(void);................/**  * @brief  This function handles SysTick Handler.  * @param  None  * @retval None  */void SysTick_Handler(void){static char flag = 0;//uint32_t temp;//SysTick->VAL = 0x00;   //清空计数器//temp = SysTick->CTRL;   //清除标志位if(flag == 0){GPIO_ResetBits(GPIOC, GPIO_Pin_10);flag = 1;}else{GPIO_SetBits(GPIOC, GPIO_Pin_10);flag = 0;}}

注.....:

1、如何设置它的优先级?-----默认最低优先级------ http://blog.csdn.net/sunjiajiang/article/details/7741715

2、systick的中断服务函数里,是否需要清除中断标志位?

《STM32F10xxx的Cortex-M3编程手册英文文档》 寄存器STK_VAL中提到“A write of any value clears the field to 0, and also clears the COUNTFLAG bit in the STK_CTRL register to 0.”,

实际上不写SysTick->VAL貌似也没什么问题 (//SysTick->VAL = 0x00;),目测工作正常。


Cortex-M3中断机制及SysTick 简介:http://blog.sina.com.cn/s/blog_6ebd49350100q85c.html









0 0
原创粉丝点击