延迟机制如何在嵌入式EFM32中工作

时间:2020-09-02 16:24:43

标签: c arm embedded cortex-m

我看不到下面的代码如何延迟? 我们有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) ;
 }


}

2 个答案:

答案 0 :(得分: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) < dlyTicksfalse毫秒后变为dlyTicks(实际上可能是-减少1毫秒,因为msTicks异步增加到任何Delay()调用。)

答案 1 :(得分:0)

SysTick System Timer 的简称。这是一个计时器,会产生周期性中断。如果发生中断,将调用SysTick_Handler。将变量msTicks的值增加1。由于定时器配置为每毫秒中断一次(稍后会详细介绍),因此msTicks代表自微控制器启动以来的毫秒数。

DelaymsTicks的当前值并循环(等待),直到达到初始值加dlyTicks为止。函数中的数学运算可能看起来很奇怪。但这是实现溢出安全的正确方法。

SysTick_Config配置触发系统计时器中断的频率。此功能将时钟周期数作为中断之间的时间间隔。要使周期为1ms,必须将CPU内核时钟频率(CMU_ClockFreqGet(cmuClock_CORE))除以1000。

相关问题