×
单片机 > 单片机程序设计 > 详情

STM32F10x 学习笔记之SysTick 定时器

发布时间:2020-05-19 发布时间:
|

SysTick 定时器被集成在NVIC中。因此,只要是Cortex-M3 内核的单片机,就都有它。这个学习笔记就用SysTick 定时器来实现走马灯的功能。


SysTick 定时器非常简答,只有四个寄存器。这四个寄存器的含义在《Cortex-M3权威指南》那本书中讲的非常的清楚,这里不复述了,下面只讲讲在STM32上SysTick有什么特殊之处。按照CMSIS 标准,用C语言访问这四个寄存器时使用的寄存器名称分别如下:

SysTick->CTRL
SysTick->LOAD
SysTick->VAL
SysTick->CALIB

 

SysTick->CALIB 的值固定为9000,因此,只有当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值) ,产生1ms 时间基准。


STM32提供了2个时钟源:

0: AHB/8

1: Processor clock (AHB)


因此,SysTick->CTRL = 7 表示使用处理器时钟作为时钟源,使能SysTick,并且使能SysTick中断。SysTick->CTRL = 3 时频率降为原来的1/8。 

我的开发板上有四个LED,分别对应的GPIO端口D 的 PD2、PD3、PD4和PD7。


下面是例子程序,仍然先是直接设置寄存器。


  1. #include "stm32f10x.h"  

  2.   

  3. #define RCC_GPIO_LED                                 RCC_APB2Periph_GPIOD  

  4. #define GPIO_LED_PORT                                GPIOD      

  5. #define GPIO_LED1                                    GPIO_Pin_2      

  6. #define GPIO_LED2                                    GPIO_Pin_3      

  7. #define GPIO_LED3                                    GPIO_Pin_4      

  8. #define GPIO_LED4                                    GPIO_Pin_7  

  9. #define GPIO_LED_ALL                                 GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4   

  10.   

  11.   

  12. void LED_Spark(void)  

  13. {  

  14.     static int state = 0;  

  15.     switch (state)  

  16.     {  

  17.     case 0:  

  18.         GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

  19.         GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED1);  

  20.         state ++;  

  21.         break;  

  22.     case 1:  

  23.         GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

  24.         GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED2);  

  25.         state ++;  

  26.         break;  

  27.     case 2:  

  28.         GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

  29.         GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED3);  

  30.         state ++;  

  31.         break;  

  32.     case 3:  

  33.         GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

  34.         GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED4);  

  35.         state = 0;  

  36.         break;  

  37.     default:  

  38.         state = 0;  

  39.         break;  

  40.     }  

  41. }  

  42. int main(void)  

  43. {  

  44.     SystemInit();  

  45.     RCC->APB2ENR  |=  0x00000020;  

  46.     GPIOD->CRL = 0x24422244; //PD2 PD3 PD4 PD7 Set to Output mode    

  47.       

  48.     SysTick->LOAD = 24000000/200;  

  49.     SysTick->CTRL = 3;       

  50.   

  51.     for(;;)  

  52.     {  

  53.     }     

  54. }  

  55.   

  56. /** 

  57.  * @brief  This function handles SysTick Handler. 

  58.  * @param  None 

  59.  * @retval None 

  60.  */  

  61. void SysTick_Handler(void)  

  62. {  

  63.     static int count = 0;  

  64.     count ++;  

  65.     if (count == 100)   

  66.     {  

  67.         LED_Spark();  

  68.         count = 0;  

  69.     }  

  70. }  


然后是利用STM32 固件函数库提供的函数的例子。


  1. #include "stm32f10x.h"  

  2.   

  3. #define RCC_GPIO_LED                                 RCC_APB2Periph_GPIOD  

  4. #define GPIO_LED_PORT                                GPIOD      

  5. #define GPIO_LED1                                    GPIO_Pin_2      

  6. #define GPIO_LED2                                    GPIO_Pin_3      

  7. #define GPIO_LED3                                    GPIO_Pin_4      

  8. #define GPIO_LED4                                    GPIO_Pin_7  

  9. #define GPIO_LED_ALL                                 GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4   

  10.   

  11. void LED_Spark(void)  

  12. {  

  13.     static int state = 0;  

  14.     switch (state)  

  15.     {  

  16.     case 0:  

  17.         GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

  18.         GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED1);  

  19.         state ++;  

  20.         break;  

  21.     case 1:  

  22.         GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

  23.         GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED2);  

  24.         state ++;  

  25.         break;  

  26.     case 2:  

  27.         GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

  28.         GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED3);  

  29.         state ++;  

  30.         break;  

  31.     case 3:  

  32.         GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

  33.         GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED4);  

  34.         state = 0;  

  35.         break;  

  36.     default:  

  37.         state = 0;  

  38.         break;  

  39.     }  

  40. }  

  41. int main(void)  

  42. {  

  43.     GPIO_InitTypeDef GPIO_InitStructure;  

  44.     SystemInit();  

  45.     SysTick_Config(SystemCoreClock/100);  

  46.   

  47.     /* Enable GPIOB, GPIOC and AFIO clock */  

  48.     RCC_APB2PeriphClockCmd(RCC_GPIO_LED, ENABLE);  //RCC_APB2Periph_AFIO  

  49.       

  50.     /* LEDs pins configuration */  

  51.     GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;  

  52.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;  

  53.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

  54.     GPIO_Init(GPIO_LED_PORT, &GPIO_InitStructure);  

  55.   

  56.     for(;;)  

  57.     {  

  58.   

  59.     }     

  60. }  

  61.   

  62. /** 

  63.  * @brief  This function handles SysTick Handler. 

  64.  * @param  None 

  65.  * @retval None 

  66.  */  

  67. void SysTick_Handler(void)  

  68. {  

  69.     static int count = 0;  

  70.     count ++;  

  71.     if (count == 100)   

  72.     {  

  73.         LED_Spark();  

  74.         count = 0;  

  75.     }  

  76. }  


 

需要说明的是,若是用 SysTick_Config 函数来设置SysTick的中断频率,时钟源就不能人为的指定了,这时使用的时钟源就是内核的频率。

SystemCoreClock 是个全局变量,它的值就是内核的运行频率,不过前提要调用 SystemInit() 函数来设置内核的频率。如果内核的频率是字节写寄存器来设置的,SystemCoreClock 的值就不一定对了。




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义