stm32学习
寄存器( 一种特殊的SRAM)
==连接软件和硬件的桥梁==
一方面:CPU可以对寄存器进行读写,就像读写运行内存一样。
另一方面,寄存器的的每一位背后都连接了一根导线,这些导线可以用于控制外设电路的状态,比如置引脚的高低电平,导通和断开开关,切换数据选择器。
IDE:Integrated Development Environment 集成开发环境
RAM: 20K (SRAM)
ROM: 64K(Flash)
在程序内无法对Flash进行写入操作,只能进行读取操作,除非调用Flash控制器,但这很复杂,包括DMA转运数据,不能将Flash的地址作为目标地址,不然会报错。
而==烧录程序是烧录到Flash==的,ST-link会处理好,接入Flash控制器,解锁 Flash 控制器 -> 擦除指定扇区 -> 逐页写入新数据 -> 校验一致性。
Flash的物理特性决定了只能把位从 1 变成 0,不能直接从 0 变成 1。所以写入新数据前,必须先把目标区域(页或扇区)全部擦成 1。这个“擦除”动作电压很高、耗时较长,必须由Flash控制器内部的高压电路来完成,CPU只能通过设置控制寄存器(如 FLASH_CR)来下达“开始擦除”的命令。
Oscilator 振荡器,简称OSC
引脚定义表

PA13/14/15和PB3/4主功能不是GPIO引脚,要想使用需要调用相应的重映射(remap)函数
主频:72MHz
STM32的主晶振是8MHz,通过PLL模块对其进行**倍频**,8x9=72MHz。
供电:2.0-3.6V(标准是3.3V供电)
注意:51单片机是5V供电,如果5V给stm32供电,必须加装稳压芯片,把电压降低到3.3V。
AHB和APB1和APB2
stm32有三个总线,分别是AHB,APB1和APB2总线
AHB是高速主干道,挂载的外设有DMA,CPU,SRAM,Flash等。
APB2是快速通道,最高频率可达72MHz。一般用于GPIO,TIM1,TIM8(他俩属于高级定时器),ADC模数转换器,AFIO。
APB1是慢速通道,最高频率一般在36MHz。一般用于通用通信接口(如USART2/3,USART4/5,I2C1/2,SPI2/3,CAN总线,USB),通用定时器TIM2-TIM7,PWR(电源)和BKP(备份)。
FT
**Five Tolerant(5V容忍电压)**,带FT的引脚可以容忍5V电压,不带的只能容忍3.3V电压。
VBAT:备份电源
V:电压
BAT:battery 电池
所以VBAT就是备用电源,备用电池。
RTC:实时时钟
real-time-clock 实时时钟,STM32里的计时模块,RTC模块通常包含一个32.768kHz的晶振(因为==2的15次方是32768==,便于分频得到精确的1秒脉冲),即使设备断电,但只要接了*VBAT**,他就会继续给RTC供电,防止时间丢失,下次开机后时间依然是精准的。
一般接OSC32_IN,OSC32_OUT。
而主晶振一般接OSC_IN,OSC_OUT。
VSS/VDD
VSS是负极,VDD是正极。STM32是分区供电,要把所有的VSS都接GND,所有的VDD接3.3V即可。
滤波电容

图中C4是0.1uF的电容,目的是稳定电压,滤除干扰。
复位电路
接NRST引脚,单片机刚上电,NRST经过电容直接接地,表现为低电平,因为此时电容没有电,呈现短路状态。而随着上电后的时间推移,3V3经过电阻,把电输送到电容中,电容不断充电,充满后,电容呈现断路状态,此时NRST通过电阻接3V3,表现为高电平。
若随后手动按下K1复位按钮,则NRST又变为了低电平。
NRST低电平:复位状态。
NRST高电平:工作状态。

上拉电阻
1.接一个上拉电阻可以**增强引脚的输出驱动能力**,因为本质上是并联了一个电阻,根据并联的特点,并的越多,分压越小,所以输出端的电压越大。

2.将不确定的信号牢牢钳位在高电平,**默认输出高电平**。
STM32F103C8T6
STM:意法半导体公司
32:32位的MCU,51单片机是8位
F:通用型,还有L(低功耗),H(高性能)等
1:第一代
03:代表内核是Cortex-M3,主频72Mhz。
C:引脚数为48。
8:代表flash闪存为64KB,6代表32KB,B代表128KB,C代表256KB。
T:封装形式。
6:工作温度。
施密特触发器
两个参考电压,低参考电压和高参考电压,这使得电压在小幅波动时,输出电压不会发生变化,只有大幅变化,达到了另一参考电压时,电压才会发生变化。

