关于stm32UART通信协议的简单总结(小白通信协议总结系列一)
Part1:UART 串口通信协议
通用异步收发器,相对的还有一个同步收发器usart 通过时钟控制数据传输,但是不常用;
1,物理层:
ttl电平逻辑1的范围是2.4~5v
ttl电平逻辑0的范围是0~0.5v
RS-232电平逻辑1范围是-15~-3v
RS-232电平逻辑0范围是3~15v
控制器芯片引脚输出TTL电平,通过电平转换芯片,将TTL电平转换位DB9接口可以识别的RS-232电平。
控制器芯片的与外设的接线方式:
stm32f103的UART引脚分布图:
2,协议层:
协议层包含起始位,数据体,校验位,终止位。
注意:接收双方的配置一致才可以进行数据通信。
起始位:1个低电平
数据体:高电平代表逻辑1,低电平代表逻辑0,数据长度一般为5,6,7或8位
校验位:分为奇校验,偶校验,1校验,0校验和无校验
终止位:0.5,1,1.5,或2个高电平
3,uart的功能框图解析:
UART接收数据:RX接收外部输入的数据暂存在接收移位寄存器,转移到数据寄存器,接收控制器通过读指令读取总线上的数据。
UART发送数据:发送器发送数据到数据寄存器,转移到发送移位寄存器后通过TX接口将数据发送出去。
4,UART常配置的寄存器:(用到哪个查哪个就好了)
位3:0 DIV_Fraction[3:0]:USARTDIV的整数部分 这4位定义了USART分频器除法因子(USARTDIV)的整数部分。
位15:4 DIV_Mantissa[11:0]:USARTDIV的小数部分 这12位定义了USART分频器除法因子(USARTDIV)的小数部分。
波特率= 时钟频率/(16*USARTDIV)
Bit12 M:该位定义了数据字的长度,由软件对其置位和清零操作
Bit9 PS: 校验选择 该位用来选择当校验控制使能后,是采用偶校验还是奇校验。软件对它置位或者清零。当前字
节传输完成后,该选择生效。
位13:12 STOP: 停止位
位6 DMAR: DMA使能接收
位7 DMAT: DMA使能发送 由软件对该位清零或者置
位7 TXE:发送数据寄存器空 当TDR寄存器中的数据被硬件转移到移位寄存器的时候,该位被硬件置位。如果USART_CR1
寄存器中的TXEIE为1,则产生中断。对USART_DR的写操作,将该位清零。
位6 TC:发送完成当包含有数据的一帧发送完成后,由硬件将该位置位。如果USART_CR1中的TCIE为1,则产
生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。TC位也可以通过写 入0来清除,只有在多缓存通讯中才推荐这种清除程序。
位5 RXNE:读数据寄存器非空当RDR移位寄存器中的数据被转移到USART_DR寄存器中,该位被硬件置位。如果 USART_CR1寄存器中的RXNEIE为1,则产生中断。对USART_DR的读操作可以将该位清零。RXNE位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。
位3 TE: 发送使能 该位使能发送器。
RE: 接收使能 软件对该位置位或者清零
数据位低八位存数据。
对应寄存器的UART结构体:
typedef struct
{
uint32_t USART_BaudRate;
uint16_t USART_WordLength;
uint16_t USART_StopBits;
uint16_t USART_Parity;
uint16_t USART_Mode;
uint16_t USART_HardwareFlowControl;
} USART_InitTypeDef;
5,UART的函数处理部分:
F1标准库中常用的函数:
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState);
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
控制流程实现思路:
1) 使能 RX 和 TX 引脚 GPIO 时钟和 USART 时钟;
2) 初始化 GPIO,并将 GPIO 复用到 USART 上;
3) 配置 USART 参数;
4) 配置中断控制器并使能 USART 接收中断;
5) 使能 USART;
6) 在 USART 接收中断服务函数实现数据接收和发送。
串口配置函数demo:
接收数据的中断函数demo:
发送数据函数demo:
1)发送一个字节
2)发送一个字符串
6,UART函数通信过程中遇到的问题
在函数中如果要使用printf函数需要进行输出重定向的设置,重定向的解析详见https://www.geek-share.com/detail/2746509397.html
因为对重定向理解的不是很好,在删除其中一段关于重定向的代码后,函数debug无法跳入主函数。
deleted code:
- Zookeeper系列六:服务器角色、序列化与通信协议、数据存储、zookeeper总结
- 与三菱Q系列PLC-TCP通信(MC协议)学习总结
- Java基础系列:(2)关于枚举的简单总结
- Java基础系列:(1)关于泛型的简单总结
- iOS开发 关于SEL的简单总结
- 关于ASP.NET MVC4 Web API简单总结
- 一个简单的自定义通信协议(socket)
- 进程间通信与线程间通信简单总结
- 蜜果私塾:http协议学习和总结系列——协议详解篇
- C# Socket系列二 简单的创建 socket 通信
- 关于字符集,编码格式,大小端的简单总结
- 小白笔记--------------------------安装hadoop集群简单总结
- WorldWind学习系列三:简单功能分析——截屏功能和“关于”窗体分析
- 6 Django系列之关于models的sql语句日常用法总结
- 小白转载~关于javaEE的MVC(三大层)简单描述(摘抄)
- Wireshark的简单使用(关于抓协议)
- 项目的简单总结一 -- 关于对贝塞尔和shapelayer结合使用的动画特效
- 一个简单的通信协议(点对多点,灵活组队)(转)
- http协议学习和总结系列——协议详解篇
- php中关于socket的系列函数总结