STM32HAL库学习总结(铁头山羊)
·
1.开发环境
- 使用keil5加上stm32cubemx
- 命名规则:



2.GPIO引脚分布

- 其中带彩色的是特定功能的引脚,不能进行编程使用。只能用蓝色的普通IO引脚。


3.IO复用和重映射
- IO复用:同一个IO引脚具备多个不同的功能。既可以给用户编程,也可以给芯片其他引脚使用
- 重映射:将冲突的复用功能转移到备用引脚上去。
4.GPIO的4种输出模式
- GPIO:通用目的的输入/输出

- 随便选取一个引脚,引脚内部是这个样子的。

- 方框加横线就是IO引脚。现在来分析4种输出模式。

- 首先来看到推挽和开漏该怎么区分。其中0/1是向单片机写0或者写1操作。把MOS管看成开关方便分析。

- 总结:

- 通用和复用的概念:通用是cpu直接控制GPIO去输出控制;复用则是cpu控制其他外设,其他外设再去(这就是复用的概念)控制GPIO去输出控制。

5.IO最大输出速度
- 电平上升和下降时间越长,电平越不稳定。反之。
- 一共有3种可以选择。不是速度越快越好,会有干扰。


6.GPIO闪灯实验
- 开漏和推挽的灯泡接法不一样,LED阴极接IO引脚(开漏),LED阳极接IO引脚(推挽),对IO引脚写0/1也不一样。


7.bootloader清除程序
- 假如没有选择这个模式,则程序无法正常烧录单片机

- 假如没选择这个程序,需要使用stm32Programmer进行擦除程序。
8.GPIO的4种输入模式
- 其中模拟输入我们用不上暂时不讨论,我们只讨论剩余的三种。都是看势能哪个电阻对应的哪个模式。

- 为什么有上下拉电阻,因为IO引脚输入模式相当于测量外部电压变化,内阻非常大,相当于开路状态,导致引脚处于悬空状态忽高忽低。

- 上下拉相当于2个电阻串联分压,但是由于有一个R为无穷大分到的电压基本最大(Vdd)。

9.按钮

- 按钮一般只需要设置一个值即可,就是上拉或者下拉。输入模式没有默认设置电平。

10.UART
- 串口数据收发的格式。

- 其中数据位可以选择校验位。奇偶校验防止数据发送错误。

- 波特率是每秒钟传输位的概念

- UART和USART的区别是否支持同步或者异步收发器。

11.UART实战
- 需要通过USB转TTL模块进行电脑和单片机连接。
- 单片机的 USART 模块发出来的是 TTL 电平的串口信号(3.3V/0V)。 电脑的 USB 接口不能直接识别这种 TTL 信号,它只懂 USB 协议。 所以需要一个 USB 转 TTL 模块

- 这里除了异步模式其他都用不到。所以每次有这个选择就选择异步模式。

- STM32自动帮我们生成了句柄。后面使用函数的第一个参数。



- 这个是USART操作的接口。


12.I2C
- STM32只有3个USART,如果想连接更多的设备,就要使用I2C总线进行连接。I2C实现了一个接口就可以连接很多的设备

- I2C的基本结构:

- 开漏输出总结:

- 为啥这里需要使用开漏输出和接2个上拉电阻?为了实现逻辑线与。

- 逻辑线与:便于控制。SCL上的其他从机的SCL引脚都设置为1,而主机的SCL引脚则是0/1变换的, 即主机发送0/1信号给主机的SCL引脚去控制整个总线的时钟信号变换以及数据的发送

- 规定I2C协议下的所有SLA,SDA使用的引脚都是开漏输出(因为需要契合逻辑线与)以及这两个上拉电阻也起了关键的作用。
- I2C的数据帧格式:
- 起始位:

- 寻址:

- 寻址失败就是NAK。寻址成功从机发送一个ACK信号

- 数据传输:以字节为单位传输

- 停止位:

- 举例:I2C总线通信过程。注意颜色的区分。蓝色主机和绿色从机。

- I2C通信的基本流程:
- STM32这块单片机只支持标准模式和快速模式。其中快速模式可以设置SCL占空比。

- cubemx里面的设置:主机只需要设置上面的参数即可。

- 选择快速模式下的设置选项卡:第二个参数是波特率。

- 在I2C里面每一个从机都有一个7位或者10位的地址,我们看手册去看我们的实验对象OLED屏幕的地址是多少?
- 函数编程接口:


