stm32的系统定时器systick笔记">STM32的系统定时器SysTick笔记
时钟计算公式
t | 定时时间 |
---|---|
ticks | 多少时钟周期中断一次 |
f | 时钟频率 72Mhz=72000000 |
t=Ticks * 1/f = (72000000/100000) * (1/72000000) = 10us
函数">初始化函数
void SysTick_Init(void)
{
/* SystemFrequency / 1000 1ms中断一次
* SystemFrequency / 100000 10us中断一次
* SystemFrequency / 1000000 1us中断一次
*/
// if (SysTick_Config(SystemFrequency / 100000)) // ST3.0库版本 SystemFrequency 72MHZ
if (SysTick_Config(SystemCoreClock / 100000)) // ST3.5库版本
{
/* Capture error */
while (1);
}
// 关闭滴答定时器
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
延时程序运行时,ticks的值放入LOAD,LOAD再放入VAL:
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); //时钟用的是24Mhz,如果ticks的值大于2的24次方,会报错,跳出函数
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; //将 ticks放入重装载寄存器
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); //设置SysTick_IRQn的优先级,1左移四位
SysTick->VAL = 0; //VAL计数器设置为0
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | //时钟来源
SysTick_CTRL_TICKINT_Msk | //开中断
SysTick_CTRL_ENABLE_Msk; //使能寄存器
return (0);
}
函数">Delay_us函数
nTime为10000时,TimingDelay为10000,打开时钟后,一直停在while(TimingDelay != 0);
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;//打开时钟
while(TimingDelay != 0);
}
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
TimingDelay不为0,一直减减:
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
函数">主函数:
int main(void)
{
SysTick_Init();
for(;;)
{
Delay_us(100000); // 100000 * 10us = 1000ms
}
}
注:
- stm32f10x_it.c中使用外部关键字TimingDelay,要声明extern void TimingDelay_Decrement(void);
- bsp_SysTick.c里也要声明 static __IO u32 TimingDelay;
- volatile const 的用法