使用DMA将内存数据copy带Usart0
1、定义一个welcome的字符串,用dma的将welcome发送到usart的数据寄存器中,这样我们的串口终端里会显示出welcome的字符串。
2、dma的映射关系如图,由于用的是usart0_tx功能,所以对应dam0的chuannel3.
3、usart0数据寄存器的地址为USART0 基地址:0x4001 3800 + offset 0x04
4、增加dma. dma.h文件
dma.c
#include "gd32f30x.h"
#include "main.h"
#include "dma.h"
#define USART0_DATA_ADDRESS ((uint32_t)0x40013804)
#define ARRAYNUM(arr_nanme) (uint32_t)(sizeof(arr_nanme) / sizeof(*(arr_nanme)))
uint8_t welcome[]="hi,this is a example: RAM_TO_USART by DMA !\r\n";
FlagStatus g_transfer_complete = RESET;
void usart_dma_transmit_test(void)
{
dma_parameter_struct dma_init_struct;
/* enable DMA clock */
rcu_periph_clock_enable(RCU_DMA0);
/* initialize DMA channel3 */
dma_deinit(DMA0, DMA_CH3);
dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
dma_init_struct.memory_addr = (uint32_t)welcome;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
dma_init_struct.number = ARRAYNUM(welcome);
dma_init_struct.periph_addr = USART0_DATA_ADDRESS;
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
dma_init(DMA0, DMA_CH3, &dma_init_struct);
/* configure DMA mode */
dma_circulation_disable(DMA0, DMA_CH3);
dma_memory_to_memory_disable(DMA0, DMA_CH3);
/* USART DMA enable for transmission */
usart_dma_transmit_config(USART0, USART_TRANSMIT_DMA_ENABLE);
/* enable DMA transfer complete interrupt */
dma_interrupt_enable(DMA0, DMA_CH3, DMA_INT_FTF);
/* enable DMA channel1 */
dma_channel_enable(DMA0, DMA_CH3);
/* waiting for the transfer to complete*/
while(RESET == g_transfer_complete);
}
dma.h
#ifndef __DMA_H__
#define __DMA_H__
void usart_dma_transmit_test(void);
#endif
5、中断回调函数
#ifdef ENABLE_DMA_TEST
extern FlagStatus g_transfer_complete;
void DMA0_Channel3_IRQHandler(void)
{
if(dma_interrupt_flag_get(DMA0, DMA_CH3, DMA_INT_FLAG_FTF)){
dma_interrupt_flag_clear(DMA0, DMA_CH3, DMA_INT_FLAG_G);
g_transfer_complete = SET;
}
}
#endif //ENABLE_DMA_TEST
6、main.c调用代码
#ifdef ENABLE_DMA_TEST
usart_dma_transmit_test();
delay_1ms(1000);//等待1000ms
#endif // ENABLE_DMA_TEST
7、现象
8、代码路径:https://gitee.com/xiaoguo-tec_0/gd32-iap-code.git