STM32微控制器之系统滴答定时器SysTick的使用方法

系统滴答定时器(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();
	}
}

Leave a Reply

Your email address will not be published. Required fields are marked *