目录
时钟
Stm32 有5个时钟源:HSI、 HSE、LSI、LSE、PLL
HSE:高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHZ~16MHz。
HSI:高速内部时钟,RC振荡器,频率为8MHZ,精度不高。
LSI:低速内部时钟,频率为40kHz。
LSE:低速外部时钟,接频率为32.768kHz的石英晶体。一般用于实时时钟(RTC)。
PLL:锁相环倍频,将时钟输入源先进行倍频再输出。
AFIO时钟:用到 外部中断 和 端口重映射 的时候要使能AFIO时钟。
GPIO:
浮空输入:输入一个高电平时,会检测到高电平;输入低电平时,会检测到低电平;无信号输入时,该端口的电平是不确定的。
上拉输入:输入一个高电平时,会检测到高电平;输入低电平时,会检测到低电平;无信号输入时,会检测到高电平。
下拉输入:输入一个高电平时,会检测到高电平;输入低电平时,会检测到低电平;无信号输入时,会检测到低电平。
模拟输入:端口的模拟信号直接模拟输入到ADC模块。
开漏输出:当设置输出为高电平的时候,此时I/O端口的电平不一定为高电平,当有上拉电阻时可以输出高电平。当设置输出的值为低电平的时候,此时I/O端口的电平就是低电平。
同时,I/O端口的配置为开漏输出后,可以读取端口的高低电平;
开漏输出具有“线与”功能,一个为低,全部为低。
复用开漏输出:与开漏输出相同,只不过由外设控制高低电平。
推挽输出:当设置输出为高电平时,端口输出高电平。当设置输出为低电平时,端口输出低电平。
当输出低电平以后,端口可以进行输入。
复用推挽输出:与推挽输出相同,只不过由外设控制高低电平。
端口复用:IO口默认是用来做普通的输出输入引脚,而配置为外设需要用到IO口,就叫IO口的复用。
重映射:每个外设都有若干个输入输出引脚,一般这些引脚的输出端口都是固定不变的。但在实际使用中,为了可以更好地安排引脚的走向和功能,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。
列如:串口1除了用PA9PA10外,还可以重映射到PB6,PB7。
中断:
对于CPU来说,当它在正常处理事件A时,突然发生了另一件事件B(中断发生)需要CPU去处理,这时CPU就会暂停处理事件A(中断响应),转而去处理事件B(中断服务)。当事件B处理完以后,再回到事件A原来中断的地方继续执行事件A(中断返回)。
系统异常 :8个
外部中断 :60个
抢占优先级:优先级高的能打断优先级低
响应优先级:当抢占优先级相同时,响应优先级高的先执行
优先级的值越小,优先级越高。
共有五级优先级。
外部中断:
STM32的每个IO都可以作为外部中断输入,可以独立的配置触发方式(上升沿,下降沿或者双边沿触发)。
线0~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。
事件响应不会触发中断,而是触发别的外设操作,属于外设之间的联合工作
定时器:
基本定时器:TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时。
通用定时器:TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以输入捕获、比较输出、PWM生成、单脉冲模式输出。有 4个外IO(TIM1_CH1 /2/3/4)。
高级定时器:TIM1/8是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,有 8 个 IO。
TIM1_CH1/2/3N 与 TIM1_CH1/2/3(6个)TIM1_CH4,TIM1_BKIN是故障信号,关闭TIM1的输出。
定时器的时钟来源有4个:内部时钟(CK_INT),外部时钟模式1(TIx),外部时钟模式2(ETR),内部触发模式(ITRx,这个用来定时器的同步)
向上计数模式:从0向上自增,计数到重装值,清零并申请中断。基本定时器仅支持该模式。
向下计数模式:从重装值开始,向下自减直到0,回到重装值同时申请中断。
中央计数模式:从0开始,先向上自增到重装值,申请中断;再向下自减,减到0,申请中断;继续下一轮,依次循环。
使用场景:
1:基本定时,定时器每隔这个时间产生一个中断,来实现每隔一个固定时间执行一段程序。
2:输出比较,最常见的用途就是产生PWM波形,用于驱动电机等设备。
3:输入捕获,来实现测量波形频率占空比
4:编码器接口,读取正交编码器的输出波形
基本定时:
(1) 开定时器时钟
(2) 初始化时基初始化结构体;
(3) 使能中断;
(4) 打开定时器;
(5) 编写中断服务程序
定时器中断更新时间:T=((arr+1)*(psc+1))/Tclk,ARR为自动装载寄存器(1~65535)、PSC为分频系数,TCLK为输入时钟频率(Mhz)
输出比较:
PWM频率(HZ):Freq = CK_PSC(默认72MHZ) / (PSC + 1) / (ARR + 1)
PWM占空比(%):Duty = CCR / (ARR + 1)
PWM分辨率(%):R = 1 / (ARR + 1),ARR值越大,分辨率越好。
配置:
配置推挽输出GPIO
配置时基单元,
配置输出比较单元(CCR值,模式,极性选择,使能输出)
启动计数器
输入捕获:
1、RCC开启时钟,把GPIO和TIM的时钟打开
2、GPIO初始化,把GPIO配置成输入模式,一般选择上拉或浮空
3、配置时基单元,让CNT计数器在内部时钟的驱动下自增运行
4、配置输入捕获单元,包括滤波器、极性、直连通道还是交叉通道、分频器
5、选择从模式的触发源,触发源选择为TI1FP1(一个库函数给个参数即可)
6、选择触发之后执行的操作,执行Reset操作(一个库函数即可)
7、配置完成,TIM_Cmd函数开启定时器
PWMI模式:第一个捕获通道使用上升沿触发,用来捕获周期,第二个通道使用下降沿触发用来捕获占空比,两个通道同时对一个引脚进行捕获就可同时测量频率和占空比。
1、RCC开启时钟,把GPIO和TIM的时钟打开
2、GPIO初始化,把GPIO配置成输入模式,一般选择上拉或浮空
3、配置时基单元,让CNT计数器在内部时钟的驱动下自增运行
5、配置TRGI触发源为TI1FP1
编码器接口:编码器测速一般应用在电机上,使用PWM波驱动电机,再使用编码器测量电机速度,然后再用PID算法进行闭环控制。它将角位移或者角速度转换成一连串电数字脉冲,可以用来测量位置和速度。每转过单位的角度就发出一个脉冲信号,通常为A相、B相输出。A相、B相为相互延迟1/4周期的脉冲输出(即正交信号),根据延迟关系可以区别正反转,而且通过取A相、B相的上升或下降沿可以进行1、2、4倍频。
模数转换(ADC):
规则组:用于常规使用。
注入组:用于突发情况使用ADC功能。
ADC的规则组可以自定义转换通道顺序和转换的通道个数。在实际应用中,有时候希望有一些特别的通道具有很高的优先权,需要在规则组进行转换的时候强制打断,进行另一个通道的转换,这样一组通道,叫做注入组。
扫描模式:会根据ADC通道数量按顺序进行N次转换,全部转换完成设置 EOC(规则组转换结束) 标志位(播放歌单的全部歌曲)。
非扫描模式:仅会对规则组位置一的通道进行1次转换,转换完成设置 EOC 标志位(播放歌单的第一首歌曲)。
单次转换:在开始转换后,仅仅对规则组整组进行一次转换(音乐只播放一次)。
连续转换:在开始转换后,会循环对规则组整组进行转换(音乐一直播放)。
DMA
数据复制方向支持:存储器到存储器、存储器到外设、外设到存储器。需注意,有的存储器或寄存器不支持写入操作。
数据宽度:支持字节(Byte,8位)、半字(HalfWord,16位)、字(Word,32位),复制对齐为低位对齐。
模式:正常模式(复制完就停下)、循环模式(复制完重新开始)(存储器到存储器只能用正常模式)
串口:
由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。
由起始位、数据位、校验位以及停止位,以及波特率组成,通讯双方的数据包格式要约定一致才能正常收发数据。
波特率:规定每单位时间内,传输的码元,用于异步通讯。
起始和停止信号:起始信号由一个单位时间低电平 的数据位表示,而数据包的停止信号可由 0.5、1、 1.5或 2 个逻辑 1的数据位表示。
I2C
软件模拟I2C优点:可以用在任何GPIO口;不会发生卡死(最多出错)
起始信号:SCL为高电平,SDA拉低
停止信号:SCL为高电平,SDA拉高
数据传输:在SCL为高电平期间,SDA数据有效,SCL为低电平期间,SDA决数据变化。
硬件I2C优点:速度比软件模拟快;容易出现卡死的问题。
起始信号,其具体步骤如下:
- 把SDA置为高电平。
- 把SCL置为高电平,等待一个I2C时钟周期的时间,确保I2C总线空闲。
- 把SDA置为低电平,表示发出起始信号。
- 把SCL置为低电平,为发送第一个字节做准备。
结束信号的步骤如下:
- 把SDA置为低电平,表示发出结束信号。
- 把SCL置为高电平,待半个I2C时钟周期后,把SDA设置为高电平,表示结束传输。
- 软件I2C的读操作
写操作的主体部分,具体步骤如下:
- 发送开始信号
- 发送设备地址和读写控制位,根据具体设备的地址和I2C协议可知道读写控制位在设备地址的最后一位。通常读操作控制位为1,写操作控制位为0。
- 响应设备给出的应答信号。
- 将要写入的数据发送给设备。
- 响应设备给出的应答信号。
- 重复步骤,直到写入所有要发送的数据。
- 发送结束信号。
读操作的主体部分,具体步骤如下:
- 发送开始信号
- 发送设备地址和读写控制位,并响应从设备的应答信号。
- 发送要读取的寄存器地址,并响应从设备的应答信号。
- 发送开始信号
- 发送读取命令,并等待从设备的应答信号。
- 读取从设备发送的数据,并给出应答信号或非应答信号。
- 重复步骤,直到读取到所有所需的数据。
- 发送结束信号。
SPI
NSS:片选设备线,主机选择对应的从机进行传输数据。SPI中规定通信以NSS信号线拉低为开始,拉高为结束。
SCK:时钟信号线,因为是同步通信,所以需要一根时钟信号线来统一主机和从机之间的数据传输。
MOSI:(Master Output, Slave Input),主机输出/从机输入,
MISO:(Master Input,, Slave Output),负责从机向主机传输数据。
CPOL决定SCLK在没有数据传输的时候的电平状态。
CPOL=0:空闲状态时,SCLK保持低电平
CPOL=1:空闲状态时,SCLK保持高电平
CPHA决定数据位传输是从第一个时钟边沿开始,还是从第二个时钟(SCLK)边沿开始。
CPHA=0:数据从第一个时钟(SLCK)边沿开始采集
CPHA=1:数据从第二个时钟(SLCK)边沿开始采集
起始信号:NSS(CS片选线)拉低电平
停止信号:NSS(CS片选线)拉高电平
数据有效性:(采样)当SCK上升沿触发时,下降沿采样的(MISO或MOSI)为有效信号。