文章目录
- 1 数据通信的基础概念
- 1.1
- 1.2
- 1.3
- 1.4
- 1.5
- 2 串口(RS-232)
- 2.1
- 2.2
- 2.3
- 2.4
- 2.5
- 3 STM32的USART
- 3.1
- 3.2
- 3.3
- 3.5
- 3.9 USART寄存器介绍
- 4 HAL库外设初始化MSP回调机制
- 5 HAL库中断回调机制
- 6 USART/UART异步通信配置步骤 (包括HAL库相关函数)
- 6.1
- 6.2
- 6.3
- 7 IO引脚复用功能
- 7.1
- 7.2
- 7.2.1
- 7.2.2
- 7.2.3
- 8
- 9
- 10
- usart 是STM32实现串口通信的外设
1 数据通信的基础概念
1.1
- 线少 所以抗干扰能力强 抗干扰能力强 所以通信距离长
1.2
- 半双工 用一个信道
1.3
- 区分:看有时钟不
- 感觉就是同步通信 用时钟告诉你从哪开始 到哪结束?
1.4
0V 00
3V 01
6V 10
9V 11
- 00 01这种就是码元 编码后的
- 对应上面 M是4 也可以看成4进制 0~3
- 记住4 能区分这两就行
1.5
- 有输入输出对应各自通道(信道)就是全双工 公用一个通道就是半双工
2 串口(RS-232)
- RS232 串口的一种
2.1
- 用的最多就是 RS-232 也称为标准串口 RS-485也多
- 传统接口是DB25(基本不用) DB9是简化版接口
- 数据线 握手信号(一般用于同步通信)
- 异步只用这三个 主要用异步通信
- DB9 实物图接口(板子上咋没看见 ) 实物上会有引脚号
2.2
- STM32 用这种 之前我咋记得这两都有 (难道这说的是IO?)
- 太大了 而且反的
2.3
- 线不会交叉连接 , 电路图里可以看到
- DB9基本不用了
2.4
- 应该和手机的接口不同 毕竟这要先电脑上安装驱动(驱动不同?)
- 串口这指的是 usb吗??
2.5
- 这是协议 前面是硬件
- LSB 是最低有效位 位0
3 STM32的USART
3.1
- usart是STM32进行串口通信的外设
- s是同步 a是异步
3.2
- 看参考手册?
- 选型手册看外设数量
- 原理图 或者数据手册 可以看引脚
- usart是 3 (这是选型手册里的)
- 看LQFP144这一列
- 2代表串口2?
3.3
- SW_RX 不必理会 是智能卡接收引脚 没有连到IO口 芯片内部引脚
- 下面那两 是硬件流控制的 同步才用这两
- SCLK 同步时钟 同步才用
- 最上面总线可以通过CPU和DMA访问
- 灰色框里面寄存器用户无法访问 芯片内部工作自行处理 对用户不可见
- 要用DR 自动往TDR里面传
- 然后再等待发送移位寄存器空了
- 无论读写 都操作DR寄存器
- 唤醒单元给接收器用 ()
- 那个是波特率设置寄存器
- TE 和 RE E应该都是ENABLE 发送使能位 1有效
- 下面那是BRR寄存器低16位 波特率设置的值 由/16前面那个决定
- 后面会细讲 设置波特率
- 串口1 的话TXD(对于内部来说) 就是PA9
3.5
- 串口1 72M
- 看挂载到哪 可以看这个图
- 波特率是设置好的
- 算出来 那两会放那寄存器里
- 写进去 波特率就配置好了?
- +0.5是为了四舍五入 会直接省区小数位
- *16 可以看成左移四位
- HAL库 直接把波特率 赋值给结构体里对应的成员就行
3.9 USART寄存器介绍
- 这里所说的配置是以例程源码 这种工作模式为例
- 用9位的比较少 虽然前面有好多选择 但ST公司就给了两
- 上面设置好波特率 也通过CR123 控制工作模式(包括协议 停止位字长 还有什么使能什么的)
- 可以看写数据 读数据 是否完成
- CR1寄存器里那个中断位
- 接收移位寄存器 满8位就往上走 DR里有的时候 SR寄存器位5 置1
- 这两都空 代表发送完成
- TDR空 下面有 是位7
- 都异步了还叫时序
4 HAL库外设初始化MSP回调机制
- 也可能会变点 比如这定时器输出pwm波
- 会自动调用MSP回调函数(内部是空的 相当于接口)
- 和PPP_Init 不一样 这个不带HAL的一般是自己写的
- 作用:比如说用USART1 要用GPIO 也可能用中断的管家NVIC 以及开启他们的时钟
- 不用这个机制就把这些函数 写到用户初始化函数里
- 比如多个串口 串口123
- 比如多个串口 串口123 三个.c 文件 MSP函数只能被定义一次 放哪? 所这时候不建议
- 这用的是异步
- 参数说成句柄(可能是基地址 指针的原因?)
- if里面判断基地址的结构体成员
- uart_Init里是配置uart的 然后 MSP回调函数里配置GPIO
5 HAL库中断回调机制
- 回调函数 xxx根据作用命名
- 这个类型说的就是作用
- 如果不用 把中断处理程序写到中断服务函数里
- 感觉这回调和 HAL库外设初始化MSP回调 没啥区别 都是一个不带HAL开头的函数 调用一个HAL的(还都在下面那个文件里) 然后再调用 回调函数 不过中断回调这第一个函数 是名字给好的(在启动文件里)
- 用哪个重定义哪个
看实际操作了
- 官方的MSP回调 全放这个文件里了 会太大
- 正点原子是 放到对应文件里 比如 usart.c (CubeMX也是)
- 串口驱动文件有四个(HAL库外设初始化那个就在这)
- HAL库外设初始化 中断HAL公用那个 函数 在这 没在 uart.c里
- HAL库的外设初始化函数 调用 MSP
- 反初始化 函数 会失能 把结构体里的成员 复位 清0 调用反MSP
- 少
- 在stm32f1xx_it.c这个文件里面 官方 存放 中断服务函数 和 回调函数
- 不可屏蔽中断 和 硬件错误中断
- 用就写 不用 就不管(官方例程)
- 官方例程里 外设中断(CubeMX也在这) 也没写
- F1 有60个外部中断
- 原子 那it.c 文件一样 但把对应中断函数 放到对应文件里了
- 总: msp.c 删了 it.c 保留了(CubeMX都保留 msp.c没用 it.c用了)
- 又讲了 官方例程 里 HAL库公用中断函数 里 callback函数 出来 要寄存器某些位符合
- ==这还看出来 不是直接掉中断回调的 ==
6 USART/UART异步通信配置步骤 (包括HAL库相关函数)
- 介绍这三
6.1
- 以PPP_HandleTypeDef(后面这种结尾) 称为句柄
- 先看返回值
- 是个枚举类型
- 第一个初始化成功 | 错误 | 再忙初始化错误 | 超时
- 对于初始化 看上面两个 上面是寄存器 下面是 工作参数
- 第一个结构体 里面是串口的寄存器
- 赋值去外设寄存器基地址里找 (和上图结构体在一块 stm32f103x6.h)
- 第二个结构体 初始化工作参数
- 模式 就是 收 发
- 后面两成员用不到 过采样 在F1里面就16倍 没选择
- 奇偶校验位也用不到
- 看哪个成员 给什么值 看后面给的参考值 搜素
6.2
- 带中断的接收函数
- 返回值 是刚才那个枚举类型 4成员
- 形参1 是句柄
- 以字节为单位 可以2个字节也可以3个字节 第二个参数的 uint8_t 无符号字符型 所以一个字节
6.3
- 没有 _it 代表没有开启中断(这中断好迷)(接收中断 发送主动 合理的)
- 阻塞就是 干不完别出来 前面中断型的接收 是非阻塞型的 (发送完跟我说 期间 我可以干别的??)
7 IO引脚复用功能
- 串口要把IO引脚复用为 TX发送引脚 RX接收引脚
7.1
- 通用 GPIO 里 ODR BSRR 控制 IDR采集
- 复用 如:串口, 定时器某个通道 ADC DAC
7.2
7.2.1
- 这个没重定义功能 (这个也算复用功能)
7.2.2
- 两都和他连 就会冲突 两都不正常工作
7.2.3
- 重定义功能就是重映射功能
- 比如PB13冲突了 就可以用PA7 (看样子默认复用功能 各种只出现一次 且全了)
8
- 这里面无论哪种口 都是连接到STM32 TXD 和RXD引脚
- PA9是发送引脚 PA10是接收引脚
- stm32 PA9(对应串口1发送引脚) 和 PA10(对应串口1接收引脚)引脚
- 右边那个大 端子就是前面连接的type c接口 那两ch的 是USB信号
- CH340C 把USB电平 转换为 CMOS 电平
- 等于说是 这里TXD 才是更外面的
把跑马灯实验复制了 usart.c 删减了点
- 定义句柄 (这是UART 所以后面 是 HAL_UART_Init 和 HAL_UART_MspInit 他两参数的问题)
- 这赋值第一个成员的时候 基地址居然还有声明(好像只有USART1 没有UART1)
- 这用基地址用的是usart的 但上面函数(写好的)用的都是uart的
- 这个形参是波特率
- 基地址那个就是USART1
- 这个HAL库外设初始化 里面不用写 就 给个参数
- 这个要重写
(1)
- 找时钟 去rcc.h 里找 再搜索USART1 (不懂 usart1时钟开启在MSP回调里 CubeMX生成的也是)
- 串口1的都是PA9 PA10 所以GPIOA
但程序里面有这个(应该不对 又没说时钟)(不知道这个使能是干嘛了 总不能意思是MSP里 usart1时钟使能了吧 那不自己写的吗)
(2)
- 把led.c里相关IO初始化的拷过来
- 模式要复用 PA9 是TX
- 原理图里没有外部上拉 所以推挽复用
- 空闲时 是高电平 所以用上拉
(3)
- 随意🐍 就好
- 这个 名 有说法 g_ 代表 全局 rx 接收 buffer 缓冲区
- 先去 启动文件里 找名 返回值 形参 好像自己说了算
- HAL库中断共用处理函数 会 清除中断
- 这个函数 上面 调用了 使能UART数据寄存器 非空中断(可理解为接收中断)(应该是打开接收中断)
- 之前讲中断也是先清除标志位再起作用
- 这里 是上面那个函数里的失能
- 所以在 下面要再使能一次
- 还要加个标志 标志 接收到了
然后又去 usart.h里声明了一下 变量 和函数 再在main.c 里包含头文件
- 再在main.c 里 调用usart初始化 写一下发送 (超时随便设)
下面是看发送是否完成
- 第一个参数是句柄 第二个参数 选择
- 还是不懂为啥加 延时
- 这让标志位 = 0 是为了 下个循环 不一定发送
- 总的说 这里 中断就是为了接收用的 发送只用了一个函数 MSP是为了开开usart1相关的东西
- 这个波特率要一样 (这下面几个估计都得一样)
- 再把发送新行 取消
- 发送中文不行 占两个字符
- 证明前面那个强转 多余了
-
再加点提示
-
复位后显示这个
9
- 回车 \r 换行\n
接收
- 这uint16 2^14B 也就是 16KB
- 但这个buf 只能存 200B ?
发送
分析usart.h 头文件
- 里面就是宏定义 IO口 中断 常量
分析usart.c 文件
- 上面是printf 函数
- 大多一样(和自己写的) 主要看 接收回调函数 和中断服务函数
接收回调函数
- 制定接收协议
- &0x3FFF 应该是保险点 🤯
中断服务函数
- 视频里是这么写的 和例程里有点区别 例程里好像没卡死
分析 main.c
- 波特率115200
- 没啥好说的 比较简单
weakness of printf
- 二进制下 波特率等于比特率 所以这个115200 就对应了 1s能有这么多 个比特位 /10 是因为 1+8+1 起始位和终止位
- 1ms 单片机能干好多事了 比如延时1ms 就要循环好多次
- 测试可以用 产品尽量别用
10
- 发送没用中断 接收用了
- P4端子 去连接PA9 PA10 TXD 和 RXD
小小串口 拿捏😋😋😋- 😅😭