1 STM32 USART 串口 DMA 接收和发送的源码详解! 嘿儿哈20130126 一直都没有机会用STM32 做什么项目,好在公司产品要平台升级,用到了STM32,所以最近在调试STM32,先说USART,后面再来说I2C 等等 硬件平台:STM32F103ZET6; 开发环境:KEIL 4; 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU 发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信息上传)。 串口DMA 发送: 发送数据的流程: 前台程序中有数据要发送,则需要做如下几件事 1. 在数据发送缓冲区内放好要发送的数据,说明:此数据缓冲区的首地址必须要在DMA 初始化的时候写入到DMA 配置中去。 2. 将数据缓冲区内要发送的数据字节数赋值给发送DMA 通道,(串口发送DMA和串口接收 DAM 不是同一个 DMA 通道) 3. 开启 DMA,一旦开启,则 DMA 开始发送数据,说明一下:在KEIL 调试好的时候,DMA 和调试是不同步的,即不管 Keil 是什么状态,DMA 总是发送数据。 4. 等待发送完成标志位,即下面的终端服务函数中的第 3 点设置的标志位。或者根据自己的实际情况来定,是否要一直等待这个标志位,也可以通过状态机的方式来循环查询也可以。或者其他方式。 判断数据发送完成: 启动DMA 并发送完后,产生 DMA 发送完成中断,在中断函数中做如下几件事: 1. 清 DMA 发送完成中断标志位 2. 关闭串口发送DMA 通道 3. 给前台程序设置一个软件标志位,说明数据已经发送完毕 串口DMA 接收: 接收数据的流程: 已 核 实通过 2 串口接收DM A 在初始化的时候就处于开启状态,一直等待数据的到来,在软件上无需做任何事情,只要在初始化配置的时候设置好配置就可以了。 判断数据数据接收完成: 这里判断接收完成是通过串口空闲中断的方式实现,即当串口数据流停止后,就会产生 IDLE 中断。这个中断里面做如下几件事: 1. 关闭串口接收DM A 通道,2 点原因:1.防止后面又有数据接收到,产生干扰。2.便于DM A 的重新配置赋值,下面第 4 点。 2. 清除 DM A 所有标志位 3. 从 DM A 寄存器中获取接收到的数据字节数 4. 重新设置DM A 下次要接收的数据字节数,注意,这里是给 DM A 寄存器重新设置接收的计数值,这个数量只能大于或者等于可能接收的字节数,否则当 DM A 接收计数器递减到0 的时候,又会重载这个计数值,重新循环递减计数,所以接收缓冲区的数据则会...