简介:
SysTick即系统定时器是一个内核外设,而不是片上外设,寄存器手册说明需要查看《Cortex-M3编程手册》,具体是哪一款内核就查哪一款内核的手册,我用的stm32f103所以我查的Cortex-M3。
其实就是个24位递减计数器,计一个数时间是1/SYSCLK,stm32f103里面SYSCLK=72MHZ,
所以其计数周期是1/72*10^6s = 1/72us。(1s = 10^6us),当从初值递减到0时会产生一个中断,NVIC捕获到这个中断后,就开始执行中断服务函数SysTick_Handler(已经在startup_stm32f10x_hs.s中注册。
一、初始化SysTick
在core_cm3.h中有static __INLINE uint32_t SysTick_Config(uint32_t ticks)这个函数,这个函数初始化了SysTick的寄存器,计一个数的周期为1/SYSCLK,而SYSCLK=72MHZ,所以我们传入ticks = 72时,即1us产生一次SysTick中断。ticks = 72000时,即1ms产生一次SysTick中断。
二、点灯实验
用SysTick定时器定时1ms,然后以1s的时间间隔让LED1灯闪烁。本次平台为野火指南者开发板。LED1接PB0,低电平点亮。
cpp#include "stm32f10x.h" #include"core_cm3.h" int g_systick = 0; void __Systick_init(void); void LED_GPIO_Config(void); int main(void) { LED_GPIO_Config();//LED1连接的是PB0 __Systick_init();//初始化systick,1ms产生一次中断 GPIOB->ODR = 0xfffffffe;//直接操作GPIO的输出数据寄存器控制PB0输出低电平。 while(1) { if(g_systick == 1000)//定时1s,g_systick在SysTick_Handler中,来一次中断g_systick加1 { g_systick = 0; GPIOB->ODR ^= GPIO_Pin_0;//通过异或将PB0的电平反转一次 } } return 0; } //1.初始化PB0为推挽输出模式 void LED_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); } //2.定时1ms void __Systick_init(void) { SysTick_Config(72000);//Systick定时1ms,即1ms产生一次Systick中断 } //3.systick的中断服务函数,已经在startup_stmf10x_hs.s中定义好 void SysTick_Handler(void) { g_systick++; }