方案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);
}