STM32 SysTick两种定时设计

方案1:

void SysTick_Init(void)
{

	if (SysTick_Config(SystemCoreClock / 100000))	// SystemCoreClock / 100000 重装载值为720,CLK为72M,所以720/720M=10us中断一次
	{ 
		/* Capture error */ 
		while (1);
	}
}
void Delay_10us(__IO u32 nTime)
{ 
	TimingDelay = nTime;	
	// 使能滴答定时器
	SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;
	while(TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{
	if (TimingDelay != 0x00)
	{ 
		TimingDelay--;
	}
}
void SysTick_Handler(void)
{
	TimingDelay_Decrement();
}

该方案每10us进一次中断,进一次中断TimingDelay就减1,所以总时间为TimingDelay*10us。

使用方法:

int main(void)
{
	SysTick_Init();
	while(1)
	{
		//LED灯1s闪烁间隔
		LED_ON;//LED灯开
		Delay_10us(100000);
		LED_OFF;//LED灯关
		Delay_10us(100000);
	}
}

方案2:

void SysTick_Delay_Us( __IO uint32_t us)
{
	uint32_t i;
	SysTick_Config(SystemCoreClock/1000000);//1us中断一次
	
	for(i=0;i<us;i++)
	{
		// 当计数器的值减小到0的时候,CRTL寄存器的位16会置1	
		while( !((SysTick->CTRL)&(1<<16)) );
	}
	// 关闭SysTick定时器
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

void SysTick_Handler(void)
{
}

方案二虽然是1us中断一次,但中断服务函数里面完全没有任何操作,会直接退出,我们是通过读取SysTick->CTRL的第16位,如果在上次读取本寄存器后, SysTick 已经计到了 0,则该位为 1。重装载之后该位又变成0。(如果你想屏蔽SysTick中断服务,请看另外一篇博客)
如何关闭STM32的SysTick中断服务函数
调用:

int main(void)
{
	//LED灯1s闪烁间隔
	LED_ON;
	SysTick_Delay_Us(1000000);
	LED_OFF;
	SysTick_Delay_Us(1000000);
}

猜你喜欢

转载自blog.csdn.net/qq_43334597/article/details/106223050