GD32F4不使用中断的情况下,配置定时器输入捕获到上升沿触发DMA请求
时间: 2023-12-03 12:02:40 浏览: 57
要实现定时器输入捕获到上升沿触发DMA请求,需要按照以下步骤进行配置:
1. 配置定时器的输入捕获模式,使其在捕获到上升沿时产生捕获事件。
2. 配置DMA通道,设置DMA传输方向和传输数据长度,并使能DMA请求。
3. 将DMA通道与定时器的捕获事件关联起来,使得当定时器捕获到上升沿时,会触发DMA传输请求。
下面是一个示例代码,它演示了如何使用定时器2和DMA1通道2进行配置。
```c
#include "gd32f4xx.h"
void timer_capture_init(void)
{
/* 使能定时器2时钟 */
rcu_periph_clock_enable(RCU_TIMER2);
/* 配置定时器2为输入捕获模式,捕获上升沿 */
timer_ic_parameter_struct timer_icinitpara;
timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
timer_icinitpara.icfilter = 0x00;
timer_input_capture_config(TIMER2, TIMER_CH_0, &timer_icinitpara);
/* 配置DMA1通道2 */
dma_parameter_struct dma_init_struct;
dma_deinit(DMA1, DMA_CH2);
dma_struct_para_init(&dma_init_struct);
dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
dma_init_struct.memory_addr = (uint32_t)&capture_value;
dma_init_struct.memory_inc = DMA_MEMORY_INC_ENABLE;
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;
dma_init_struct.periph_addr = (uint32_t)&TIMER2_RCR;
dma_init_struct.periph_inc = DMA_PERIPH_INC_DISABLE;
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
dma_init_struct.number = 1;
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
dma_init(DMA1, DMA_CH2, &dma_init_struct);
/* 将DMA通道2与定时器2的捕获事件关联起来 */
timer_dma_transfer_config(TIMER2, TIMER_CH_0, TIMER_DMATA_TRANSFER_CCR, DMA_CH2);
/* 使能DMA传输请求 */
dma_channel_enable(DMA1, DMA_CH2);
/* 使能定时器2 */
timer_enable(TIMER2);
}
```
在上面的代码中,我们首先使用`rcu_periph_clock_enable`函数使能了定时器2的时钟。然后,我们配置了定时器2的输入捕获模式,将其设置为捕获上升沿。接着,我们配置了DMA1通道2,并将其与定时器2的捕获事件关联起来。最后,我们使能了DMA传输请求和定时器2。
在以上步骤完成后,当定时器2捕获到上升沿时,就会触发DMA传输请求,DMA会将定时器2的捕获寄存器的值传输到指定的内存地址中。