16进制
对人类友好,一目了然,且非常方便的转化为2进制。

0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
A:0x1010
B:0x1011
C:0x1100
D:0x1101
E:0x1110
F:0x1111
电位器/电压比较器
电位器:可调电阻,蓝色的方块。
它的内部结构其实就是一个电阻体和一个可以移动的触点。
调节原理:当你用螺丝刀旋转那个十字口时,你其实是在改变内部触点的位置。这会改变两个引脚之间的电阻值。
它用来设定一个“门槛电压”(参考电压)。比如你想让灯在“稍微有点暗”的时候亮,你就把电位器调到一个位置;想“全黑”才亮,就换个位置。
而电压比较器,他是执行的,在你的模块里干嘛:它负责把“电位器设定的门槛”和“传感器测到的数值”进行PK,然后输出结果。
按键一端接GPIO,一端接地
应该按照上面两个图片的方式进行接线,因为一般的单片机都有上拉输入模式,也就是说,当按键断开时,单片机内部会有一个上拉电阻,让PA0口默认保持高电平,而不是悬空状态。但有些单片机没有下拉输入模式,也就是没有一个下拉电阻,所以不能选下面两个接法,不然的可能会导致当按键断开时,PA0处于悬空状态。

RC滤波器

主要作用:让特定频率的信号顺利通过,同时把其他不需要的频率信号(比如噪声)拦截下来。
分为高通滤波器和低通滤波器。
光敏传感器
光敏传感器在有光线的时候,输出低电平,电阻小。
没有光线时,输出高电平,电阻大。
所以对于光敏电阻接入的GPIO作为输入端口时,GPIO模式可以选择上拉输入**也可以选择浮空输入**,因为只要接上光敏电阻,就一定不会出现引脚电平浮空的情况,他一定是一个确定的电平,要么是有光低电平,要么是无光高电平。

EXTI外部中断
指定的GPIO口发生电平变化,EXT将立即向NVIC发出中断请求。
支持触发方式:上升沿/下降沿/双边沿/软件出发(引脚没有电平变化,通过代码去触发)。
要想使用中断,就需要把GPIO———AFIO———EXTI———NVIC这四个模块的时钟都打开,形成通路。但实际上只需要打开GPIO和AFIO的时钟就可以了(通过RCC来开启外设时钟),因为EXTI模块的时钟默认就是打开的,而NVIC是内核的模块,不属于外设,所以不需要通过RCC来开启时钟,他的时钟一直都是开启的。

每一个GPIO都有AFIO,但PIN_x,只有一个EXTI。
EXTI框图

月牙形的逻辑门是或门,半圆形的逻辑门是与门。
或门: 可以有多个输入,只有一个输出,任意一个输入为1,输出就为1。
因此EXTI可以支持软件中断/上升沿触发中断/下降沿触发中断/双边沿触发中断。
与门:可以有多个输入,只有一个输出。
1 & X = X
0 & X = 0
根据与门的性质,中断屏蔽寄存器和事件屏蔽寄存器只有输出1的时候,才能正常输出,而当屏蔽寄存器输出0的话,那无论另一路输入什么,输出的结果都是0,相当于这两个屏蔽寄存器起到了**开关**的作用。
NVIC
NVIC优先级分组,如下图所示:

中断函数选择

只有EXTI0-4有独立的处理函数,而EXTI5-9所用的函数是EXTI9_5_IRQHandler,而EXTI10_15所用的函数是EXTI15_10_IRQHandler。
Rotating Encoder电路图

看A点,在编码器没有导通时,外接了一个上拉电阻,因此,A端口默认高电平,当编码器导通时,A端口接图片中下方的GND,此时A端口为低电平。
B端口同理。
C端口直接接地,默认低电平。
TIM定时器

STM32F103C8T6只有TIM1、TIM2、TIM3、TIM4。也就是说,只有一个高级定时器和3个通用定时器,没有基本定时器。

