1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在开始学写STM32串口通信的代码实现前,首先先了解一下两块芯片之间通信的分类,按照数据传输方式可以分为
从上图(来自STM32F103RCT6芯片数据手册)我们可以知道STM32F103系列的芯片有三个USART串口以及两个UART串口,它们的引脚为 异步串口通信协议 由上图协议我们可以知道,异步串口通信需要四个参数:
上图上部分为对结构体的数据填充,前部分则将填充的数据进行初始化。对于串口的整体初始化流程我们便不多说了,大体分为以下几个步骤:
在串口初始化完成以后,我们便要进行数据收发的处理了,STM32的这部分函数写在了串口中断服务函数中: 在理解上图程序前,我们先了解下串口数据收发的过程: 在数据发送过程中,1:首先由MCU内核将要发送的字节写入到输出数据缓冲器(TDR),2:TDR会适时的将数据加载到串行输出移位寄存器,3:然后再经由TX串口线,将数据一位一位的发送出去。而数据接收则与此过程相反。 在上述过程中,会产生两个事件(事件可以在状态寄存器中查询到):
串口中断服务函数详解(STM32F103RCT6芯片的串口1) 在usart.h文件中: 定义了一个最大200字节的u8类型的数组以及一个接收状态标位USART_RX_STA,该标志位相当于一个虚拟的寄存器: 在正点原子的串口1协议里,需要每次发送的数据(长度小于200字节的一段话)需要以回车换行结束,这种协议符合我们键盘使用习惯,但当我们自己编写自己的通信协议时并不需拘泥于此,完全可以按照自己的需要来编写,例如每个数据开头都以0XAA开始,结尾都以0X00结束。 串口中断是一个字节一个字节的进行接收的(且字节长度按照我们所设定为8位),在数据接收过程中,每接收到一个非0X0D或0X0A的字节时,便会将该字节存入到200长度的数组USART_RX_BUF[ ] 中,且虚拟寄存器 USART_RX_STA加1(也相当于其13-0位加1): 当接收到0X0D时,则会 即将寄存器USART_RX_STA的第14位置为1,表示接收到0X0D,如果对上图中的按位或操作不理解,可以参看 【通信专栏】附录一:单片机C语言基础/逻辑运算/按位运算/结构体/宏定义 当接收到0X0D后,并不会把0X0D写入到数组USART_RX_BUF中,而是检测下一个字节是否为0X0A: 若不是,将会将寄存器USART_RX_STA清零,否则将通过USART_RX_STA|=0x8000这一句将寄存器第15位 置1,表示接收完毕。 到此为止我们便接收完一句话了,接完之后应该将寄存器USART_RX_STA清零,正点原子的代码把清零这一步放到了主程序的循环中: 到此我们就已经可以使用串口进行数据的接收或者发送了,最为最基础的,也是最简单的一种通信方式,值得深入反复学习一下。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1767 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1069 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
727浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
592浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 19:36 , Processed in 1.147957 second(s), Total 76, Slave 60 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号