完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
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: |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 04:52 , Processed in 0.687510 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号