2-STM32串口通信实验
- 格式:ppt
- 大小:2.25 MB
- 文档页数:39
奋斗版 STM32 开发板例程手册———NRF24L01+转 USB 虚拟串口实验NRF24L01+转 USB 虚拟串口实验实验平台:奋斗版STM32开发板Tiny 实验内容:板子通过USB加电后,先向串口1输出一串测试数据,然后USB被PC识 别出来,虚拟出一个串口号给这个USB设备,此时可以通过在PC端的串口助手类 软件选择该串口号。
进入串口软件界面,可以通过软件无线收发一帧长度最长 为32字节的数据。
该例程可以和V3及MINI板的NRF24L01 UCGUI例程配合使用。
预先需要掌握的知识 2.4G通信模块NRF24L01 1. 产品特性2.4GHz 全球开放ISM 频段,最大0dBm 发射功率,免许可证使用 支持六路通道的数据接收 低工作电压:1.9 1.9~3.6V 低电压工作 高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象(软件设置1Mbps或者2Mbps的空中传输速率) 多频点:125 频点,满足多点通信和跳频通信需要 超小型:内置2.4GHz天线,体积小巧,15x29mm(包括天线) 低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。
低应用成本:NRF24L01 集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据包和自动产生应答信号等, NRF24L01的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口, 便于使用低成本单片机。
便于开发:由于链路层完全集成在模块上,非常便于开发。
自动重发功能,自动检测和重发丢失的数据包,重发时间及重发次数可软件控制 自动存储未收到应答信号的数据包 自动应答功能,在收到有效数据后,模块自动发送应答信号,无须另行编程 载波检测—固定频率检测 内置硬件CRC 检错和点对多点通信地址控制 数据包传输错误计数器及载波检测功能可用于跳频设置 可同时设置六路接收通道地址,可有选择性的打开接收通道 标准插针Dip2.54MM 间距接口,便于嵌入式应用2.基本电气特性淘宝店铺:1奋斗版 STM32 开发板例程手册———NRF24L01+转 USB 虚拟串口实验3. 引脚定义:4.工作方式NRF2401有工作模式有四种: 收发模式 配置模式 空闲模式 关机模式 工作模式由CE 和寄存器内部PWR_UP、PRIM_RX 共同控制,见下表:淘宝店铺:2奋斗版 STM32 开发板例程手册———NRF24L01+转 USB 虚拟串口实验4.1 收发模式收发模式有Enhanced ShockBurstTM收发模式、ShockBurstTM收发模式和直接收发模式三种,收发模式由器件配置字决定,具体 配置将在器件配置部分详细介绍。
IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。
在重新编程过程中可以使用任意类型的通信协议,如UART、I2S、SPI等。
这篇笔记分享的是使用UART方式IAP。
串口IAP实验先理一理流程(本实验是以STM32F103ZET6为例):1、实验说明做这个实验需要准备两个keil工程,一个工程用于编写IAP程序,另一个工程用于编写我们的应用程序(要实现某些功能的程序),这里我们以一个点灯程序为例。
最终,两份工程编译出来的可执行文件都需要烧写到芯片的FLASH 中。
只不过需要烧写到不同的地址,简单的示意图如下:这里,使用的STM32的型号为STM32F103ZET6,其FLASH大小是512KB,0x08000000为其FLASH被映射的地址,程序被烧写到的就是这个地址。
此处,我们的IAP程序烧写到这个地址,根据IAP程序的大小,我们在keil里可以设置合适的IAP结束地址。
注意:在没有IAP程序的情况下,0x08000000这个地址就是应用程序烧写的地址。
2、工程说明本实验用到的两个工程可按照文末的方式获取,其中IAP工程移植至ST官方例程。
下面对两个工程进行简单的说明IAP工程:(1)需要在target选项卡里设置我们IAP程序的起始地址与大小,如:这里我们的IAP程序起始地址设为0x08000000,大小设为0x3000,即IAP所能用的FLASH空间为12KB。
其中IAP所能占的占空间的大小可根据IAP的实际大小进行修改。
(2)需要修改程序中我们需要跳转到的应用程序的地址(即IAP程序的结束地址):LED工程:(1)需要在target选项卡里设置我们LED程序的起始地址与大小,如:这里我们的LED程序起地址设为0x08003000,大小设为0x10000,即LED所能用的FLASH空间为64KB。
STM32单片机串口通讯故障排除处理过程STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04.。
接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。
换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失。
错误依旧。
故障排除过程:1、刚开始怀疑是接收端的错误,我是使用电脑串口,运行串口辅助调试工具接收,换成其他软件后,发现故障依旧,而且电脑软件一直是开启状态,不像和电脑软件有关。
2、使用单步调试,单步运行各个发送指令,都正常。
能收到0x01 0x02 0x03 0x04的数据。
间接的排除了不是电脑软件的问题,而是其他的错误。
3、单步调试运行虽然正常了,但连续运行时,错误依旧。
现在有点摸不到头绪了,单步运行正常,看起来编程没有出错,那故障在哪里呢?测试程序如下USART_SendData(USART2,0x01); //Awhile(USART_GetFlagStatus(USART2,USART_FLAG_TC)== RESET); //B USART_SendData(USART2,0x02); //Cwhile(USART_GetFlagStatus(USART2,USART_FLAG_TC)== RESET);USART_SendData(USART2,0x03);while(USART_GetFlagStatus(USART2,USART_FLAG_TC)== RESET);USART_SendData(USART2,0x04);while(USART_GetFlagStatus(USART2,USART_FLAG_TC)== RESET);4、猜测,也许是因为某个特殊原因,使第二个数据覆盖了首个数据,使得首个数据丢失。
STM32HAL库之串⼝详细篇(基于HAL库)⼀、基础认识(⼀) 并⾏通信原理:数据的各个位同时传输优点:速度快缺点:占⽤引脚资源多,通常⼯作时有多条数据线进⾏数据传输8bit数据传输典型连接图:传输的数据是⼆进制:11101010,则通信使⽤8条线同时进⾏数据传输,发送端⼀次性发送8位数据,接收端⼀次性接收8位数据。
(⼆) 串⾏通信原理:数据按位顺序传输优点:占⽤引脚资源少缺点:速度相对较慢,通常⼯作时只有⼀条数据线进⾏数据传输8bit数据传输典型连接图:传输的数据是⼆进制:11101010,则通信使⽤8条线同时进⾏数据传输,发送端⼀次性发送8位数据,接收端⼀次性接收8位数据。
8bit数据传输典型连接图:传输的数据是⼆进制:11101010,则通信使⽤1条线进⾏数据传输,发送端⼀次性发送1位数据,接收端⼀次性接收1位数据。
串⾏通信的分类:1.单⼯:数据只能在⼀个⽅向上传输,通信双⽅数据只能由⼀⽅传输到另⼀⽅2.半双⼯:数据可以错时双向传输,通信双⽅数据可以⽀持两个⽅向传输,但是同⼀时间只能由⼀⽅传输到另外⼀⽅。
3.全双⼯:数据可以同时双向传输,通信双⽅数据可以同时进⾏双向传输,对于其中⼀个设备来说,设备需要⽀持发送数据时可以进⾏数据接收。
串⾏通信的通讯⽅式:l 同步通信:带时钟同步信号的传输,如SPI、IIC、USART(同步)l 异步通信:不带时钟同步信号的传输,如UART、USART(异步)常见数据传输协议:(三) UART和USARTUART:通⽤异步收发器USART:通⽤同步/异步收发器,其可选使⽤异步⽅式,那将和UART⽆区别,如果是同步,则需要多⼀根时钟线(USART_CK)(四) STM32的USART注意:l 通常USART1接⼝的通信速率较快,其它USART接⼝较慢。
如STM32F103C8T6的USART1接⼝通信速率是4.5Mbps,其它USART接⼝的通信速率是2.25Mbps。
STM32f103寄存器配置串口通信主程序接收数据,上位机串口发送的数据已回车键结束,单片机接之后将所有数据发回。
#include "stm32f10x_lib.h" #include "sys.h"//#include "ioshezhi_jb.h" // 串口接受数据临时存储 // 接受完成标志 // 数据长度// 数据存储表 ,限制长度为 200 字节// 通信数据操作 for 循环控制 unsigned long i=0;int main(){Stm32_Clock_Init(); //io_init();//PA9、PA10IO 设置清零//P9 推挽输出, max50MHZ ; P10 上拉输入 RCC->APB2RSTR|=0x4000; RCC->APB2RSTR&=0xbfff; // 主频 72M 时,波特率为 9600 D 5// 主频 36M 时,波特率为 9600 // 主频 36M 时,波特率为 115200 //串口开,发送长度 8字节,无校验,发送开,接收开;//串口开,发送长度 9字节,偶校验,发送开,接收开; //( 有效数据还是 8 位长度 )D 6while (1){// shuru_init();// 计算输入口的值if(0x0020==((USART1->SR)&0x0020)) //如果接受到了一个字节的数据D 7{ res=USART1->DR; //读取串口寄存器数据并存在临时位置res D 8if(res!=0x0a){shubiao[len]=res;len++;} // 如果该数据不是回车符的最后一个//字节0x0a,则存入数表unsigned char res; unsigned char enddd=0; unsigned int len=0; unsigned charshubiao[200]; unsigned // 系统时钟设置//io 时钟以及输入输出选项设置RCC->APB2ENR|=0x4000; RCC->APB2ENR|=0x0004;//开启USART1时钟;① //开启GPIOA 口时钟;③ GPIOA->CRH&=0xfffff00f; GPIOA->CRH|=0x000008b0; //串口复位CD//串口停止复位 ④// USART1->BRR=0x1d4c;USART1->BRR=0x0ea6; // USART1->BRR=0x0139; // USART1->CR1|=0x200c;USART1->CR1|=0x340c;else{if(shubiao[le n-1]==0x0d){e nddd=1;le n--;};}; }; //如果是0x0a ,则判断前一个字符是不是 OxOd,(回车符ASCII 码为OxOaOd)//是的话则标记接受完成标志eddd 并删掉已接受到的前一个字节的数据};}寄存器注释:①、⑵ 时钟使能寄存器RCC->APB2ENR 参考不完全手册 P108页面需要开启的PORTA 和USART1的时钟使能位,分别在bit2和bit14,只要将这两位置 1就可以使能 PORTA 和USART1的时钟了。
作业1模拟串行通讯一、作业背景题目:模拟串行通讯一、题目:通过数字通道进行两个计算机系统的通讯二、目标:设计、实现一个用于数字通道串行通讯的协议三、思路与方法1. 硬件2. 软件CLK 上升沿检测DTA 的值,作为1bit ,存入寄存器中。
3. 编写程序并测试二、课程作业方案设计(一)自定义协议格式START帧头 数据长度 标识 数据 数据效验 帧尾 1Byte1Byte 1Byte 1Byte 1Byte 2Byte 1Byte 0x53 0xFE 0x01 0xDD 0x0D0C 0xFF1、起始标志:协议数据帧开始的标志,保留字为0x53。
2、帧头:同其他设备通信时首要的一致性保证,此次为0xFE 。
计算机1 计算机2GND CLKDTA3、数据长度:表示当前数据包的大小。
4、标识:可以自定义,对于不同的数据包,采用不同的标识。
比如当为温度采样问题时,该为温度采集器序号。
当为湿度采样问题时,该为湿度采集器序号。
5、真实数据:发送的数据内容,对于温度采样问题。
6、数据校验:根据前述数据所得的CRC32校验码。
7、结束标志:即帧尾,协议数据结束的标志,保留字为0xFF。
(二)、自定义协议详解1、自定义协议采用的是端到端的通信。
2、自定义的通信协议采用2条信号线,1条时钟线(CLK)和1条数据线(DTA),属于串行半双工通信。
每个从设备有自己的标识、帧头、数据、数据长度、数据校验、帧尾,主设备发送START信号(0x53)后,紧跟着发送想要数据的帧头(0xFE),当验证了帧头之后,该数据包即是我们所需的对应数据包。
3、CLK上升沿检测DTA的值,作为1bit,存入寄存器中。
没有数据传输时,DAT上恒保持高电平。
4、START信号:当检测到DAT的值为0x53时,开始传输数据。
5、帧头:0xFE—>即在CLK时钟的8个周期内,此时传输了8bit数据为1111 1110时(即0xFE),该数据包即是正确的数据包,在第一个字节后,主机立即读从机,开始接收该数据包。
stm32串口奇校验原理及程序STM32串口奇校验是一种错误检测和纠正方法,用于保证串口数据传输的准确性。
奇校验在数据位之后插入一个校验位,使得数据位与校验位的总和为奇数。
校验位的值取决于数据位中1的数量,如果数据位中1的数量为偶数,则校验位为1,否则为0。
接收方在接收数据后,会重新计算数据位中1的数量,并与接收到的校验位进行比较,如果不一致则判定数据错误。
以下是使用STM32的HAL库实现串口奇校验的示例程序:1. 首先,需要在CubeMX中配置串口接口的相关参数,包括波特率、数据位、停止位等。
在串口的配置选项中,选择奇校验位。
2. 在生成的代码中找到串口初始化函数,一般是`USARTx_Init()`,并在其配置项的`huart.Init.Parity`中选择`UART_PARITY_ODD`表示奇校验。
3. 在接收中断处理函数中,添加校验位的逻辑。
可以通过`__HAL_UART_GET_FLAG()`函数判断接收完成标志位是否置位,如果接收完成,则通过`__HAL_UART_FLUSH_DRREGISTER()`函数读取接收寄存器的值,并计算数据位中1的数量。
```cif (__HAL_UART_GET_FLAG(&huart, UART_FLAG_RXNE)){uint8_t data =__HAL_UART_FLUSH_DRREGISTER(&huart);uint8_t parityBit = 0;for (int i = 0; i < 8; i++) {parityBit += (data >> i) & 0x01;}parityBit &= 0x01;if ((parityBit == 1 && huart.Init.Parity !=UART_PARITY_ODD) || (parityBit == 0 && huart.Init.Parity != UART_PARITY_EVEN)) {// 校验错误的处理逻辑} else {// 校验正确的处理逻辑}}```以上是实现STM32串口奇校验的基本原理和示例程序。
基于STM32单片机的通信技术实验系统设计朱向庆;何昌毅;朱万鸿;钟创平【摘要】提出一种基于STM32单片机的通信技术实验系统设计方案,系统采取\"核心板+功能模块\"的设计理念,以STM32F103ZET6单片机最小系统为控制中心,集成电源模块、输入输出模块、有线通信模块、无线通信模块及信源编译码模块,能够完成通用STM32单片机的仿真与下载实验.实验结果表明,本系统具有集成度高、覆盖面大、适用性广等优点,能够有效提高学生的工程实践素质与创新思维能力,可在单片机、嵌入式系统、移动通信和物联网技术等课程的实践教学中推广使用.【期刊名称】《实验技术与管理》【年(卷),期】2019(036)008【总页数】4页(P81-84)【关键词】STM32单片机;通信技术;实验系统;仿真实验;下载实验【作者】朱向庆;何昌毅;朱万鸿;钟创平【作者单位】嘉应学院电子信息工程学院,广东梅州 514015;嘉应学院电子信息工程学院,广东梅州 514015;嘉应学院电子信息工程学院,广东梅州 514015;嘉应学院电子信息工程学院,广东梅州 514015【正文语种】中文【中图分类】TP368;TP914.33近年,互联网+、智能制造 2025、工业 4.0等概念的提出,加大了对电子信息技术人才的需求[1]。
高等教育是知识传播、应用和创新的主要途径,也是培养创新创业人才的重要途径[2-3]。
很多高校电子信息类专业都开设单片机、嵌入式系统、移动通信、物联网技术等课程。
实验仪器是实践教学必不可少的装备,而市场上现有的设备基本都是实验箱或实验台,通常存在价格贵,体积大,硬件电路资料不够公开等问题,不利于学生全面学习课程知识。
例如:移动通信实验箱多侧重于原理方面的验证,不利于做二次开发[4];物联网实验箱则侧重于传感检测、短距离无线通信[5],且通常追求功能大而全,不利于推广;单片机实验系统有很多,以51单片机和AVR单片机居多,STM32单片机也有,但侧重于通信技术应用的单片机实验系统目前还没有;即使涉及通信技术的单片机实验板,也只是单纯的某种通信技术而已,不够全面。
基于STM32的USB通信程序设计一、概述随着USB接口在各种设备中的广泛应用,基于STM32的USB通信程序设计变得越来越重要。
本文将介绍如何使用STM32开发板实现USB通信功能。
二、STM32USB库STM32官方提供了一个USB库,通过这个库可以方便地实现USB通信。
首先需要将该库添加到STM32的开发环境中,然后按照官方提供的文档来进行配置和使用。
三、USB通信原理USB通信一般分为两部分:主机端和设备端。
主机端通常指的是电脑或者其他设备,设备端就是STM32开发板。
在USB通信中,主机端包括主机控制器和主机驱动程序,设备端包括设备控制器和设备固件。
主机控制器负责管理USB总线上的设备并与设备进行通信。
主机驱动程序负责与主机控制器进行通信,将收到的数据传递给相应的应用程序。
设备控制器负责将设备固件的数据传送到USB总线上,并接收来自主机的数据。
设备固件负责将来自设备控制器的数据交给相应的应用程序处理。
四、USB通信程序设计步骤1.硬件连接:根据实际情况将STM32开发板与主机进行连接。
2.导入USB库:在STM32的开发环境中添加STM32USB库。
3.配置USB库:根据实际需求,在STM32的开发环境中配置USB库。
4.编写主机驱动程序:在主机上编写一个驱动程序,用于与STM32设备进行通信。
5.编写设备固件:在STM32开发板上编写一个固件程序,用于与主机进行通信。
6.测试:将开发板连接到主机上,运行主机驱动程序和设备固件,测试USB通信功能的可靠性和稳定性。
五、常见问题解决办法B通信中断问题:在USB通信过程中,由于硬件和软件的原因,可能会出现通信中断的情况。
解决该问题需要仔细检查硬件连接和对USB 库的配置。
2.数据传输错误:在USB通信过程中,可能会出现数据传输错误的情况。
解决该问题需要仔细检查数据传输的流程和数据处理的逻辑。
3.设备识别问题:在USB通信过程中,可能会出现设备无法被主机识别的情况。
基于STM32之UART串⼝通信协议(⼀)详解⼀、前⾔1、简介 写的这篇博客,是为了简单讲解⼀下UART通信协议,以及UART能够实现的⼀些功能,还有有关使⽤STM32CubeMX来配置芯⽚的⼀些操作,在后⾯我会以我使⽤的STM32F429开发板来举例讲解(其他STM32系列芯⽚⼤多数都可以按照这些步骤来操作的),如有不⾜请多多指教。
2、UART简介 嵌⼊式开发中,UART串⼝通信协议是我们常⽤的通信协议(UART、I2C、SPI等)之⼀,全称叫做通⽤异步收发传输器(Universal AsynchronousReceiver/Transmitter)。
3、准备⼯作1)Keil5 链接:点击 提取码:wrt92)STMCubeMX5.1.0版本 链接:点击 提取码:20xs3)STMF429开发板注: 只要是stm32的开发板都可以⽤到的,在STM32CubeMx⾥选对型号、配置好就⾏了。
⼆、UART详解1、UART简介 嵌⼊式开发中,UART串⼝通信协议是我们常⽤的通信协议(UART、I2C、SPI等)之⼀,全称叫做通⽤异步收发传输器(Universal AsynchronousReceiver/Transmitter),是异步串⼝通信协议的⼀种,⼯作原理是将传输数据的每个字符⼀位接⼀位地传输,它能将要传输的资料在串⾏通信与并⾏通信之间加以转换,能够灵活地与外部设备进⾏全双⼯数据交换。
注: 在此开发板中,是有USART(Universal Synchronous Asynchronous Receiver and Transmitter通⽤同步异步收发器)串⼝的,USART相当于UART的升级版,USART⽀持同步模式,因此USART 需要同步始终信号USART_CK(如STM32 单⽚机),通常情况同步信号很少使⽤,因此⼀般的单⽚机UART和USART使⽤⽅式是⼀样的,都使⽤异步模式。
因为USART的使⽤⽅法上跟UART基本相同,所以在此就以UART来讲该通信协议了。
如何通过串口烧写STM32程序要通过串口烧写STM32程序,可以按照以下步骤进行操作:1.准备工作:-一台装有串口助手软件的电脑。
-一根串口连接线,一端连接电脑的串口接口(或者使用串口转USB 接口),另一端连接到STM32开发板的串口接口。
- 安装STM32开发环境,包括Keil MDK等开发工具。
2. 在开发环境中编写STM32程序并编译生成可执行文件(例如.hex 或.bin文件)。
3.打开串口助手软件,配置串口参数:-选择对应的串口号(可在设备管理器中查看)。
-配置数据位、停止位、校验位等参数,与STM32开发板的串口参数一致。
4.连接STM32开发板与电脑:-将STM32开发板接通电源。
-使用串口连接线将STM32开发板与电脑连接起来,一端接到STM32的串口接口,另一端接到电脑的串口接口(或者串口转USB接口)。
-确保STM32开发板处于启动状态。
6.在串口助手软件中进行烧写操作:-在串口助手软件上点击“打开串口”按钮。
- 点击软件界面上的“选择文件”或者“发送文件”按钮,选择之前编译生成的可执行文件(.hex或.bin格式)。
-点击“发送”或“烧写”按钮开始烧写操作。
7.等待烧写完成:-在串口助手软件中,可以观察到烧写过程中的提示信息和进度条。
-等待烧写完成,一般会有提示烧写成功或烧写完成的相关信息。
8.重启STM32开发板:-断开开发板与电脑的串口连接线。
-按照对应的重启操作,重新启动STM32开发板。
通过以上步骤,就可以通过串口烧写STM32程序。
需要注意的是,具体的操作步骤可能因开发板型号和使用的烧写工具而有所差异,可以根据具体的操作指引进行操作。
STM32使用DMA加串口空闲中断接收数据在STM32中使用DMA和串口空闲中断接收数据可以实现高效的数据接收。
下面是一个示例代码,可以在1200字以上使用DMA和空闲中断接收数据。
首先,需要启用STM32的串口空闲中断和DMA功能。
在CubeMX中配置相关的引脚和串口设置,并使能空闲中断和DMA接收。
接下来是代码实现:```c#include "stm32f4xx_hal.h"#define UART_RX_BUFFER_SIZE 2048 // 接收缓冲区大小UART_HandleTypeDef huart2;DMA_HandleTypeDef hdma_usart2_rx;uint8_t uart_rx_buffer[UART_RX_BUFFER_SIZE];uint16_t uart_rx_index = 0;```上面的代码定义了串口接收的缓冲区和相关的变量。
```cvoid HAL_UART_IdleCallback(UART_HandleTypeDef *huart)if (huart->Instance == USART2)//空闲中断发生HAL_UART_DMAStop(&huart2);}```这是串口空闲中断回调函数,当串口空闲中断发生时,将设置一个标志表示接收完成,并停止DMA接收。
```cvoid HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)if (huart->Instance == USART2)//DMA接收完成uart_rx_index += UART_RX_BUFFER_SIZE -hdma_usart2_rx.Instance->CNDTR;if (uart_rx_index >= UART_RX_BUFFER_SIZE)//接收缓冲区满了,重置索引uart_rx_index = 0;}HAL_UART_Receive_DMA(&huart2, uart_rx_buffer,UART_RX_BUFFER_SIZE);}```这是DMA接收完成回调函数,当DMA接收完成时,更新接收缓冲区索引,并重新启动DMA接收。
STM32F103ZET6串⼝通信1、电平标准 根据通讯使⽤的电平标准不同,串⼝通讯可分为TTL标准和RS-232标准,如下表: 从图中可以看到,TTL电平标准使⽤5V表⽰⾼电平,使⽤0V表⽰低电平。
在R232电平标准中,为了增加串⼝通讯的远距离传输及抗⼲扰能⼒,使⽤的是-15V表⽰⾼电平,使⽤+15V表⽰低电平。
如下图为RS232和TLL电平标准表⽰同⼀个信号时的对⽐。
在电⼦电路中,⼀般使⽤TTL电平进⾏通讯,⽽在PC机中则使⽤RS232电平进⾏通讯。
所以为了使电⼦设备可以和PC机进⾏串⼝通讯,必须对TTL电平和RS232电平的信号进⾏互相转换。
2、串⼝协议 串⼝通讯的英⽂全称为Serial Communication,这是⼀种在设备间⾮常常⽤的串⾏通讯⽅式。
串⼝通讯的协议,串⼝通讯的数据包由发送设备通过⾃⾝的TXD接⼝传输到接收设备的RXD接⼝。
在串⼝通讯的协议中,规定了数据包的内容,该内容由起始位、数据位、校验位以及停⽌位组成,通讯双⽅的数据包格式要约定⼀致才能正常收发数据。
格式如下图: 在数据帧格式中,校验位可以要也可以不要。
⼀般在串⼝通信中,空闲状态下,IO⼝的电平为⾼电平。
3、串⼝波特率 串⼝通讯⼀般使⽤的是异步通讯,异步通讯是没有时钟信号的,为了保证两个设备能够正常通讯,必须在两个设备间约定好收发的速率,波特率就是设备的收发速率,波特率表⽰的是单位时间内收发的bit位,即⼀个bit的收发时长。
⽐如波特率为9600的设备,那么该设备1S的时间内可以收发9600个bit,发送⼀个bit的时长位1/9600≈104us。
4、数据帧的起始信号和停⽌信号 串⼝通讯的⼀个数据包是从起始信号开始的,直到停⽌信号结束。
数据包的起始信号由⼀个逻辑0的数据位表⽰,⽽数据包的停⽌信号可由0.5、1、1.5或2个逻辑1的数据位表⽰。
有效数据: 在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定位5、6、7或8位。
STM32使用DMA加串口空闲中断接收数据在STM32上使用DMA加串口空闲中断接收数据时,可以通过以下步骤实现:1.配置串口进行接收:-设置串口的波特率、数据位、停止位等参数;-使能串口的接收功能;-配置串口的空闲中断使能。
2.配置DMA进行接收:-设置DMA通道的传输方向为从外设到内存;-设置DMA的数据传输大小为字节;-设置DMA的外设地址为串口的数据寄存器地址;-设置DMA的内存地址为接收缓冲区的起始地址;-设置DMA的传输模式为循环传输,以实现连续接收;-使能DMA传输完成中断。
3.在空闲中断中处理接收到的数据:-在空闲中断服务函数中判断DMA传输是否完成;-如果传输完成,说明接收到了数据;-可以通过DMA的传输计数器获取到接收到的数据长度;-根据接收到的数据长度,可以在接收缓冲区中找到接收到的数据。
以下是一个示例代码,演示如何使用DMA加串口空闲中断接收数据:```c#include "stm32f4xx.h"#define BUFFER_SIZE 1024uint8_t rx_buffer[BUFFER_SIZE];volatile uint16_t rx_index = 0;void USART_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;DMA_InitTypeDef DMA_InitStructure;//使能USART1和DMA2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//配置GPIOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 , GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);//配置USARTUSART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No;USART_ART_HardwareFlowControl =USART_HardwareFlowControl_None;USART_ART_Mode = USART_Mode_Rx ,USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);//配置DMADMA_DeInit(DMA2_Stream2);DMA_InitStructure.DMA_Channel = DMA_Channel_4;DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)&USART1->DR;DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)rx_buffer;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE;DMA_InitStructure.DMA_PeripheralInc =DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSize =DMA_MemoryDataSize_Byte;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;DMA_InitStructure.DMA_FIFOThreshold =DMA_FIFOThreshold_HalfFull;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;DMA_InitStructure.DMA_PeripheralBurst =DMA_PeripheralBurst_Single;DMA_Init(DMA2_Stream2, &DMA_InitStructure);//配置DMA接收完成中断DMA_ITConfig(DMA2_Stream2, DMA_IT_TC, ENABLE);//配置空闲中断USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//使能USART和DMAUSART_Cmd(USART1, ENABLE);DMA_Cmd(DMA2_Stream2, ENABLE);//配置NVICNVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);void USART1_IRQHandler(void)if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//清除空闲中断标志USART_ReceiveData(USART1);//禁止DMA传输DMA_Cmd(DMA2_Stream2, DISABLE);//计算接收到的数据长度uint16_t length = BUFFER_SIZE -DMA_GetCurrDataCounter(DMA2_Stream2);//处理接收到的数据for (uint16_t i = 0; i < length; i++)// 处理rx_buffer[i]数据//...}//重启DMA传输DMA_SetCurrDataCounter(DMA2_Stream2, BUFFER_SIZE); DMA_Cmd(DMA2_Stream2, ENABLE);}int main(void)USART_Configuration(;while (1)//等待接收完成}//处理接收到的数据for (uint16_t i = 0; i < rx_index; i++)// 处理rx_buffer[i]数据//...}//重置接收状态rx_index = 0;}```请注意,代码中的波特率及其他配置可能需要根据您的实际需求进行修改。