嵌入式铁头山羊stm32:一文总结
目录
一、stm32介绍
1.STM32是什么?
2.扮演什么角色、怎么使用?
3.理解STM32型号 的含义
二、GPIO:General Purpose Input/Output(通用输入输出口)
1.GPIO引脚
2.八种工作模式
(1)输入、输出的区别:
(2)输出:
》GPIO的输出引脚实验:LED闪灯实验
(3)输入
》GPIO的输入引脚实验:按钮持续按下导致灯亮,松开则灭
3.GPIO的所有标准库函数接口
三、硬件通信协议之串口USART(注意区分网络通信协议)
1.定义与结构
》本节也讲了串口调试助手的使用和为啥使用USB转TTL这个设备
2.USART的引脚位置和模式
3.串口的发送数据(核心标准库的SendData())
4.串口的接收数据
5.串口的格式化打印字符串,即:print();
6.标志位
7.编程接口
8.自建的编程接口
四、硬件通信协议之I2C(注意区分网络通信协议)
1.串口的缺点(即有了USART,为啥要有I2C)
2.I2C的基本电路结构
(1)基本电路结构
(2)时钟线和数据线
(3)通信本质(逻辑线与)
(4)通信的流程(核心)
(5)I2C的数据帧格式
3.I2C外设本身模块
(1)结构
(2)IO引脚初始化
(3)自身模块的初始化
(4)发送数据(核心是I2C_SendData()函数)
(5)接收数据
》接收一个字节
》接收两个字节
》接收两个以上字节
(6)标志位
(7)编程接口
(8)自己建立的编程接口
(9)输出和输入测试-使OLED屏幕全亮和读取屏幕是否亮的信号
4.软I2C
(1)硬I2C缺点
(2)IO引脚初始化
(3)自己编写总线上的IO读写函数和延迟函数
(4)发送起始位和停止位
(5)发送一个字节
(6)接收一个字节
(7)自己编写的软I2C编程接口
(8)测试-使OLED屏幕全亮
5.软/硬I2C函数的封装
五、OLED显示器的原理和使用
(1)显示的基本原理(其实本质就是个寄存器,存储着每个像素点的值)
(2)屏幕初始化
(3)画OLED的基本常识
(4)写文字的基本操作
(5)绘图相关的基本操作
六、硬件通信协议之SPI(注意区分网络通信协议)
1.SPI的优点
2.电路结构
3.波形和模块的初始化参数
4.IO初始化的引脚(这里复用了PA15)和模式
5.模块初始化
6.数据发送和接收(为啥不分开写,因为全双工收发是同时的)
7.SPI实验:W25Q64实现断电后的移动硬盘下的灯亮
(1)基本电路
(2)W25Q64的存储结构
(3)传输数据让硬盘进行存储
(4)从硬盘读取数据
(5)实验执行
七、按钮实验
1.持续按压实现持续的点亮或者熄灭灯
2.按钮的点击“后"实现灯的亮/灭
》暴力法:
》EXTI法
3.按钮的点击,双击,长按
八、中断(应对突发事件)
1.概念
2.中断的优点
3.中断初始化(NVIC初始化)
4.中断实验:使用USART发送0/1/2实现闪灯频率的变化
》中断响应函数
》闭合标志位的中断开关
》配置NVIC
九、EXTI(外部中断和事件控制器)
1.概念
2.EXTI的线
3.EXTI的线的内部结构
4.EXTI的IO分配
5.EXTI的初始化
6.EXTI实验:按钮点击后的亮/灭灯(EXTI法)
十、时钟树
1.概念
2.时钟树的结构和关键部分
3.时钟树编程(给芯片提供默认的自定义时钟频率)
十一、定时器
1.概念
2.模块结构之时基单元
(1)时基单元的参数
(2)初始化时基单元
(3)时基单元制造手表的逻辑
(4)利用时基单元以及其中断 去自制延迟函数
3.模块结构之输出比较
(1)概念
(2)PWM
(3)输出捕获本质:CNT和CCRx的比较
(4)输出比较具体结构
(5)输出比较的IO初始化和模块初始化
(6)定时器经典的输出比较实验:呼吸灯实验
4.输入捕获
(1)概念
(2)输入捕获的内部结构
(3)输入捕获结构中各节点的名称
(4)输入捕获的IO初始化与模块初始化
(5)输入捕获经典实验:HCSR-04超声波传感器测距实验
5.从模式控制器
(1)概念
(2)八种从模式、八种主模式
(3)从模式控制器核心编程接口:
(4)从模式控制器的具体结构(主要是看控制器的输入和输出)
(5)从模式控制器的经典实验1:定时器级联或者同时启停
(6)从模式控制器经典实验2:测试输入的PWM信号的参数
十二、ADC(SAR模式)
1.ADC概念
2.ADC的类别
3.ADC的结构
(1)结构1:12位逐次逼近型ADC
》采样深度:
》12位逐次逼近型ADC的组成
》例子:逐次逼近型的电压选取
(2)结构2:多路复用ADC
(3)结构3:常规序列
(4)结构4:注入序列
4.ADC的时钟频率
5.采样时间和转换时间
6.ADC的IO初始化和模块初始化
7.两个主要的标志位
8.ADC的经典实验1:使用软触-常规序列-单通道-得到光敏传感器的量化电压
9.ADC的经典实验2:使用定时器触发-注入序列-单通道-得到光敏传感器的量化电压
10.ADC的经典实验3:使用定时器触发-注入序列-多通道-得到电位器的量化电压
一、stm32介绍
1.STM32是什么?
意法半导体-单片机-32位
ST = STMicroelectronics(意法半导体)
M = Microcontroller(微控制器)
32 = 32-bit(32 位架构,基于 ARM Cortex 内核)
在 STM32 这种单片机里,“32 位”主要有几个含义:
寄存器宽度:CPU 内部的寄存器是 32 位的,一次能装下一个 32 位数据。
数据总线宽度:CPU 和内存之间传输数据时,一次能搬运 32 位。
指令宽度/寻址能力:理论上能直接寻址的内存空间更大(2³² = 4GB)。
运算能力:支持 32 位加减乘除,比 8 位、16 位 MCU 运算更快。
2.扮演什么角色、怎么使用?
管理者(代码管理)、操作者(控制各种外设)
控制 其他外设 去工作
3.理解STM32型号 的含义
ST是品牌,M32是啥类型的,F系列,C8T6是型号
类比vivo 品牌, phone手机这个类型(还要平板,电脑),x系列(比如x30,x100),
128g深蓝的型号(别人是256G黑色等等)
二、GPIO:General Purpose Input/Output(通用输入输出口)
1.GPIO引脚
特殊引脚
常规引脚(因为普通引脚太多给定义了编号ZQ)
2.八种工作模式
(1)输入、输出的区别:
取决于 信号/电流 的流向 或者是谁是主动操作者,比如输出,CPU是主动输出,而CPU的寄存器被动被输入信号 所以叫输入
(2)输出:
》作用:向引脚输出信号
推挽:
推,CPU写1,P-MOS二极管开关闭合,N-MOS二极管断开,因为接着VDD所以输出高电压;
挽:CPU写0,P—MOS二极管断开,N-MOS二极管开关闭合,因为接着VSS,所以引脚被拉到地电压(因为输出的是低电压,所以可以能对外 吸入电流,所以叫挽,但是本质还是CPU控制的输出模式,不要搞混输入输出了)
开漏:
开漏的状况是输出这里的P-MOS引脚始终是断开的,而N-MOS这里的漏极既而始终也是断开的(所以是开漏)。那这种情况下,只存在下方的N-MOS管的闭合和断开的情况了。
闭合是类似于上面推挽的挽,即输出低电压。那断开就是处于一个高阻抗的状态,原因就是断开的话,电流为0,则表示R无限大,所以是高阻抗。
所以开漏这里只存在两种状态:低电压和高阻抗
通用和复用:
通用是cpu直接控制GPIO引脚去输出,
复用是cpu复用外设,外设控制GPIO引脚去输出
最大输出速度
最大输出速度:向IO交替写0和1且输出不失真的最快速度
限制IO的最大输出速度:上升时间和下降时间的长短
最大输出速度的选取:选择满足要求的最小值。比如要求8HMz,那就选取10。
》GPIO的输出引脚实验:LED闪灯实验
LED的线路的接线方式就大概两种(科普):推挽接法、开漏接法
一般线路都有其手册,看其是啥接法。这里选取的板载LED是:开漏接法
(3)输入
》作用:读取输入的信号
》上下保护二极管(目的防静电)
上保护二极管:当输入电压处于合适的范围(0-3.3V),不触发保护,但是当超过VDD的3.3V,比如MCU是当输入的电压>VDD+0.3V就触发输入保护。电流从高电位的GPIO引脚流向VDD。
下保护二极管:同理,合适电压范围不触发。但是当低于0V-0.3V,即低于-03V会触发输入保护。电流从高电位0V(地面)流向GPIO的比如-0.3V(比地面低0.3)
》上下拉电阻
上拉电阻默认高电压。
下拉电阻默认低电压
悬空输入:天线般的电压不稳定
模拟模式:输入的是模拟信号,即自然界的连续的模拟信号
注意:当上拉电阻闭合时,当输入一个低电压,那么最后接收的也是低电压。原因是上拉电阻这里有个高电阻,分压太强,对于整个线路来说真正的电压还是靠输入的这个电压。但是如果是输入悬空下啥也没有传进来,那输入上拉里面的这个电压虽然小但会带些高电压,把整个线路都轻轻拉成高电压。
》施密特触发器
将电压信号转为稳定的数字0或者1
》GPIO的输入引脚实验:按钮持续按下导致灯亮,松开则灭
核心思路:单片机输出低电压,中间线路接个按钮(其实就是控制线路的断与不断),断开就是不通电,不断的话就是直接输出电压信号了。
3.GPIO的所有标准库函数接口
三、硬件通信协议之串口USART(注意区分网络通信协议)
1.定义与结构
硬件之间的通信接口
》本节也讲了串口调试助手的使用和为啥使用USB转TTL这个设备
以及为啥USB转TTL上的GND要和单片机上的GND相连接
2.USART的引脚位置和模式
(因为是片上外设,所以一定是复用而不是通用)
》复用的正常模式
》复用的重映射模式
简单来说就是:开启复用(AFIO)模式就行。
3.串口的发送数据(核心标准库的SendData())
4.串口的接收数据
5.串口的格式化打印字符串,即:print();
重写fputc()函数,使其可以通过USART发送数据出去
6.标志位
TXE:Tx接口是不是Empty的
TC:传输Complete了
Rx:Rx 是not empty的
FE
NE
ORE
7.编程接口
8.自建的编程接口
四、硬件通信协议之I2C(注意区分网络通信协议)
1.串口的缺点(即有了USART,为啥要有I2C)
目的是:前面学习了一种通信协议USART,但是这里为啥还要学第二种,因为串口有
缺点:很明显就是每个串口只能最多和一个设备建立通信连接,即只能一对一的通信。
那比如使用的c8t6上的就三个串口,所以最多只能连接三个设备
而I2C则实现了一个接口就可以连接很多的设备
2.I2C的基本电路结构
(1)基本电路结构
- 一个主机,
- 多个从机(支持100多个,因为7位地址的话,是2^7次=128,从0-127,抛去特殊的地址也还有100多个)
- 两条总线(SCL,SDA)
- 每个设备(主机或者从机)都要连接SCL和SDA线
- 每条总线都要串行一个带有上拉电阻的高电压,
(2)时钟线和数据线
1. 时钟线,SCL(clock),
特点:单向,只能主机往从机发时钟信号,时钟信号显示为:高低变换的信号
---主要用来控制通信的速度
2.数据线,SDA(data),
特点:双向,可以主发从收或者从发主收,数据信号显示为:0/1
注意:一个时钟信号周期下会传输一个数据,所以周期频率越快,数据传输越快(即频率控制快慢)
(3)通信本质(逻辑线与)
随便一个总线(SCL或者是SDA),其他从机默认都是高阻抗下的高电压(其他高阻抗,因上拉电阻的原因,整个线路默认都是高电压),而主机发送电压信号0/1控制整个线路信号
(4)通信的流程(核心)
首先,一定是主机发送起始位,表示通信的开始。
寻址阶段:一定是主机发送一个字节下的(7位的地址+0/1的写读操作位),然后从机响应ACK
之后就是通信双方谁是主,谁是从。
主:发送字节
从:发送ACK响应或者不发送数据即不响应
最后一定是主机发送停止的信号,即发送停止位,表示要停止了
所以注意,整个流程中,只有第二阶段从机才有可能发送数据,其他时间都是主机发送信号;
以及注意不管是主机还是从机发送其本质上:接收方都是高阻抗的开漏输出,而发送方则是靠往自己的SCL/SDA引脚发送0/1信号既而使总线上的信号为高//低电压信号。
(5)I2C的数据帧格式
- 起始位:SCL恒定高电压,SDA下降
- 寻址位:7位地址和1位R/W + ACK的响应
- 数据位(默认的9位:一定也只能是8位的一个字节+一个响应位)。
- 停止位:SCL恒定高电压,SDA上升
注意:寻址位,在主机寻址结束后一定是主机寻址完要会到默认的高电压,但是有人响应了就会把你拉低,没人响应的话自己就会回高。(这就是蓝线和绿线的原理)
数据位,只有在这里才会出现从机发送数据,其他地方都是主机发送数据,即主机发送起始位,主机发送寻址位,主机发送停止位。
注意如果只是发送一个字节的数据,接收方可以不应答,即表示NAK的信号,因为就一个字节,发完不发了,所以不响应也行
3.I2C外设本身模块
(1)结构
SCL控制时钟,SDA控制数据
(2)IO引脚初始化
(3)自身模块的初始化
注意比其他外设,自己要多一个施加复位信号和释放复位信号
(4)发送数据(核心是I2C_SendData()函数)
判断总线是否空闲
发送起始位,并使用SB标志位判断起始位是否发送完成
发送地址位:7位地址和R/W位(注意AF清零,然后ADDR标志位和AF拒绝位的使用)
发送数据(for下发送数据:每次注意AF拒绝位的使用和TXE标志位的使用,检查完后发送数据)
发送完成后使用标志位AF判断是否拒绝以及BTF的标志位
发送停止位