- SysTick定时时间计算(当系统时钟为72M时)
t =重载*(1 / Clk)
Clk = 72M时,t =(72)*(1 / 72M)= 1 us
Clk = 72M时,t =(72000)*(1 / 72M)= 1ms
1s = 1000ms = 1000 000 us = 100 000 000 ns
- 当系统定时器中断与外设中断进行优先级比较时,只需要把内核外设的中断优先级的四个位按照外设的中断优先级来分组解析即可,即人为的分出抢占优先级和子优先级
- SysTick_Config()函数
//这个固件库函数在core_com3.h中
静态__INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//重载寄存器为24位,最大值为2 ^ 24
如果(滴答> SysTick_LOAD_RELOAD_Msk)返回(1);
//配置重装寄存器的初始值
SysTick-> LOAD =(ticks&SysTick_LOAD_RELOAD_Msk) - 1;
//配置中断优先级为15,优先级为最低
NVIC_SetPriority(SysTick_IRQn,(1 << __ NVIC_PRIO_BITS) - 1);
//配置计数器计数器的值
SysTick-> VAL = 0;
//配置系统定时器的时钟为72M
//使能中断
//使能系统定时器
SysTick-> CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
返回(0);
}
- 延时函数(软件检测 - 判断计数器的数值)
void SysTick_Delay_us(uint32_t us)
{
我uint32_t我;
SysTick_Config(72);
对于(I = 0; I <我们;我++)
{
while(!((SysTick-> CTRL)&(1 << 16)));
}
SysTick-> CTRL&=〜SysTick_CTRL_ENABLE_Msk;
}
- 延时函数(利用中断服务函数)
静态__IO u32 TimingDelay; / ** * @brief启动系统滴答定时器SysTick * @param无 * @retval无 * / void SysTick_Init(void) { / * SystemFre * quency / 1000 1ms中断一次 * SystemFrequency / 100000 10us中断一次 * SystemFrequency / 1000000 1us中断一次 * / //如果(SysTick_Config(SystemFrequency / 100000))// ST3.0.0库版本 如果(SysTick_Config(SystemCoreClock / 100000))// ST3.5.0库版本 { / *捕捉错误* / 而(1); } } / ** * @brief us延时程序,10us为一个单位 * @参数 * @arg nTime:Delay_us(1)则实现的延时为1 * 10us = 10us * @retval无 * / void Delay_us(__ IO u32 nTime) { TimingDelay = nTime; //使能滴答定时器 SysTick-> CTRL | = SysTick_CTRL_ENABLE_Msk; while(TimingDelay!= 0); } / ** * @brief获取节拍程序 * @param无 * @retval无 * @注意在SysTick中断函数SysTick_Handler()调用 * / void TimingDelay_Decrement(void) { 如果(TimingDelay!= 0x00) { TimingDelay--; } }