打印
[应用相关]

实现STM32软件精确时间的方法

[复制链接]
339|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
药无尘|  楼主 | 2022-7-28 15:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在进行开发时,程序中常常需要延时一段时间,很多人都会使用Delay(N), N为需要延时的时间(通常为毫秒级)。通常实现Delay(N)函数的方法为:

for(i = 0; i <= x; i ++);//x --- 对应于N毫秒的循环

对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行for循环时,要实现N毫秒的x值非常大,而且由于系统频率的宽广,很难计算出延时N毫秒的精确值。

针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)。


使用特权

评论回复
沙发
药无尘|  楼主 | 2022-7-28 15:58 | 只看该作者
解决方法

Cortex-M3的内核中包含一个SysTick时钟。SysTick为一个24位递减计数器, SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。
计数到0时,SysTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(如果中断使能)。
在STM32的应用中,使用Cortex-M3内核的SysTick作为定时时钟,设定每一毫秒产生一次中断,在中断处理函数里对N减一,在Delay(N)函数中循环检测N是否为0,不为0则进行循环等待;若为0则关闭SysTick时钟,退出函数。

这样的好处就是:延迟时间将不随系统时钟频率改变。

使用特权

评论回复
板凳
药无尘|  楼主 | 2022-7-28 16:00 | 只看该作者
源代码
初始化相关模块 :
SysTick_SetReload(9000); // 设定SysTick达到1ms计数结束
SysTick_ITConfig(ENABLE); // 使能SysTick中断

说明:外部晶振为8MHz,系统时钟为72MHz, SysTick的频率9MHz,SysTick产生1ms的中断
中断处理 :
void SysTickHandler (void)
{
  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }
}

注意:全局变量TimingDelay必须定义为volatile。

延时代码:
void Delay(u32 nTime) 
{
  SysTick_CounterCmd(SysTick_Counter_Enable); // 使能SysTick计数器
  TimingDelay = nTime; // 读取延时时间
  while(TimingDelay != 0); // 判断延时是否结束
  SysTick_CounterCmd(SysTick_Counter_Disable); // 关闭SysTick计数器
  SysTick_CounterCmd(SysTick_Counter_Clear); // 清除SysTick计数器
}

应用代码
Delay(300); // 延时 300ms

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

623

帖子

3

粉丝