STM32
直播中

华强一条街

9年用户 752经验值
擅长:处理器/DSP
私信 关注
[问答]

UART函数通信过程中遇到的问题是什么?

UART函数通信过程中遇到的问题是什么?

回帖(1)

赵勇

2021-12-14 09:59:52
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://blog.csdn.net/weixin_42048417/article/details/82179135
因为对重定向理解的不是很好,在删除其中一段关于重定向的代码后,函数debug无法跳入主函数。
deleted code:






举报

更多回帖

发帖
×
20
完善资料,
赚取积分