系统滴答定时器(System tick timer,简称SysTick),属于STM32微控制器内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit向下递减的计数器,计数器每计数一次的时间为1/SYSCLK。当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复。
实验程序:利用SysTick,设置微处理器1ms产生一次中断,并实现精确延时函数,控制LED灯开关状态的反转。
一、配置SysTick
static __IO uint32_t TimingDelay; void SysTick_Init(void) { if (SysTick_Config(SystemCoreClock / 1000)) { // Capture error while (1) { __asm("nop"); } } } void Delay_ms(__IO uint32_t nTime) { TimingDelay = nTime; while(TimingDelay != 0) { __asm("nop"); } } void TimingDelay_Decrement(void) { if(TimingDelay != 0x00) TimingDelay--; }
二、配置LED
void LED_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; // Enable GPIOB clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // Configure PB.0~15 pins as output push-pull GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void LED_Toggle(void) { GPIOB->ODR ^= GPIO_Pin_All; }
三、中断处理程序
void SysTick_Handler(void) { TimingDelay_Decrement(); }
四、主程序
#include "stm32f10x.h" #include "bsp_led.h" #include "bsp_SysTick.h" int main(void) { LED_Config(); SysTick_Init(); while(1) { Delay_ms(500); LED_Toggle(); } }