STM32F1串口

在这里插入图片描述

  • 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
  • 小小串口 拿捏😋😋😋
  • 😅😭

相关推荐

  1. STM32F1 DMA串口接收数据

    2024-04-23 10:40:03       63 阅读
  2. STM32+USART串口1

    2024-04-23 10:40:03       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-23 10:40:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-23 10:40:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-23 10:40:03       82 阅读
  4. Python语言-面向对象

    2024-04-23 10:40:03       91 阅读

热门阅读

  1. 面试经典150题——加油站

    2024-04-23 10:40:03       35 阅读
  2. RabbitMQ:消息队列的卓越之选

    2024-04-23 10:40:03       34 阅读
  3. kubernetes中的静态POD

    2024-04-23 10:40:03       43 阅读
  4. kitti2bag,py 报错

    2024-04-23 10:40:03       59 阅读
  5. P8739 [蓝桥杯 2020 国 C] 重复字符串

    2024-04-23 10:40:03       32 阅读
  6. hive通过正则过滤其他字段

    2024-04-23 10:40:03       39 阅读
  7. 数学分析复习:洛必达法则、泰勒公式

    2024-04-23 10:40:03       40 阅读
  8. AntD上传文件 结合Axios 服务端由Spring MVC接收

    2024-04-23 10:40:03       31 阅读
  9. Hive第二篇HQL

    2024-04-23 10:40:03       37 阅读
  10. Hive第一篇简介

    2024-04-23 10:40:03       30 阅读
  11. 7、docker 集群

    2024-04-23 10:40:03       36 阅读
  12. 数仓建模—维度建模之维度表

    2024-04-23 10:40:03       39 阅读