GD32F450配置定时器作为DMA触发源
时间: 2023-07-18 22:05:51 浏览: 159
STM32之ADC+DMA传输(定时器触发)
4星 · 用户满意度95%
GD32F450是一款基于ARM Cortex-M4内核的微控制器,其使用的是GD32F4xx系列的芯片。要配置定时器作为DMA触发源,可以按照以下步骤进行:
1. 选择一个DMA通道,例如DMA通道0。
2. 配置DMA通道的传输方向、数据宽度、传输大小和传输模式等参数。
3. 配置定时器的基本定时器模式或高级定时器模式,例如基本定时器TIM6。
4. 配置定时器的自动重载值和预分频值,以及使能定时器中断。
5. 配置定时器的DMA请求,将其设置为触发DMA通道0的触发源。
6. 在DMA中断服务程序中处理DMA传输完成的事件。
以下是一个简单的示例代码,演示如何将TIM6配置为DMA触发源,触发DMA通道0进行传输:
```
/* 配置DMA通道0 */
dma_parameter_struct dma_init_struct;
dma_deinit(DMA_CH0);
dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
dma_init_struct.memory_addr = (uint32_t)src_buf;
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.periph_addr = (uint32_t)&(USART_DATA(USART1));
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.number = data_size;
dma_init_struct.priority = DMA_PRIORITY_HIGH;
dma_init(DMA_CH0, dma_init_struct);
/* 配置定时器TIM6 */
rcu_periph_clock_enable(RCU_TIMER6);
timer_deinit(TIMER6);
timer_parameter_struct timer_init_struct;
timer_init_struct.prescaler = 7199;
timer_init_struct.alignedmode = TIMER_COUNTER_EDGE;
timer_init_struct.counterdirection = TIMER_COUNTER_UP;
timer_init_struct.period = 999;
timer_init_struct.clockdivision = TIMER_CKDIV_DIV1;
timer_init_struct.repetitioncounter = 0;
timer_init(TIMER6, &timer_init_struct);
/* 配置定时器TIM6的DMA触发 */
timer_dma_transfer_config(TIMER6, TIMER_DMACFG_DMATA_USART1_TRANSMIT, TIMER_DMACFG_DMAT | TIMER_DMACFG_DMATP_0);
/* 使能定时器TIM6中断 */
nvic_irq_enable(TIMER6_IRQn, 0, 0);
/* 启动定时器TIM6 */
timer_enable(TIMER6);
/* 启动DMA传输 */
dma_channel_enable(DMA_CH0);
```
在上述代码中,src_buf是存放数据的缓冲区,data_size是数据的大小,USART1表示使用的串口。注意,在使用基本定时器模式时,需要使用timer_dma_transfer_config函数将定时器配置为DMA触发源。
阅读全文