【STM32知识回顾】
STM32单片机知识概要
背景
入职嵌入式这个行业已经两年了,项目做了已经有四五个了,做项目的时候用到什么技术就去学什么技术,倒不是没有系统的学过。而是学完之后可能很长一段时间不用,一些细节上的东西都忘的差不多了,接到一个项目知道大概需要用到哪些知识,但是一些细节的东西很难想起来。还需要去网上查资料,从新学一遍。写这篇文章的目的就是为了温故而知新。内容如有错误恳请指正。
一、GPIO
GPIO介绍
GPIO(General Purpose Input Output)通用输入输出口,可配置为8种模式4种输入(上拉输入、下拉输入、浮空输入、模拟输入)4种输出(推挽输出、开漏输出、复用推挽输出、复用开漏输出)其中4种输入比较容易理解,推完输出和复用推完输出容易让迷糊,我理解的是推挽输出就是单片机对IO口的控制。而复用推挽输出即可以当做普通IO使用也可以、把引脚的控制权给到一些片上外设(IIC、SPI、UART、PWM等)。
二、中断
stm32中断
stm32的中断最多有68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等。
NVIC
stm中断由NVIC进行管理,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。
抢占优先级和响应优先级,其实是一个中断所包含的两个优先级,其中前者是对抢占优先级的级别划分,后者是相同抢占优先级的优先级别的划分。
比如:中断A抢占优先级比B高,那么A的中断可以在B里面触发,忽略响应优先级
A和B抢占优先级相同,则A、B的响应优先级决定谁先响应。
EXTI(Extern Interrupt)外部中断
EXTI(Extern Interrupt)外部中断
EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序
支持的触发方式:上升沿/下降沿/双边沿/软件触发
支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断
通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒
触发响应方式:中断响应/事件响应(触发别的外设,属于外设之间的联合工作)
AFIO复用引脚
AFIO主要用于引脚复用功能的选择和重定义
在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择
总结
一般来说中断大多数都是处理突发事件,但是按键触发一版推荐使用定时器中断,即可以后台处理按键值也可以处理案件抖动和松手检测的问题。
TIM定时器
定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。定时器不仅包含定时中断功能,还包含内外时钟源选着、输入捕获、输出比较、编码器接口、主从触发模式等多种功能。根据复杂度和场景的不同分为基础定时器、通用定时器、高级定时器三种。
基础定时器
● 16位自动重装载累加计数器
● 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值分频
● 触发DAC的同步电路
● 在更新事件(计数器溢出)时产生中断/DMA请求
基础定时器主要有三个时基单元构成计数器寄存器(CNT)、预分频寄存器(PSC)、自动重装载寄存器(ARR)。
通用定时器
● 16位向上、向下、向上/向下自动装载计数器
● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值
● 4个独立通道:
─ 输入捕获
─ 输出比较q
─ PWM生成(边缘或中间对齐模式)
─ 单脉冲模式输出
● 使用外部信号控制定时器和定时器互连的同步电路
● 如下事件发生时产生中断/DMA:
─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
─ 输入捕获
─ 输出比较
● 支持针对定位的增量(正交)编码器和霍尔传感器电路
● 触发输入作为外部时钟或者按周期的电流管理
通用定时器有向上计数、向下计数、中央对齐计数模式。
时钟选择
计数器时钟可由下列时钟源提供:
● 内部时钟(CK_INT):一般的定时器中断选择内部时钟。
● 外部时钟模式1:外部输入脚(TIx)
● 外部时钟模式2:外部触发输入(ETR)外部触发输入可以通过TIMx_CH1_ETR引脚输入的波形当作定时器的时钟。一般用来外部触发的计数。
● 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
OC(Output Compare)输出比较
IC(Input Capture)输入捕获
总结
Freq = CK_PSC / (PSC + 1) / (ARR + 1)
15.25hz = 72000000 / 72 / 65535
最小只能测15.25hz 最大1Mhz,如果小于15.25hz 计数器就会溢出。如果想测量1hz的的频率那么分频之后的数值不能大于65536。可以把PSC(预分频)的值设为1100,ARR(重装载)设为65536。
Encoder Interface 编码器接口


总结
通过获取CNT的计数值可以可以得出当前的电机当前位置,通过设置一个闸门时间可以获取电机的速度,如果位置和速度都想获取,在闸门时间加上当前获取到CNT计数值然后把CNT计数器清零。
ADC(Analog-Digital Converter)模数转换器
ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
12位逐次逼近型ADC,1us转换时间
输入电压范围:03.3V,转换结果范围:04095
18个输入通道,可测量16个外部和2个内部信号源
规则组和注入组两个转换单元
模拟看门狗自动监测输入电压范围
stm32单片机ADC触发分为软件触发和硬件触发,硬件触发。软件触发由CPU发出指令进行触发。硬件一半由定时器或者外部引脚输出进行触发。
规则组只有一个16位ADC数据寄存器,如果多个通道检测要及时的把数据转运出去不然数据就会被覆盖,多路数据检测最好配合DMA使用。
ADC的时钟是由RCC的APB2控制。
转换模式分为单次转换、连续转换和扫描模式和非扫描模式组合在一起有4种转换模式。
数据对齐方式一半分为左对齐或是右对齐。
转换时间公式 TCONV = 采样时间 + 12.5个ADC周期例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期 TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs
校准
ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差
建议在每次上电后执行一次校准
启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期
一般直接使用库函数依次调用就行。
DMA(Direct Memory Access)直接存储器存取

存储器映像
DMA框图
DMA基本框图
自动重装器:是计数器计到0的时候是否从新开始计数。
硬件触发:一般是外设请求进行触发。
软件触发:DMA立即触发转运直到吧传输计数器清零。如果使用自动重装器使用软件进行触发那么数据就会一直转运,一直停不下来。
- 传输计数器大于0
- 触发源有触发信号
- DMA使能
给传输计数器赋值的时候,传输要吧DMA失能,才能给传输计数器赋值。
作者:豆瓣酱573