GD32F4使用定时器溢出作为DMA触发源
时间: 2023-07-29 11:14:40 浏览: 209
在GD32F4微控制器中,可以使用定时器的溢出事件作为DMA传输的触发源。具体步骤如下:
1. 配置定时器的基本参数,包括时钟来源、预分频系数、计数器周期等。
2. 配置DMA通道的基本参数,包括数据传输方向、传输数据宽度、传输缓冲区地址等。
3. 开启定时器的溢出中断,并在中断处理函数中启动DMA传输。
4. 在DMA传输完成后,清除对应的标志位,并关闭DMA通道。
下面是一个简单的示例代码,以TIM2和DMA1_Channel6为例:
```c
#include "gd32f4xx.h"
void timer_config(void)
{
timer_parameter_struct timer_initpara;
rcu_periph_clock_enable(RCU_TIMER2);
timer_deinit(TIMER2);
timer_struct_para_init(&timer_initpara);
timer_initpara.prescaler = 7199;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = 999;
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_init(TIMER2, &timer_initpara);
timer_interrupt_enable(TIMER2, TIMER_INT_UP);
}
void dma_config(void)
{
dma_parameter_struct dma_initpara;
rcu_periph_clock_enable(RCU_DMA1);
dma_deinit(DMA1, DMA_CH6);
dma_struct_para_init(&dma_initpara);
dma_initpara.direction = DMA_MEMORY_TO_PERIPHERAL;
dma_initpara.memory_addr = (uint32_t)tx_buffer;
dma_initpara.memory_inc = DMA_MEMORY_INC_BYTE;
dma_initpara.memory_width = DMA_MEMORY_WIDTH_8BIT;
dma_initpara.periph_addr = (uint32_t)&USART_DATA(USART0);
dma_initpara.periph_inc = DMA_PERIPH_INC_NONE;
dma_initpara.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
dma_initpara.number = 10; // 传输10个字节
dma_initpara.priority = DMA_PRIORITY_ULTRA_HIGH;
dma_init(DMA1, DMA_CH6, &dma_initpara);
dma_circulation_enable(DMA1, DMA_CH6);
dma_channel_enable(DMA1, DMA_CH6);
}
void TIMER2_IRQHandler(void)
{
if(timer_interrupt_flag_get(TIMER2, TIMER_INT_UP) == SET){
timer_interrupt_flag_clear(TIMER2, TIMER_INT_UP);
dma_channel_enable(DMA1, DMA_CH6);
}
}
int main(void)
{
timer_config();
dma_config();
while(1);
}
```
在上面的代码中,定时器TIM2的时钟来源为72MHz,预分频系数为7199,计数器周期为999,因此定时器的计数频率为10kHz。在定时器的溢出中断中,启动DMA传输,并将DMA通道设置为循环模式。在主函数中,开启定时器和DMA通道,并进入死循环等待。需要注意的是,由于DMA传输是循环模式,因此需要在适当的时候手动停止DMA通道。
阅读全文