13.时钟系统

- 内部成本低,但是精度不行。外部成本高,精度高。
- 从树根到树干到树枝和树叶。其中树干System Clock-系统时钟来自三种来源。锁相环是倍频
- 器,树干也有三个分频器。树叶是片上外设。


- 其中树干的AHB分频器上面有一个Cortex-M3的树叶,代表这单片机处理代码的速度。8M=800万次/秒,给AHB时钟频率越大,代码处理的就越快。


- 我们一般选择晶振,因为最小系统板外接晶振电路

14.SPI总线

- 单片机做为主机可以和大量从机通过SPI总线进行连接
- MOSI:主输出从输入
- MISO:主输入从输出
- SCK:时钟
- NSS:低电压有效的从机选择线
- 举例理解:

SPI的5个参数:

- 波特率:每秒钟传输高低电压的数量
- 比特位的传输顺序:MSB First/LSB First(首先传输哪一个位)
- 数据位长度:

- 举例:传输0xb51f 使用MSB First

- 时钟的极性:看空闲状态是高/低电压

- 时钟的相位:看是第1边沿采集还是第2边沿采集。

- 4种时钟模式:由2种相位和2种时钟极性来得到4种模式

SPI按钮实验
- 将LED状态保存在flash模块里面,就算断电也不影响。
- PC13输出开漏模式,按钮接PA0输入上拉模式,松开是高电压,因为有上拉电阻

- 代码思路:

- stm32cubemx里面设置:
对应开漏,其他不变 - 按键抖动:

- 一般延迟10Ms即可
SPI外部Flash实验
- flash模块相当于移动硬盘,掉电不丢失数据。
- SPI4个引脚。

- SPI和flash模块的对应情况

- cubemx里面的选择:SPI有很多模式,选择哪一个?

- 选择全双工即可。
- 其他设置:

- 看Flash模块的手册分析我们的SPI的选择

- SPI(树叶)的时钟对应

- 模块支持模式0和模式3

- 剩余的设置:

使用SPI



- 为什么要设置接受缓冲区的初始值?不设置在开始接受会发生意想不到的影响。


- 实现2个字节的收发:

- Flash模块的介绍:

- 写入数据前要进行擦除:

- 对页写入数据,过程叫页编程。擦除和写数据前要解锁(写使能)

- 看手册可以得出写使能的口令是0x06。写使能的的代码:

- 扇区擦除口令0x20,擦除24位的扇区首地址,3个字节

- 页编程的口令0x02。24位地址。

- 读出flash模块里面的值:

15.中断的概念:
- 中断源和中断响应函数
- 为什么不能2个任务同时进行。0.5ms远远小于400ms,所以2个任务存在太大误差

中断优先级
- 中断优先级分组:加一条横线


- 中断排队:优先级一样,横线子优先级占比大就是排队等级多
- 中断嵌套:看谁抢占优先级大。
- 举例:

NVIC模块:
- 什么是NVIC


实验:串口中断接收实验

- 主要代码逻辑,while循环也不一定是万能的,可被中断IT打断,改变延迟的值

16.定时器
- 定时器也是时钟树的一片叶子


- 定时器有4个板块

时基单元
-
我们首先了解什么是时基单元
-

- 时钟来源:



- 然后是降频:


- 只有高级定时器才有RCR
- 阴影:是定时器预加载

- 为什么要使用预加载?因为可能存在CNT的值大于ARR的值导致计数跑飞了

- 防止定时器跑飞:可手动开启ARR寄存器的预加载功能。因为是虚线,默认关闭,实线是强制使能无法关闭

自制延迟函数
- HAL_Delay();

- cubemx里面的设置

- 本次只能选择时钟来源:


- 疑问:为啥这里是1ms钟触发一次UPdata?其中MHZ和KMZ是1000的关系


- 函数逻辑:

输出比较


- CCR:是捕获/比较寄存器,与CNT进行比较,然后输出一个值

- 放大结构看细节:

- CCR的模式:

- 反相器和极性的相关概念。

呼吸灯实验
- 模式选择。

- PWM选项卡

- 其余选项作用。

- 新的编程函数:

- CCR为什么决定高电压所占的时间?因为:


- 代码整体逻辑:

输入捕获

- 输入捕获流程:

- 遇见上升沿或者下降沿就拍照保存当前CCR的值。
- 放大具体细节:TRC是从模式,当前不做了解,直接(自己)和间接(别人)

