#include"stdio.h"
#include"gd32f30x.h"
#include"keydiver.h"
unsigned char data0[10]={1,2,3,4,5,6,7,8,9,0};
unsigned char data1[10]={0};
volatile int dmasending=0;
dma_parameter_struct dmatxcfg;
dma_parameter_struct dmacfg;
unsigned char* pdata=0;
unsigned char data2[10]={0};
void DMA0_Channel3_IRQHandler()
{
if(dma_interrupt_flag_get(DMA0,DMA_CH3,DMA_INT_FLAG_FTF)){
dma_interrupt_flag_clear(DMA0,DMA_CH3,DMA_INT_FLAG_FTF);
dmasending=0;
}
}
void usartdmasend(unsigned char *pdata,int nlen)
{
while(dmasending);
dmasending=1;
dma_channel_disable(DMA0,DMA_CH3);
dmatxcfg.memory_addr=(uint32_t)pdata;
dmatxcfg.number=nlen;
dma_init(DMA0,DMA_CH3,&dmatxcfg);
dma_channel_enable(DMA0,DMA_CH3);
}
void usartdma()
{
rcu_periph_clock_enable(RCU_AF);
rcu_periph_clock_enable(RCU_GPIOA);
gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_10MHZ,GPIO_PIN_9);
rcu_periph_clock_enable(RCU_USART0);
usart_deinit(USART0);
usart_baudrate_set(USART0,115200);
usart_parity_config(USART0,USART_PM_NONE);
usart_word_length_set(USART0,USART_WL_8BIT);
usart_stop_bit_set(USART0,USART_STB_1BIT);
usart_transmit_config(USART0,USART_TRANSMIT_ENABLE);
usart_dma_transmit_config(USART0,USART_DENT_ENABLE);
usart_enable(USART0);
rcu_periph_clock_enable(RCU_DMA0);
dma_deinit(RCU_DMA0,DMA_CH3);
dmatxcfg.periph_addr =USART0+0x04;//shift addrss (uint32_t)
dmatxcfg.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
dmatxcfg.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
//dmatxcfg.memory_addr = (uint32_t)data1;
dmatxcfg.memory_width = DMA_MEMORY_WIDTH_8BIT;
dmatxcfg.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
//dmatxcfg.number = 10U;
dmatxcfg.direction = DMA_MEMORY_TO_PERIPHERAL;
dmatxcfg.priority = DMA_PRIORITY_LOW;
dma_interrupt_enable(DMA0,DMA_CH3,DMA_INT_FTF);
nvic_irq_enable(DMA0_Channel3_IRQn,2,2);
dma_init(DMA0,DMA_CH3,&dmatxcfg);
}
int main()
{
usartdma();
while(1){ usartdmasend((unsigned char*)123,3);
}
}
因为usart0的发送对应dma0的channel3,所以配置dma0的通道3,usart0的发送对应pa9,所以要打开pa9端口,之后配置波特率,校验位,停止位,字长,串口dma发送,配置dma中断,中断优先级,然后编写发送函数,一但进入函数那么sending置为1,先失能通道之后,内存地址改为pdata,这样就可以将pdata里的值发送出去,等到发送完成后进入中断标志,将sending置为0,这样dma就可以继续发送啦。