gpt4 book ai didi

c - 了解定时器和中断周期

转载 作者:行者123 更新时间:2023-11-30 14:28:00 25 4
gpt4 key购买 nike

我很难理解一些在我拥有的 ARM 板上使用定时器和中断的代码。定时器基本上会在每次中断之间切换 LED 的开和关,使其闪烁。

void main(void) {

/* Pin direction */
led_init();

/* timer setup */
/* CTRL */

#define COUNT_MODE 1 /* Use rising edge of primary source */
#define PRIME_SRC 0xf /* Peripheral clock with 128 prescale (for 24 MHz = 187500 Hz)*/
#define SEC_SRC 0 /* Don't need this */
#define ONCE 0 /* Keep counting */
#define LEN 1 /* Count until compare then reload with value in LOAD */
#define DIR 0 /* Count up */
#define CO_INIT 0 /* Other counters cannot force a re-initialization of this counter */
#define OUT_MODE 0 /* OFLAG is asserted while counter is active */

*TMR_ENBL = 0; /* TMRS reset to enabled */
*TMR0_SCTRL = 0;
*TMR0_CSCTRL = 0x0040;
*TMR0_LOAD = 0; /* Reload to zero */
*TMR0_COMP_UP = 18750; /* Trigger a reload at the end */
*TMR0_CMPLD1 = 18750; /* Compare one triggered reload level, 10 Hz maybe? */
*TMR0_CNTR = 0; /* Reset count register */
*TMR0_CTRL = (COUNT_MODE<<13) |
(PRIME_SRC<<9) |
(SEC_SRC<<7) |
(ONCE<<6) |
(LEN<<5) |
(DIR<<4) |
(CO_INIT<<3) |
(OUT_MODE);
*TMR_ENBL = 0xf; /* Enable all the timers --- why not? */

led_on();

enable_irq(TMR);

while(1) {
/* Sit here and let the interrupts do the work */
continue;
};
}

现在,LED 每秒闪烁的速度我无法确定。我希望它每秒闪烁一次。但是,我不明白整个比较和重新加载。

有人可以更好地解释这段代码吗?

最佳答案

由于计时器是供应商和部件特定的功能(不是 ARM 架构的一部分),因此我只能提供一般指导,除非您提及您正在处理哪个 CPU 或微 Controller 。

定时器有几个特点:

  1. 大小,例如 16 位,这意味着它们可以向上或向下计数到 65535。
  2. 一个时钟输入,以时钟频率(可能来自 CPU 时钟或外部晶体)的形式给出,以及一个将该时钟频率除以另一个值(或除以 1)的预分频器。
  3. 溢出中断 - 当计时器回滚到 0 时,通常可以选择触发中断。
  4. 比较中断 - 当计时器达到设定值时,它将发出中断。

就您而言,我可以看到您正在使用计时器的比较功能。通过确定定时器时钟输入并计算预分频器和比较寄存器的新值,您应该能够实现 1 Hz 的速率。

关于c - 了解定时器和中断周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7006649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com