这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» STM32» 用ARM芯片内部的SysTick计算器实现延时的具体方法

共9条 1/1 1 跳转至

用ARM芯片内部的SysTick计算器实现延时的具体方法

工程师
2020-11-23 20:49:22 打赏

用ARM的SysTick计算器实现延时的具体方法


一、概述:

SysTick是一个简单的递减24位计数器 如果你不需要再应用程序中嵌入操作系统,SysTick可以作为简单的延时和产生周期性的中断; 状态控制寄存器的第0位可以使能计数器,current value register(当前值寄存器)随着时钟一直递减,当他减到0的时候,重装载寄存器(reload value register)就会重新装载这只的值,计数器继续从这个值递减

二、相关寄存器:

2.1 SysTick->CTRL 状态和控制寄存器 位16:当前值寄存器递减到0,位16置1 位2:时钟源选择位 0:使用外部参考时钟 1:使用内核时钟 位1:使能SysTick中断,当前值寄存器递减到0时产生中断 位0:SysTick时钟使能

2.2 SysTick->LOAD 重装载值寄存器

当前值寄存器为0时,自动将重装载值重装到当前值计数器,重装载值的大小需要自己设置 2.3SysTick->VAL当前值寄存器 可读可写,当计数器使能时,这个寄存器的值开始递减,使用前后注意清零 三、SysTick逻辑图


四、时钟频率与延时 4.2时钟选择 采用参考8分频的参考时钟(168M / 8 = 21M)比较准,所以此处SysTick计数器选择21M的时钟 4.2如何延时1us 时钟频率为21M,也就是1s的时间技术21M次。 由此可知计数一次用了 (1/21000000) s ,用了(1/21000) ms, 用了(1/21) us 所以,1us计数21次。 4.3如何延时1ms 因为1ms = 1000us,所以综上所述,1ms计数1000*21次计数,1ms也就是21000次计数 4.3最大延时 24位计数器能保存的最大值 : 16777215。 最大延时时间 =:16777215 / 21 = 798915 us = 798.915ms 五、编程思路 5.1Delay初始化 选择时钟源 关闭计数器 5.2延时函数 设置重装载值 当前值清零 使能SysTick 等待计数器计数完毕 当前值清零

关闭计数器


六、示例代码 #include "delay.h" #define Value_us 21 #define Value_ms 21000 void delay_init(void) { SysTick->CTRL &= (1 << 2); //控制寄存器位2置0,选择8分频时钟 SysTick->CTRL &= ~(1 << 0); //关闭计数器 } void delay_us(u32 num) { SysTick->LOAD = num * Value_us; SysTick->VAL = 0; SysTick->CTRL |= (1 << 0); //使能计数器 while (!(SysTick->CTRL & 1<<16)); //判断是否计数完毕 SysTick->VAL = 0; SysTick->CTRL &= ~(1 << 0); //关闭计数器 } void delay_ms(u32 num) { SysTick->LOAD = num * Value_ms; SysTick->VAL = 0; SysTick->CTRL |= (1 << 0); //使能计数器 while (!(SysTick->CTRL & 1<<16)); SysTick->VAL = 0; SysTick->CTRL &= ~(1 << 0); //关闭计数器

}


更多详细资料,请坛友们参考《Cortex M3M4权威指南》。






关键词: SysTick 计算器 延时 delay

工程师
2020-11-23 21:15:36 打赏
2楼

用来专用定时delay 不错!


工程师
2020-11-23 21:17:16 打赏
3楼

SysTick这个部件,每个ARM型号都是标配! 我经常用来定时~


工程师
2020-11-23 21:26:55 打赏
4楼

学到了


工程师
2020-11-23 21:50:17 打赏
5楼

学到了


高工
2021-04-05 09:34:32 打赏
6楼

值得借鉴,感谢分享!


工程师
2021-04-05 22:35:23 打赏
7楼

方法总结的蛮不错的


菜鸟
2021-04-06 09:02:04 打赏
8楼

如果你试用CUBE-IDE HAL库,任何设置都不做的情况下,

HAL_Delay(n)就实现精确n ms,试用非常方便。


高工
2021-04-07 11:19:34 打赏
9楼

有相对应的例子程序吗,有就更好了


共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]