如何在自由运行模式下启用 Teensy 4.x GPT 定时器

在此示例中,我们将使用直接寄存器访问以 8 MHz 计数频率在自由运行模式下启用 GPT1 定时器模块。自由运行模式意味着定时器在达到 0xFFFFFFFF(最大 32 位值)后会回绕。

如何配置定时器

gpt1_config.cpp
CCM_CCGR1 |= CCM_CCGR1_GPT1_BUS(CCM_CCGR_ON); // 向 GPT1 模块启用时钟
GPT1_CR = 0; // 禁用以进行配置
GPT1_PR = 3 - 1; // 将 24 MHz 时钟预分频 3 => 8 MHz
GPT1_CR = GPT_CR_EN /* 启用定时器 */
    | GPT_CR_CLKSRC(1) /* 24 MHz 外设时钟作为时钟源 */
    | GPT_CR_FRR /* 自由运行,不重置 */

完整示例

此示例在 PlatformIO 中无需任何外部库即可工作,但你需要在 platformio.ini 中设置 monitor_speed = 115200 以便以正确速度读取串口。

teensy_gpt1_example.ino
#include <Arduino.h>

void setup()
{
    // 设置 USB 串口以便我们可以打印定时器值
    Serial.begin(115200);

    // 启用定时器
    CCM_CCGR1 |= CCM_CCGR1_GPT1_BUS(CCM_CCGR_ON); // 向 GPT1 模块启用时钟
    GPT1_CR = 0; // 禁用以进行配置
    GPT1_PR = 3 - 1; // 将 24 MHz 时钟预分频 3 => 8 MHz
    GPT1_CR = GPT_CR_EN /* 启用定时器 */
      | GPT_CR_CLKSRC(1) /* 24 MHz 外设时钟作为时钟源 */
      | GPT_CR_FRR /* 自由运行,不重置 */
}

void loop()
{
    // 每 ~100 毫秒打印定时器计数
    Serial.println(GPT1_CNT);
    delay(100);
}

Check out similar posts by category: Electronics, Embedded, Teensy