GD32E230串口DMA发送接收

串口使用DMA可以节省MCU运行的时间,节省效率,把单片机内部资源用到最优化。串口DMA就是配置好初始化后,调用串口发送程序时先把要发送的数据保存到DMA缓存,然后使能DMA发送,接下来串口就由硬件自动发送数据,软件可以继续处理其他功能。
串口初始化分一下几个阶段:
·GPIO初始化
·串口初始化
·中断使能初始化
·DMA初始化

void Uart_Init(void){/* initilize the com */    com_gpio_init();    com_usart_init();    /*configure DMA interrupt*/    nvic_config();  TxRx_DMA_Config();}
void com_gpio_init(void) //以串口0为例,gpio为PA9 PA10{rcu_periph_clock_enable(RCU_GPIOA);//使能IO口时钟gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);//配置复用功能gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);/* configure USART Tx as alternate function push-pull */    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_9);   /* configure USART Rx as alternate function push-pull */    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_10);}
void com_usart_init(void)//串口初始化{/* enable USART clock */    rcu_periph_clock_enable(RCU_USART0);//使能串口时钟    /* USART configure */    usart_deinit(USART0);    usart_baudrate_set(USART0, 115200U);    usart_receive_config(USART0, USART_RECEIVE_ENABLE);    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);    usart_enable(USART0);}

void nvic_config(void)
{
nvic_irq_enable(DMA_Channel1_2_IRQn, 0);
}

void TxRx_DMA_Config(void)//DMA发送接收初始化{dma_parameter_struct dma_init_struct;    /* enable DMA clock */    rcu_periph_clock_enable(RCU_DMA); /* initialize DMA channel1 */    dma_deinit(DMA_CH1);    dma_struct_para_init(&dma_init_struct);    dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;    dma_init_struct.memory_addr = (uint32_t)txbuffer;    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;    dma_init_struct.number = TX_BUF_LEN;    dma_init_struct.periph_addr = USART0_TDATA_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(DMA_CH1, &dma_init_struct);    /* initialize DMA channel2 */    dma_deinit(DMA_CH2);    dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;    dma_init_struct.memory_addr = (uint32_t)rxbuffer;    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;    dma_init_struct.number = RX_BUF_LEN;    dma_init_struct.periph_addr = USART0_RDATA_ADDRESS;    dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;    dma_init_struct.memory_width = DMA_PERIPHERAL_WIDTH_8BIT;    dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;    dma_init(DMA_CH2, &dma_init_struct);    /* configure DMA mode */    dma_circulation_disable(DMA_CH1);    dma_memory_to_memory_disable(DMA_CH1);    dma_circulation_disable(DMA_CH2);    dma_memory_to_memory_disable(DMA_CH2);    /* USART DMA enable for reception */    usart_dma_receive_config(USART0, USART_DENR_ENABLE);    /* enable DMA channel2 transfer complete interrupt */    dma_interrupt_enable(DMA_CH2, DMA_INT_FTF);    /* enable DMA channel2 */    dma_channel_enable(DMA_CH2);    /* USART DMA enable for transmission */    usart_dma_transmit_config(USART0, USART_DENT_ENABLE);    /* enable DMA channel1 transfer complete interrupt */    dma_interrupt_enable(DMA_CH1, DMA_INT_FTF);    /* enable DMA channel1 */    dma_channel_enable(DMA_CH1);}```cvoid Use_DMA_SendTX1_Data(uint8_t *buffter, uint8_t writeLen){//串口DMA发送函数,发送数据时调用这个函数,发送完成后会产生一个中断uint8 i;//, Tx_Buf1[64]; dma_parameter_struct dma_init_struct; for (i = 0; i < writeLen; i ++) {  txbuffer[i] = buffter[i]; } dma_channel_disable(DMA_CH1); dma_memory_address_config(DMA_CH1, (uint32)txbuffer);  dma_transfer_number_config(DMA_CH1, (uint32_t)writeLen); /* enable DMA channel1 */  dma_channel_enable(DMA_CH1); /* USART DMA enable for transmission */  usart_dma_transmit_config(USART0, USART_DENT_ENABLE);}
void DMA_Channel1_2_IRQHandler(void)//发送接收通道中断处理{static uint32 Rx_num;    if(RESET != dma_interrupt_flag_get(DMA_CH1, DMA_INT_FLAG_FTF)){        dma_interrupt_flag_clear(DMA_CH1, DMA_INT_FLAG_G);    }    if(RESET != dma_interrupt_flag_get(DMA_CH2, DMA_INT_FLAG_FTF)){    dma_channel_disable(DMA_CH2);        dma_interrupt_flag_clear(DMA_CH2, DMA_INT_FLAG_G);    dma_flag_clear(DMA_CH2, DMA_FLAG_G);    Rx_num = dma_transfer_number_get(DMA_CH2);    dma_transfer_number_config(DMA_CH2,RX_BUF_LEN);    dma_channel_enable(DMA_CH2);    }}

