您的位置:首页 > 其它

关于stm32UART通信协议的简单总结(小白通信协议总结系列一)

2020-06-04 07:43 120 查看

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:

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: