STM32F1串口

文章目录

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/640915.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity读写本地excel_2024.4.22

using System.Collections; using System.Collections.Generic; using UnityEngine; using OfficeOpenXml; using System.IO; using Excel; using System.Data; using System; /// <summary> /// https://blog.csdn.net/Xz616/article/details/128893023 /// Unity3D操作…

管理集群工具之LVS

管理集群工具之LVS 集群概念 将很多机器组织在一起&#xff0c;作为一个整体对外提供服务集群在扩展性、性能方面都可以做到很灵活集群分类 负载均衡集群&#xff1a;Load Balance高可用集群&#xff1a;High Availability高性能计算&#xff1a;High Performance Computing …

JS 分片任务的高阶函数封装

前言 在我们的实际业务开发场景中&#xff0c;有时候我们会遇到渲染大量元素的场景&#xff0c;往往这些操作会使页面卡顿&#xff0c;给用户带来非常不好的体验&#xff0c;这时候我们就需要给任务分片执行。 场景复现 我们看一段代码&#xff1a; <!DOCTYPE html> &l…

微软如何打造数字零售力航母系列科普02 --- 微软低代码应用平台加速企业创新 - 解放企业数字零售力

微软低代码应用平台推动企业创新- 解放企业数字零售力 微软在2023年GARTNER发布的魔力象限图中处于头部领先&#xff08;leader&#xff09;地位。 其LCAP产品是Microsoft Power Apps&#xff0c;扩展了AI Builder、Dataverse、Power Automate和Power Pages&#xff0c;这些都包…

[BT]BUUCTF刷题第20天(4.22)

第20天 Web [GWCTF 2019]我有一个数据库 打开网站发现乱码信息&#xff08;查看其他题解发现显示的是&#xff1a;我有一个数据库&#xff0c;但里面什么也没有~ 不信你找&#xff09; 但也不是明显信息&#xff0c;通过dirsearch扫描得到robots.txt&#xff0c;然后在里面得…

keil把c语言函数转成汇编

汇编可以让开发人员从根源上理解程序的运行逻辑&#xff0c;本文介绍如何在keil环境下如何把一个c文件中的某一个函数&#xff0c;转换为汇编函数&#xff0c;并编译运行。 右击某个c文件&#xff0c;选择Option for File。。。 图1 然后把下图中的Generate Assembler SRC Fi…

自动驾驶控制算法

本文内容来源是B站——忠厚老实的老王&#xff0c;侵删。 三个坐标系和一些有关的物理量 使用 frenet坐标系可以实现将车辆纵向控制和横向控制解耦&#xff0c;将其分开控制。使用右手系来进行学习。 一些有关物理量的基本概念&#xff1a; 运动学方程 建立微分方程 主要是弄…

【bug】使用mmsegmentaion遇到的问题

利用mmsegmentaion跑自定义数据集时的bug处理&#xff08;使用bisenetV2&#xff09; 1. ValueError: val_dataloader, val_cfg, and val_evaluator should be either all None or not None, but got val_dataloader{batch_size: 1, num_workers: 4}, val_cfg{type: ValLoop}, …

2024免费MAC苹果电脑系统优化软件CleanMyMac X

CleanMyMac X确实是一款专为Mac用户设计的清理和优化工具。它提供了一系列功能&#xff0c;旨在帮助用户释放磁盘空间、提升Mac的性能&#xff0c;并保护用户的隐私。 CleanMyMac X能够智能地扫描和识别Mac上的各种垃圾文件&#xff0c;如系统缓存、日志文件、无用的语言包等&…

【React】Day6

项目搭建 基于CRA创建项目 CRA是一个底层基于webpack快速创建React项目的脚手架工具 # 使用npx创建项目 npx create-react-app react-jike# 进入到项 cd react-jike# 启动项目 npm start调整项目目录结构 -src-apis 项目接口函数-assets 项目资源文件&…

Rancher-Longhorn-新增磁盘以及卷创建原理和卷副本调度规则

一、添加磁盘-官网指引 重点在于&#xff1a; 1、比如你新增了一块盘&#xff0c;你需要做一下事情&#xff1a; 1、执行 lsblk 能找到你的盘。 2、然后执行 fdisk /dev/sdxx 分区你的盘。 3、然后对于分区部署文件系统&#xff0c; mkfs.xfs 4、然后执行 mount /dev/sdxxx 你…

从数据库中到处所有表的列、注释、类型、是否必填等信息

从数据库中到处所有中文表名、英文表名、所有列、注释、类型、长度、是否必填等信息&#xff0c;效果如下&#xff1a; 要实现上面的表格可以直接用SQL实现&#xff0c;实现SQL如下&#xff1a; #查询SQL select* FROMinformation_schema.COLUMNS as columns left join (sele…