GD32F450配置定时器溢出作为DMA触发源
时间: 2023-07-18 09:06:54 浏览: 161
配置定时器溢出作为DMA触发源,可以使用以下步骤:
1. 配置定时器的基本参数,包括时钟源、时钟分频、计数器周期等。
2. 配置DMA控制器,包括数据传输方向、数据宽度、传输数量等。
3. 配置DMA触发源为定时器溢出事件。
4. 启动定时器和DMA传输。
以下是针对GD32F450的示例代码:
```c
/* 定义DMA传输缓冲区 */
uint32_t dma_buffer[10];
/* 配置定时器 */
rcu_periph_clock_enable(RCU_TIMER0);
timer_deinit(TIMER0);
timer_parameter_struct timerinitpara;
timer_struct_para_init(&timerinitpara);
timerinitpara.prescaler = 107;
timerinitpara.alignedmode = TIMER_COUNTER_EDGE;
timerinitpara.counterdirection = TIMER_COUNTER_UP;
timerinitpara.period = 999;
timer_init(TIMER0, &timerinitpara);
/* 配置DMA */
dma_parameter_struct dma_init_struct;
dma_struct_para_init(&dma_init_struct);
dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
dma_init_struct.memory_addr = (uint32_t)dma_buffer;
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_32BIT;
dma_init_struct.number = 10;
dma_init_struct.periph_addr = (uint32_t)&TIMER0->CTL0;
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_32BIT;
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
dma_init(DMA0, DMA_CH1, &dma_init_struct);
/* 配置DMA触发源为定时器溢出事件 */
dma_circulation_enable(DMA0, DMA_CH1);
dma_channel_select(DMA0, DMA_CH1, DMA_REQUEST_TIMER0_UPD);
/* 启动定时器和DMA传输 */
timer_enable(TIMER0);
dma_channel_enable(DMA0, DMA_CH1);
```
在以上代码中,我们首先配置了计数器时钟源和分频系数,并设置了计数器周期为1000。然后,我们配置了DMA控制器,将数据从内存传输到定时器寄存器中。接着,我们使用了`dma_channel_select()`函数将DMA触发源设置为定时器0的更新事件,并通过`dma_circulation_enable()`函数开启了循环传输模式。最后,我们启动了定时器和DMA传输。
此外,还需要注意,在DMA传输过程中,数据传输方向、数据宽度和传输数量等参数要与DMA控制器和定时器寄存器的配置相匹配,否则可能会导致数据传输错误。
阅读全文