持续更新编码get到的新知识,新技能,持续分享心得体会。

(0)

相关推荐

  • 附源码-终极串口接收(二)

    来源:公众号[鱼鹰谈单片机] 作者:鱼鹰Osprey ID   :emOsprey 前段时间需要写个串口接收程序,一时没找到源码,就想着自己写过一篇文章<终极串口接收方式,极致效率>,看看 ...

  • 干货|手把手教你写单片机的结构体

    摘要:听说还有好多学单片机的小伙伴不会用结构体?指针和结构体是学单片机必须要掌握的,如果你C语言掌握的不牢,单片机根本学不到精髓,只能完成一些低级的项目.看得懂结构体并且能够灵活运用结构体才能说你入门 ...

  • Stm32使用串口空闲中断,基于队列来接收不定长、不定时数据

    串口持续地接收不定长.不定时的数据,把每一帧数据缓存下来且灵活地利用内存空间,下面提供一种方式供参考.原理是利用串口空闲中断和DMA,每当对方发来一帧完整的数据后,串口接收开始空闲,触发中断,在中断处 ...

  • STM32如何高效接收串口数据?

    目录 USART3_DR的地址 DMA的通道 DMA的中断 USART接收回调函数 头文件源码 DMA的基本配置 环形队列接收数据 函数原型 参考用例 总结 硬件:stm32f103cbt6 软件:S ...

  • STM32入坑(12)串口发送字节、半字、字、字符串、数组及实现串口控制

    串口发送字节.半字.字.字符串.数组及实现串口控制 简介 串口的配置 1. 配置usart的TX和RX引脚 2. 配置串口模式 3.配置串口的优先级(使用串口中断时) 4.串口初始化 编写发送函数 发 ...

  • 一文了解串口打印

    之前的文章<STM32 串口详解>介绍了串口驱动,串口在嵌入式领域不仅是一个通讯接口,还是一种调试工具,其好用程度不亚于硬件仿真.有些环境不方便连接Jlink进行硬件仿真,或者并不是必现的 ...

  • 串口发送接收浮点型数据

    转自:https://blog.csdn.net/liangwei88624/article/details/6885803 转自:https://blog.csdn.net/newstoy/arti ...

  • STM32 串口DMA接收 Openmv / K210 整数、小数字符串数据 (基于HAL库)

    目录 前言 一.工程配置 二.串口DMA部分代码 1.源文件UART_DMA.c 2.头文件UART_DMA.h 3.stm32f1xx_it.c的修改 4.串口收发DMA测试 三.字符串数字提取代码 ...

  • STM32串口空闲中断接收不定长数据(DMA方式)

    在使用STM32的串口接收数据的时候,我们常常会使用接收中断的方式来接收数据,常用的是RXNE.这里分享另一种接收数据的方式--IDLE中断(PS:本文的例子运行在STM32F103ZET6上). 一 ...

  • nrf24L01发送接收流程图

    NRF24L01 流程图.引脚定义NYYNN 开始时钟 IC.LCD 液晶.温度传感器初始化nRF24L01配置模式判断键盘是否有动作数据采集和显示将采集到的数据装入发射寄存器启动发射发射是否完成按键 ...

  • NRF24L01——工作原理(关于发送接收通道地址)解读

    转载自:NRF24L01--工作原理解读 1.一个发送通道,6个接收通道.发送端发送通道地址寄存器中的地址指向的就是接收端哪个接收通道接收发送端的数据,所以发送端地址寄存器的值要与接收端需要接受数据的 ...

  • 关于串口上电发送0x00的解决方法

    我今天运行公司主板上的程序时发现它的串口总是在板子刚上电的时候向外发送0x00. 主板上的芯片是avr的at90usb1287. 我前几天写的串口程序烧到主板上却没有这个问题. 同样的板子,同样的串口 ...

  • 单片机中串口如何发送超过8位的数据

    原文中有点小错误,做了小更改. 在做下位机通信时往往会用到串口,包括下位机将数据传输给上位机,或者是下位机与下位机之间进行数据传输,这时候就会遇到发送数据的问题,单片机通过串口发送数据时往往是一次一个 ...

  • 如何将硬件的串口数据发送到EXCEL表格里

    经过好长时间的钻研和摸索,终于成功地将硬件的串口数据发送到了Excel表格里.下面详细讲解将硬件串口数据发送到Excel里的方法. 首先,打开Excel代码编辑器,添加窗体,插入串口控件. 接着,编写 ...

  • STM32使用DMA接收串口数据

    STM32使用DMA接收串口数据