超声波测距
- 什么是超声波:高于人耳所听的频率。

- 主要是输入捕获脉冲宽度
- 参数设置里面的细节:

- 分辨率是精度的概念延申。
- 代码思路:

- 怎么延迟10us?用for循环,这里的8MHZ是



- 其中CC1标志位捕获上升沿,CC2标志位捕获下降沿


从模式定时器


- 常见的从模式控制器模式7种


- 模拟到达ARR的值。

- TRGI高电压才导通:

- 给TRGI一个上升沿就会启动CNT

- TRGI做为定时器的始终来源:


- 主机模式:
- 第一个是看开关状态,当断是低电压,通是高电压,通过TRGO输出出去。

- 每产生一个updata事件TRGO就输出一个脉冲。

- 实验:使用从模式控制器,来测量PWM信号的周期和占空比。

- 代码过程:
- 清除CC1标志位,因为待会要使用CC1标志位,去判断测量的开始与结束。
- 启动定时器,让CNT的值递增。
- 第三部和第四步就是测量开始和结束
- 关闭定时器以及计算结果


编码器实验
- 编码器工作原理:D和E之间是按钮,A和B之间有一个C金属片

- 数脉冲个数得旋转多少度,比较AB的先后关系来看是顺还是逆旋转。
- TI1FP1看尾数字是通道1,TI2FP1也是通道1
- 最后总结看懂这2个图即可:关于为什么这么连接的说明


ADC
- 12位 逐次逼近型ADC
- ADC:Analog to Digital Converter(转换器)

- 12位表示ADC的采样深度

- ADC的采样深度越深,转换结果越精细,采样深度是衡量ADC性能重要指标
- 逐次逼近型ADC相当于天平的使用方法

- 举例的是4位采样深度

ADC模块基本原理



- 设置与原理图是一一对应的。
- 如何管理那么多的ADC模拟信号呢,制定一项计划。常规序列和注入序列都可以去管理ADC开关

- 举例:使用常规序列写入一个5,然后给脉冲信号,让通道五去转换模拟信号


ADC采样时间和转换时间
- 什么是采样时间和转换时间

- ADC1或者2的时钟信号来自APB2,且时钟信号必须小于14MHZ

- 为什么介绍ADC模块的时钟呢?

-

- 采样时间=开关闭合的时间=电容充电的时间
- 为了保证采样精度,需要理解一些概念,RAIN是电源内阻,电源去给电容充放电

- 看内阻多少,去选择对应的周期:

- 问题:最理想的情况下ADC每秒最多执行多少次转换?

ADC单通道转换
- 光敏电阻的原理:

- "常规序列负责周期性的日常采集,最多 16 个通道;注入序列是高优先级紧急通道,最多 4 个,能打断常规序列先转,转完再接续。用两套是因为某些信号(如过流、过温)需要比常规更快的响应,但又不能让其他通道丢数据。
- 常规序列需要采样时间和通道。在MX的设置里面是这样的。

- 第一个参数是:使能常规序列。
- 第二个参数是:转换数量。常规序列有16个格子。


- 每一个方格都需要通道和通道采样时间(主要看给电容充电的内阻)。
- 最后一个参数:


- 软件启动的方式是通过编程向外部触发信号。
- 代码使用函数:

- 第一个函数的作用:

- 第二个函数的作用:

- 标志位在哪?

- 我们看哪个标志位?

- 第三个函数:

- 转换结果保存在哪?结果寄存器里面,常规序列的保存在DR,注入序列保存在JDR

- 故第三个函数的作用是:读取DR寄存器的结果
- 代码思路:

ADC定时器触发

- 输入捕获和输出比较的关系:

- TRGO信号来自哪里?从模式控制器。

- 为了获取updata信号:

- 让这个外部信号不断去触发常规序列

- 怎么让TIM3 1MS溢出一次?

17.自己实践敲代码
USART:


- 生成后的代码。有之前标准库学习的代码书写方式。




IIC:

- slave选项卡说明:

- 第一个GPIO Mode是复用开漏输出,第二个是输出速度


- 小提醒:x&1才等于 x 本身
SPI
- 选择全双工即可。

- 其他的设置:

- SPI 通信必须先拉低 NSS,通信结束再拉高

参考:铁头山羊标准库文章——古译汉书
更多推荐


所有评论(0)