如何解决延迟机制如何在嵌入式EFM32中工作
我看不到下面的代码如何延迟? 我们有SysTick迭代,我不知道这意味着什么。 SysTick_Config(CMU_ClockFreqGet(cmuClock_CORE)是什么意思? 谢谢。
#include <stdint.h>
#include <stdbool.h>
#include "em_device.h"
#include "em_chip.h"
#include "em_cmu.h"
#include "em_emu.h"
#include "bsp.h"
#include "bsp_trace.h"
void SysTick_Handler(void)
{
msTicks++; /* increment counter necessary in Delay()*/
}
void Delay(uint32_t dlyTicks)
{
uint32_t curTicks;
curTicks = msTicks;
while ((msTicks - curTicks) < dlyTicks) ;
}
int main(void)
{
/* Chip errata */
CHIP_Init();
CMU_ClockEnable(cmuClock_GPIO,true);
/* Setup SysTick Timer for 1 msec interrupts */
if (SysTick_Config(CMU_ClockFreqGet(cmuClock_CORE) / 1000)) {
while (1) ;
}
}
解决方法
EFM32是基于ARM Cortex-M的设备,具有称为SYSTICK的硬件计时器/计数器。 SYSTICK以与处理器的核心时钟频率相关的速率递增,在这种情况下,CMU_ClockFreqGet(cmuClock_CORE)
返回每秒计数的频率。
可以设置SYSTICK的重载值,此处由SysTick_Config()
完成。当计数达到零时,将产生一个中断并重新加载计数器。通过将计数设置为SYSTICK频率除以1000,您将每隔一毫秒收到一次中断。
一个中断导致一个关联的处理程序被异步调用到正常的代码流(在这种情况下,while循环在main中)。因此,这里SysTick_Handler()
每1毫秒被调用一次,递增msTicks
(经过的毫秒数)。
Delay()
函数轮询msTicks
,直到dlyTicks
为止。 curTicks
是延迟开始时msTicks
值的快照,因此表达式(msTicks - curTicks) < dlyTicks
在false
毫秒后变为dlyTicks
(实际上可能是-减少1毫秒,因为msTicks
异步增加到任何Delay()
调用。)
SysTick 是 System Timer 的简称。这是一个计时器,会产生周期性中断。如果发生中断,将调用SysTick_Handler
。将变量msTicks
的值增加1。由于定时器配置为每毫秒中断一次(稍后会详细介绍),因此msTicks
代表自微控制器启动以来的毫秒数。
Delay
取msTicks
的当前值并循环(等待),直到达到初始值加dlyTicks
为止。函数中的数学运算可能看起来很奇怪。但这是实现溢出安全的正确方法。
SysTick_Config
配置触发系统计时器中断的频率。此功能将时钟周期数作为中断之间的时间间隔。要使周期为1ms,必须将CPU内核时钟频率(CMU_ClockFreqGet(cmuClock_CORE)
)除以1000。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。