GD32F103使用串口DMA收发信息(无中断)

文章目录

  • GD32F103使用串口DMA收发信息(无中断)
  • 前言
  • 一、GPIO+USART1+DMA基本设置
  • 二、处理收到的数据RX
  • 二、处理发送的数据TX
  • 总结

前言

对于信息无实时性响应,采用DMA模式对串口数据进行处理。这里没有用到收发中断。在收数据过程中,我们要保证读取数据的速率,否则,收到的数据还没读到,就有被后面的数据覆盖了。


一、GPIO+USART1+DMA基本设置

具体的usart1连接到哪个DMA,哪个ch,需要看user_manual手册---- DMA request mapping

void com_init(uint32_t com)
{uint32_t com_id = 0U;if(EVAL_COM0 == com){com_id = 0U;}else if(EVAL_COM1 == com){com_id = 1U;}/* enable GPIO clock */rcu_periph_clock_enable(COM_GPIO_CLK[com_id]);/* enable USART clock */rcu_periph_clock_enable(COM_CLK[com_id]);/* connect port to USARTx_Tx */gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, COM_TX_PIN[com_id]);/* connect port to USARTx_Rx */gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, COM_RX_PIN[com_id]);/* USART configure */usart_deinit(com);usart_baudrate_set(com, 115200U);usart_word_length_set(com, USART_WL_8BIT);usart_stop_bit_set(com, USART_STB_1BIT);usart_parity_config(com, USART_PM_NONE);usart_hardware_flow_rts_config(com, USART_RTS_DISABLE);usart_hardware_flow_cts_config(com, USART_CTS_DISABLE);usart_receive_config(com, USART_RECEIVE_ENABLE);usart_transmit_config(com, USART_TRANSMIT_ENABLE);usart_enable(com);
}void usart_dma_config(void)
{dma_parameter_struct dma_init_struct;/* enable DMA0 */rcu_periph_clock_enable(RCU_DMA0);/* initialize USART */com_init(EVAL_COM1);/* deinitialize DMA channel6(USART1 tx) */dma_deinit(DMA0, DMA_CH6);dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;dma_init_struct.memory_addr = (uint32_t)uart_data[1].DMA_TxBuf;//这个是DMA的数要存到哪个数组里,可根据自己需求替换dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;dma_init_struct.number = USART_TX_BUF_SIZE;//这个是数组的大小,可更改dma_init_struct.periph_addr = USART1_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_CH6, &dma_init_struct);/* configure DMA mode */dma_circulation_disable(DMA0, DMA_CH6);//将TX的DMA 循环发送disable,是因为我们需要自己控制如何发送数据。/* enable DMA channel3 */dma_channel_enable(DMA0, DMA_CH6);/* USART DMA enable for transmission and reception */usart_dma_transmit_config(USART1, USART_DENT_ENABLE);usart_dma_receive_config(USART1, USART_DENR_ENABLE);/* wait DMA Channel transfer complete */
//    while(RESET == dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_FTF));/* deinitialize DMA channel5 (USART1 rx) */dma_deinit(DMA0, DMA_CH5);dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;dma_init_struct.memory_addr = (uint32_t)uart_data[1].DMA_RxBuf;//这个是DMA的数要存到哪个数组里,可根据自己需求替换dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;dma_init_struct.number = USART_RX_BUF_SIZE;//自己换dma_init_struct.periph_addr = USART1_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_CH5, &dma_init_struct);/* configure DMA mode */dma_circulation_enable(DMA0, DMA_CH5);//将RX的循环接收开启,是因为我们不希望漏过所有的数据,当然这个前提是,你要及时处理DMA数组里面的数据/* enable DMA channel4 */dma_channel_enable(DMA0, DMA_CH5);/* wait DMA channel transfer complete */
//        while(RESET == dma_flag_get(DMA0, DMA_CH5, DMA_FLAG_FTF));      }

通过以上的设置,基本上,我们就实现了串口的DMA收发。但是,我们需要对这个发到的数据进行处理。由于我们关闭了循环发送,所以需要我们手动开启DMA发送。

二、处理收到的数据RX

代码如下(示例):

dma_transfer_number_get(DMA0, DMA_CH5)

这里我只说一下思路:1、将DMA数据存入环形缓存区,2、通过高于写入速度的速率去读环形缓存区的数据,使数据不会溢出。ps:在取数据之前,需用通过上面这个dma_transfer_number_get(DMA0, DMA_CH5)函数去查DMA写到哪个位置。

二、处理发送的数据TX

代码如下(示例):

void Usart_TxMan(INT8U Port)
{uint16_t idx,TxLen=0;INT8S tx_finish_flag = 0;if((dma_flag_get(DMA0,DMA_CH6,DMA_FLAG_FTF)!=RESET))//ÉÏÒ»´ÎµÄÊý¾ÝÍêÈ«·¢ËÍÍê{tx_finish_flag = 1;}if(tx_finish_flag) //ÉÏÒ»´Î´«ÊäÍê³É{TxLen = (uart_data[Port].tx_write + USART_TX_BUF_SIZE - uart_data[Port].tx_read) % USART_TX_BUF_SIZE;if(TxLen>0)    // ÓÐÐèÒª·¢Ë͵ÄÊý¾Ý{   for(idx = 0; idx < TxLen; idx++) {uart_data[Port].DMA_TxBuf[idx]=uart_data[Port].TxBuf[uart_data[Port].tx_read];uart_data[Port].tx_read = (uart_data[Port].tx_read + 1) % USART_TX_BUF_SIZE;}  if(Port==1){      dma_parameter_struct dma_init_struct;dma_deinit(DMA0, DMA_CH6);dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;dma_init_struct.memory_addr = (uint32_t)uart_data[1].DMA_TxBuf;dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;dma_init_struct.number = TxLen;dma_init_struct.periph_addr = USART1_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_CH6, &dma_init_struct);/* configure DMA mode */dma_circulation_disable(DMA0, DMA_CH6);/* enable DMA channel3 */dma_channel_enable(DMA0, DMA_CH6);/* USART DMA enable for transmission and reception */usart_dma_transmit_config(USART1, USART_DENT_ENABLE);   dma_flag_clear(DMA0,DMA_CH6,DMA_FLAG_G);}else if(Port==0){}}}
}

代码如上,思路是:在发送数据之前,看看dma_flag_get(DMA0,DMA_CH6,DMA_FLAG_FTF),也就是DMA写完成flag(不是中断,是标志)是否完成,若完成,代表上一次发送的数据发出去了,这时候才可以再写入,否则退出写入。
写入的办法就是重新设置一遍DMA,(在STM32中可以简单设置其中几个参数即可,我没有去测试GD中设置哪几个,所以全部重新设置了一遍)。这样就实现了tx。


总结

以上为DMA串口收发。

GD32F103使用串口DMA收+发 信息(无中断)相关推荐

  1. 【RoboMaster】A板串口DMA接发数据及模块数据解析(GY33颜色传感器)

    文章目录 1.串口初始化配置 1.1CubeMX配置 1.1.1 项目总体配置 1.1.2串口参数配置 开启串口 DMA&NVIC 1.2 代码 1.2.1 串口初始化 1.2.2 串口中断数 ...

  2. [基于STM32底盘控制与ROS上层导航小车制作] 第五节 实现STM32与ubuntu系统下的ROS串口DMA通信,传输底盘速度等信息

    系列文章目录 第一节 stm32电机驱动与编码器读取反馈 第二节 stm32电机pid控制 第三节 stm32线速度标定 第四节 stm32添加mpu6050得到angle角度 第五节 实现STM32 ...

  3. Java使用短信猫发信息(向串口发送AT指令)

    使用Java发送短信息的方式有两种: 1>使用第三方平台的http请求进行发送,优点是接口简单,使用方便,发送的效率高,多条可以同时发送,缺点是短信平台,三大运营商不提供接口,都是第三方平台,但 ...

  4. 快递员依据管理中心发来收件信息

    快递员手持终端主要有以下几个功能: 通过物联宇手持终端机与管理中心将收件单和派发单及时发送到快递员的手持终端,能够快速跟进. 快递员依据管理中心发来收件信息,到客户处收取快件,并在现场将扫描采集到的运 ...

  5. STM32串口+DMA使用1

    STM32串口+DMA使用 STM32有5个串口资源(USART1,USART2,USART3及UART4,UART5).其中3个USART(通用同步/异步收/发器universalsynchrono ...

  6. android 串口一直打开_STM32之串口DMA接收不定长数据

    STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...

  7. 基于STM32F407标准库串口DMA+空闲中断

    核心板:STM32F407 实验目的:通过DMA接收串口发来的数据,并且利用串口空闲中断在将这些数据发送至串口助手. 在通常我们使用串口接收数据时,会使能串口接收中断,并在每次接收到数据后会进入中断将 ...

  8. dma接收双缓存 stm32_容易被大多数人忽视的STM32串口DMA问题

    讨论三个问题: 1.什么叫串口DMA 请求: 2.串口简要复习: 3.串口DMA发送流程. 第一 什么叫串口DMA 请求(战舰STM32开发板) 说这个问题之前先简单回顾DMA的基本特性.先导出原子哥 ...

  9. STM32 USART串口DMA 接收和发送的源码详解!

    硬件平台:STM32F103ZET6: 开发环境:KEIL 4: 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信 ...

  10. STM32F4 串口DMA

    串口DMA方式收发 笔者使用的是STM32F407VET6,共包含6路串口,页尾处程序已将全部串口的DMA收发配置完成,本文仅以串口1为例进行讲解.(查看代码可直接跳至第二节或页尾处下载) 1 STM ...

最新文章

  1. 2016年中国程序员职业薪酬报告
  2. Cookie,Session
  3. linux内核的中断上下文,Linux操作系统中中断上下文中的互斥
  4. C语言易错题集 第三部
  5. 小甲鱼 OllyDbg 教程系列 (七) :VB 程序逆向分析
  6. ++i和i++哪个效率更高
  7. 计算机测试英语词汇,英语听说测试-计算机专业英语词汇.pdf
  8. linux 更改文件格式
  9. python 列表求最大值_Python找出列表中的最大数和最小数
  10. Educoder_Web_简历表页面的制作
  11. java商城开发可以说是日臻完美
  12. 开启电脑替我记忆之路
  13. 三种经典图像滤波方法介绍——双边滤波(Bilateral filter)、导向滤波(Guided Fliter)、滚动导向滤波(RollingGuidedFilter)
  14. base64转图片的两种方式
  15. EXCEL表格-VLOOKUP函数场景应用详解
  16. 迅雷校招产品经理面试
  17. ucore概述(操作系统学习)
  18. 气传导耳机哪个品牌好?韶音、南卡、索尼、cleer气传导耳机评测
  19. uniapp 安卓虚拟键返回问题
  20. 想要用好三维建模软件,这些技巧一定可以帮到你

热门文章

  1. Docker中部署.NET CORE应用(控制台应用程序篇)
  2. 如何做职业规划并进行求职准备(持续更新)
  3. 噪音通道模型_噪声信道模型(NoiseChannelModel)
  4. html中的flash打不开,浏览器中flash插件被屏蔽怎么办?
  5. windows安装hbase
  6. 一键修改QQ运动刷步助手 V3.0
  7. web flash 视频播放器代码开源
  8. coreos 安装 mysql_手把手教你在 CoreOS 上构建你的第一个应用
  9. Java Servlet 实战入门教程-01-Servlet 是什么,Servlet与tomcat/j2EE的关系
  10. 【制作】基于51单片机的蓝牙遥控小车方案