9.3. 定时器触发请求DMA传输

9.3.1. 概述

  • 本示例工程展示了使用定时器事件触发请求DMA传输。

  • DMA传输的设备地址是板载的LED的GPIO口的TOGGLE寄存器。当发生对应定时器事件,对应的LED会翻转电平进行闪烁。

9.3.2. 硬件设置

请参考具体开发板 引脚描述 部分的描述。 - 使用串口调试助手进行输入定时器请求配置。

  • 请求配置为输入捕获翻转时,需要连接外部PWM至GPTMR输入捕获引脚。

  • 串口波特率设置为 115200bps1个停止位无奇偶校验位

9.3.3. 注意

  • 当使用input_signal_toggle事件触发时,所使用的PWM输入建议在30Hz以内,以便可观察LED闪烁情况,若高于30Hz输入请使用示波器查看对应的LED GPIO引脚变化

9.3.4. GPTMR V2 注意事项

GPTMR V2 相比 V1 增加了 prescaler 预分频器字段,可通过宏 APP_GPTMR_TARGET_FREQ 配置目标计数器时钟频率:

#ifdef HPMSOC_HAS_HPMSDK_GPTMRV2
config.prescaler = gptmr_freq / APP_GPTMR_TARGET_FREQ;
reload_ticks = ((uint64_t)APP_BOARD_RELOAD_MS * gptmr_freq) / ((uint64_t)config.prescaler * 1000);
cmp_ticks = ((uint64_t)APP_BOARD_CMP_MS * gptmr_freq) / ((uint64_t)config.prescaler * 1000);
#endif
  • 预分频器公式:计数器时钟 = 源时钟 / prescaler

  • V2 的 reload/cmp 寄存器为 24-bit(最大 16,777,215),V1 为 32-bit

  • APP_BOARD_RELOAD_MSAPP_BOARD_CMP_MS 分别控制定时器重载周期和比较周期,默认值分别为 500ms 和 100ms

9.3.4.1. input_signal_toggle 输入频率范围

当选择 gptmr_dma_request_on_input_signal_toggle``(菜单项2)时,GPTMR 工作于 ``gptmr_work_mode_capture_at_both_edge 双边沿捕获模式, 输入 PWM 频率的可测范围受计数器位宽和 prescaler 共同影响:

  • GPTMR V2 计数器为 24-bit,最大计数值 16,777,215;V1 为 32-bit

  • 输入信号周期 = 相邻同向边沿之间的 tick 差值 × 每tick时间

输入频率范围估算(假设源时钟 100MHz):

APP_GPTMR_TARGET_FREQ

prescaler

每tick时间

最高可测频率

最低可测频率

100KHz (默认)

1000

10 µs

~50KHz

~0.006 Hz

1MHz

100

1 µs

~500KHz

~0.06 Hz

10MHz

10

100 ns

~5MHz

~0.6 Hz

100MHz (prescaler=1)

1

10 ns

~50MHz

~6 Hz

Note

  • 为便于肉眼观察 LED 闪烁,输入 PWM 建议在 30Hz 以内;高于 30Hz 请使用示波器查看 GPIO 引脚变化

  • APP_GPTMR_TARGET_FREQ 影响输入捕获分辨率和可测频率范围,请根据实际输入信号频率选择合适的值

9.3.5. 运行现象

  • 使用串口调试助手,敲击enter按键会打印提示,根据提示选择对应的事件触发,板载的LED会进行不同频率的闪烁。

  • demo菜单中0、1、3如果若需要改变LED的闪烁频率,可以改变代码中的缺省宏APP_BOARD_RELOAD_MS和APP_BOARD_CMP_MS,缺省下分别为500ms和100ms。2的LED闪烁效果由GPTMR的输入捕获引脚的输入PWM决定。

  • 信息如下:

-----------------------------------------------------------------------------------
*                                                                                 *
*                   trigger dma transfer using gptmr event demo                   *
*                                                                                 *
*        0. use gptmr cmp0 event                                                  *
*        1. use gptmr cmp1 event                                                  *
*        2. use gptmr input_signal_toggle event                                   *
*        3. use gptmr reload event                                                *
*                                                                                 *
*---------------------------------------------------------------------------------*