一、总线相关的概念
1.1、总线的含义
定义:总线是不同设备间通信的桥梁
比如:
PC ---------------- UART总线------------------ SOC
SOC(stm32mp157a) --------------- IIC总线 ---------------- 空气温湿度芯片(si7006)
1.2、串行通信 和 并行通信
1.2.1、串行总线
定义:通信双方只有一根双向的数据线,同一时刻传输数据时,需要1bit位,1bit位传输
比如:UART总线,IIC总线,SPI总线,USB总线,RS485总线,CAN总线
1.2.2、并行总线
定义:通信双方具备多条数据线,同一时刻传输数据时,可以多位收发
比如:显示屏,触摸屏,摄像头驱动
1.3、单工通信、半双工通信、全双工通信
1.3.1、单工通信
定义:通信设备,要么只能发送数据,要么只能接收数据,比如广播
1.3.2、半双工通信
定义:通信设备可以发送数据也可以接收数据,但同一时刻,只能发或只能收,如对讲机
1.3.3、全双工通信
定义:通信设备可以发送数据也可以接收数据,同一时刻,既能发也能收,如手机
半双工通信:IIC总线,RS485总线,CAN总线
全双工通信:UART总线,SPI总线
1.4、同步通信和异步通信
1.4.1、同步通信
通信双方共用相同的时钟源,能做到数据接收和数据发送的同步性
1.4.2、异步通信
通信双方使用各自的时钟源进行通信
注意:想要实现异步通信双方数据收发准确性,需要将通信双方的通信速率和通信协议等配置成相同的
1.5、不同总线的特性
1.5.1、UART总线
异步串行全双工总线
UART总线别名:串口通信
1.5.2、IIC总线
同步串行半双工总线
1.5.3、SPI总线
同步串行全双工总线
二、UART总线的硬件连接
2.1、串口通信的硬件(DB9)
2.2、串口通信硬件(DB9)的引脚定义
注意:虽然串口通信需要使用到DB9公/母头,DB9具备9个引脚,但是实际开发中,使用DB9实现串口通信只需要3个线,如下图
串口通信的三线制:
1、TXD线(数据发送线)
2、RXD线(数据接收线)
3、GND线(地线)
2.3、串口的硬件连接
2.3.1、通过USB转串口线的方式
2.3.2、 ST-Link转接器连接方式
2.3.3、 通过USB转串口板的连接方式
三、串口的通信协议(重点)
波特率:串口通信时,1s(1秒)接收或者发送数据的位数,单位bps(bit / s)
常见的波特率:4800 9600 115200
基于下图乱码可得:
串口通信的双发需要配置好UART通信的波特率和协议,才能准确收发正确的数据
常见的串口通信协议:8N1
四、分析原理图
主板原理图:FS_MP1A.pdf(第1页)
主板原理图:FS_MP1A.pdf(第14页)
主板原理图:FS_MP1A.pdf(第5页)
UART4_TX的引脚:PG11
UART4_RX的引脚:PB2
五、分析芯片手册
5.1、分析框图
基于框图可知:
1、需要分析各个外设控制器的基地址
2、需要分析RCC章节
3、需要分析GPIO章节
4、需要分析UART章节
5.2、分析2.5.2章节找RCC GPIOB GPIOG UART4的基地址
芯片手册(2.5.2章节)
由上图可知:
1、RCC的基地址:0x50000000
2、GPIOB的基地址:0x50003000
3、GPIOG的基地址:0x50008000
4、UART4的基地址:0x40010000
5.3、分析RCC章节
芯片手册(第10章节)
由上图可知:
1、RCC_MP_AHB4ENSTER[1] = 0b1 使能GPIOB相关外设
2、RCC_MP_AHB4ENSTER[6] = 0b1 使能GPIOG相关外设
3、RCC_MP_APB1ENSTER[16] = 0b1 使能GPIOB相关外设
5.4、 分析GPIO章节
5.4.1、GPIO介绍
5.4.2、GPIOx_MODER寄存器
由上图可知:
1、GPIOB_MODER[ 5 : 4 ] = 0b10 设置PB2引脚为复用功能
2、GPIOG_MODER[ 23 : 22 ] = 0b10 设置PG11引脚为复用功能
5.4.3、GPIOx_AFRL寄存器
现在需要查看stm32mp157a.pdf的第4章节的表8和表9查看AF0-15对应的模式
由上图可知:
GPIOB_AFRL[11:8] = 0b1000 将PB2引脚配置为UART4_RX的复用功能
5.4.4、GPIOx_AFRH寄存器
由上图可知:
GPIOG_AFRH[15 : 12] = 0b110 将PG11引脚配置为UART4_TX的复用功能
5.5、分析UART章节
5.5.1、UART章节介绍
UART的框图:
5.5.2、USART_CR1寄存器
由上图可知:
1、设置8位数据位:USART_CR1[28] = 0b0, USART_CR1[12] = 0b0
2、设置16倍的采样率:USART_CR1[15] = 0b0
3、禁止校验位:USART_CR1[10] = 0b0
4、使能发送寄存器:USART_CR1[3] = 0b1
5、使能接收寄存器:USART_CR1[2] = 0b1
6、使能串口:USART_CR1[0] = 0b1
5.5.3、USART_CR2寄存器
由上图可知:
配置1位停止位:USART_CR2[13:12] = 0b00
5.5.4、USART_BRR寄存器
由上图可知:
波特率计算公式在stm32mp157a-datasheet.pdf的53.5.7可见
想要设置波特率为115200bps,就需要设置BRR[15:0] = 0x22B(采样率over8 = 0需要在BRR寄存器设置前完成)
5.5.5、USART_ISR寄存器
由上图可知:
USART4_ISR[7] 判断此位是否为1
5.5.6、USART_RDR寄存器
由上图可知:
通过串口接收到的数据会被存档到USART_RDR寄存器中,程序员需要读取RDR寄存器中的数值
5.5.7、USART_TDR寄存器
由上图可知:
我们想要通过串口发送数据,就需要向USART_TDR寄存器中写入数值
5.5.8、USART_PRESC寄存器
由上图可知:
对时钟信号进行不分频操作:USART_PRESC[3:0] = 0b0000
任务:
1、串口字符打印,当串口工具输入a时,串口工具回显b
(回显时ASSCI自动追加1)
2、串口字符串打印,当在串口工具输入this is me后,回车,串口工具再次打印this is me
(串口把收到的字符串给换回来,需要换行并在行首重新打印)
3、串口控制led灯实验,当串口工具输入led1_on时,led1灯亮
4、总结UART通信的理论知识
4.1> UART是几线制?
4.2> UART的特性?
4.3> 串口通信协议?
5、面试题:你是如何通过UART总线进行串口工具显示的?
1> 使用UART总线前需要配置哪些东西?
2> 如何配置的?
3> 实现串口收发时,需要注意哪些内容?