| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 串口通信——基于STM32MP157A -> 正文阅读 |
|
[嵌入式]串口通信——基于STM32MP157A |
本实验将利用UART总线,采用串口通信的方式,发送字符串 一:串口通信方式1:直连方式? ? ? ? 串口共有三根线:RXD(接收数据线)、TXD(发送数据线)、GND(接地线) ? ? ? ? UART总线连接的是soc与target,串口与串口相连时,RXD与对方的TXD相连,GND与GND相连。 ? ?2:USB转串口的连接方式????????SOC采用的是TTL电平,TTL高电平为+5V,低电平为0V;串口电平为RS232电平,高电平为+15v~+3v,低电平为-15v~-3v ?3:ST-LINK仿真器? ? ? ? ST-LINK仿真器的作用,既是完成串口和usb口的转换。在ST-LINK仿真器内部有一个芯片(STM32F103),这个芯片,完成USB口和串口之间转换(在STM32F103内部固化一段程序,这段程序不开源,这段程序可以USB口和串口之间转换)。 ?4:通信协议串口通信的协议如图所示 ?此为一个完整的数据帧。 在电脑的串口工具内配置串口信息时,设置位112500波特率,8N1。 8N1的意思为:8位数据位,N(无奇偶校验位),1位停止位 如下图所示? ?协议解析? ? ? ? 空闲态:UART总线不在传输数据的时候,总线处于空闲状态,为高电平 ? ? ? ? 起始信号:通信开始的标志 ? ? ? ? 数据位:位数由自己指定,注意,数据先发送高位,再发送低位(简单的来说,就是要反着填入数据) ? ? ? ? 奇偶校验位:校验数据是否正确(个人感觉没啥用) ? ? ? ? ? ? ? ? ? ? ? ? 奇校验:数据位的1和校验位的1加起来数量为奇数 ? ? ? ? ? ? ? ? ? ? ? ? 偶校验:数据位的1和校验位的1加起来数量为偶数 ? ? ? ? 停止信号:数据发送完毕以后,回到高电平,校准时钟信号 校验时钟信号的必要性? ? ? ? 因为串口通信为异步通信,通信双方的时钟源相互独立。虽然一开始设置了双方时钟源保持一致,但是在实际发送数据的过程中,每发送一帧数据,都会产生误差,越往后,误差会越累积越大,最终变得难以忽视。为了避免这种情况的发生,每发送一帧数据,都需要进行一次时钟信号校准。 二:分析电路图先找到UART总线的TX端口和RX端口? ?再去主板上寻找对应的引脚 ? ?所以
显然,这俩是GPIOB与GPIOG寄存器管的 三:分析芯片手册由之前的原理图和电路图可知,我们要用到两类寄存器,GPIO和UART,具体为GPIOB、GPIOG、UART4 1:RCC章节分析老样子,先在芯片手册里找总线,GPIO前两个实验找过了,在AHB4总线 ?UART在APB1总线 ?我们本次编写程序依旧采用现成的库,就不去在意起始地址和地址偏移量了,如果想自己封装地址结构体,可以参考我的点亮LED灯——基于STM32MP157A_老K殿下的博客-CSDN博客(引流.jpg)
RCC_MP_APB1ENSETR
2:GPIO章节分析GPIOx_MODER
GPIOx_AFRx寄存器有AFRL和AFRH两个寄存器,两个引脚分别位于AFRL和AFRH上 首先分析AFRL上的 ?然后到《stm32mp157a》芯片手册上查看 ?故,选择AF8模式,即1000
?然后是PG11引脚,它在AFRH寄存器上 ??
3:UART章节
?USART_CR1寄存器? ? ? ? ? ?
USART_CR2寄存器?
?USART_BRR寄存器设置波特率 ?波特率的计算方法为:
USART_RDR寄存器RDR寄存器是存放接收数据的寄存器 ?USART_TDR寄存器TDR寄存器是存放要发送的数据的寄存器,数据存放在[8:0]位 ?USART_PRESC寄存器仅能在[3:0]位输入数据,设置不分频USART_ISR寄存器 ?USART_ISR寄存器?? ? ?至此,全部寄存器分析完毕,接下来是代码实现 四:代码实现因为寄存器部分代码已经分析过了,就不再浪费时间逐一填,直接附上初始化UART4的功能函数源代码 寄存器初始化
?头文件用别人写好的、现成的库
现在的关键,在于字符串发送接收函数的实现 我们要根据串口的通信协议,手动模拟串口数据包(如果谁忘了通信协议是什么样的,自行往上翻阅,写在开头) 要发送字符串,先要实现单个字符的收发 发送单个字符
接收一个字符
发送字符串发送字符串有些许不同,要手都补上换行的功能,在pc中“回车”是相当于'\n'与'\r'的组合,\n是换行,\r是回到行首,所以,在写代码时,要手动补上这两个字符
?接收字符串收到的字符串,存在数组中
|
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:26:48- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |