STM32F1串口

文章目录

  • [1 数据通信的基础概念](#1 数据通信的基础概念)
  • [2 串口(RS-232)](#2 串口(RS-232))
  • [3 STM32的USART](#3 STM32的USART)
    • 3.1
    • 3.2
    • 3.3
    • 3.5
    • [3.9 USART寄存器介绍](#3.9 USART寄存器介绍)
  • [4 HAL库外设初始化MSP回调机制](#4 HAL库外设初始化MSP回调机制)
  • [5 HAL库中断回调机制](#5 HAL库中断回调机制)
  • [6 USART/UART异步通信配置步骤 (包括HAL库相关函数)](#6 USART/UART异步通信配置步骤 (包括HAL库相关函数))
  • [7 IO引脚复用功能](#7 IO引脚复用功能)
  • 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
  • 小小串口 拿捏😋😋😋
  • 😅😭
相关推荐
cjy_Somnr31 分钟前
keil5报错显示stm32的SWDIO未连接不能烧录
stm32·单片机·嵌入式硬件
Lay_鑫辰1 小时前
西门子诊断-状态和错误位(“轴”工艺对象 V1...3)
服务器·网络·单片机·嵌入式硬件·自动化
无垠的广袤3 小时前
【工业树莓派 CM0 NANO 单板计算机】本地部署 EMQX
linux·python·嵌入式硬件·物联网·树莓派·emqx·工业物联网
雲烟5 小时前
嵌入式设备EMC安规检测参考
网络·单片机·嵌入式硬件
泽虞5 小时前
《STM32单片机开发》p7
笔记·stm32·单片机·嵌入式硬件
田甲6 小时前
【STM32】 数码管驱动
stm32·单片机·嵌入式硬件
up向上up6 小时前
基于51单片机垃圾箱自动分类加料机快递物流分拣器系统设计
单片机·嵌入式硬件·51单片机
纳祥科技15 小时前
Switch快充方案,内置GaN,集成了多个独立芯片
单片机
单片机日志17 小时前
【单片机毕业设计】【mcugc-mcu826】基于单片机的智能风扇系统设计
stm32·单片机·嵌入式硬件·毕业设计·智能家居·课程设计·电子信息
松涛和鸣17 小时前
从零开始理解 C 语言函数指针与回调机制
linux·c语言·开发语言·嵌入式硬件·排序算法