基本定时器的内部结构图如上所示。
内部时钟(72MHz)——PSC预分频器(最多可以分成2的16次方,也就是65536次)——CNT计数器(计数时钟每来一个上升沿,计数器就+1)——自动充装寄存器(存储目标值的寄存器,计数器的值会不断与目标值进行比较,当计数器的值等于目标值时,就会触发中断,并且自动清零计数器,进行下一次计数)。
定时中断基本结构

这段要结合STM32代码部分学习。
通用定时器内部结构图

OC(Output Compare) 定时器的输出比较
PWM基本结构

PWM频率=72M/(PSC+1)/(ARR+1)
占空比=CCR/(ARR+1)
因此如果想调节频率但不调节占空比的话,就可以只调节PSC。
而只调节占空比不调节频率的话,就可以只调节CCR。
总之ARR(分辨率)一般不变。分辨率越高,ARR越高。默认100-1
复用推挽输出

看图,GPIO的输出控制如果采用普通推挽/开漏输出,那他的数据源完全来自输出数据寄存器。而当他使用复用功能输出时,他的数据源就来自片上外设。这里是TIM2定时器。
IC(Input Capture)定时器的输入捕获
频率测量

左侧是测频法,适用于频率高的数据。
右侧是测周法,适用于频率低的数据。
PMWI(Input)双通道基本结构

双通道测频率和占空比原理
对于上图用来捕获频率和PWM占空比。输入捕获部分设置了两路通道,一路上升沿触发,一路下降沿,而触发源则特定选择了通道一,来触发从模式Reset(计数清零)。所以每次上升沿来了,计数都会清零。但清零前,STM32硬件电路会把计数器CNT的值存到CCR1中,这是硬件电路自己完成的,不需要软件操作。这样我们就通过CNT的计数,知道了一个周期的时间。而通道二下降沿来临,计数器CNT的值会计入到CCR2中。这样就通过CCR2的计数知道了高电平占总周期的比例,即占空比。

主要是选择右侧的从模式
定时器的编码器接口及其库函数
只有TIM的通道一和通道二即TI1FP1和TI2FP2有可以接入编码器接口。

GPIO右边的滤波器和边沿检测/极性选择,本质上都是定时器输入捕获部分的的配置部分。然后通过标准库中TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);函数,STM32 内部的定时器硬件就开启了“自动驾驶”模式:
- 硬件自动检测:定时器内部的电路会实时监控 A、B 两相的电平变化。
- 硬件自动判断方向:根据 A、B 相谁先谁后(相位差 90°),硬件自动决定是让计数器(CNT)加 1 还是减 1。
- 硬件自动计数:CNT 寄存器里的值会随着编码器的转动实时、精准地变化。
之后只需要读取一下CNT的值,用TIM_GetCounter(TIM3);就可以知道旋转了多少旋转了多少角度。具体代码在STM32编写部分有写。
ADC
Analog to Digital Converter :模数转换器。
STM32 单片机(如 STM32F1、F4 系列)内置的 ADC 都是 12位 的。
它把 0V 到参考电压(通常是 3.3V)之间的电压范围,均匀地分成了 2 的 12 次方(即 4096)个刻度。
- 当你测量一个电压时,ADC 会返回一个 0 到 4095 之间的整数。
0代表 0V2048大约代表 1.65V4095代表 3.3V
- 计算公式:
实际电压 = (ADC读取的数值 / 4095) * 3.3V

DMA
DMA工作的三个条件:
- 传输计数器不为0。
- DMA使能。
- 触发源(软件触发/硬件触发)有信号。
==从某一个地址取内容,再放到另一个地址里去。==

DMA1(7个通道)的请求映射,如果软件触发,那通道可以任意选择,但如果硬件触发,那每个硬件触发源都有唯一的通道可以使用。
==每个通道都支持软件触发和特定的硬件触发。==
具体对应关系如图:

存储器映像(地址0x……,16进制)

在程序中定义一般的变量,那这个变量的地址是0x2……,也就是存在SRAM中。
而如果在变量前加上const,那这个变量就成为了常量,那他的地址就为0x08……,也就是被放在了Flash中。
一般固定不变的变量就会在前面加上const转化为常量,放入Flash中,减少SRAM的空间,比如字库(定义字库的数组前面就有const,因此字库数组是被放在Flash中的,而非SRAM)。
串口通信
通信接口

电平标准

配置流程图







