回帖(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:
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:
举报
更多回帖