工程模版


GPIO
简介

基本结构

位结构

1.保护二极管
①保护二极管:对输入电压进行限幅
②Voo 3.3v Vss 0v
③ a.如果输入电压比3.3v高,上方二极管导通,输入电流直接流入Voo,而不会流入内部电路
b.如果输入电压比0v低,下方二极管导通,电流从Vss直接流出去(这个电压是相对于Vss电压,可以有负电 压)
c.如果输入电压在0~3.3v之间,两个二极管均不会导通
2.弱上下拉电阻
④配置上下拉电阻的目的:给输入提供一个默认的输入电平(避免引脚悬空导致输入数据不确定)
配置为弱上下拉的目的:尽量不影响日常输入操作
上闭合,下断开:弱上拉电阻(高电平输入方式)
下闭合,上断开:弱下拉电阻(低电平输入方式)
两个都断开:浮空模式

3.施密特触发器
⑤施密特触发器:对出入电压进行整形
a.如果输入电压大于某一阈值,输出就会瞬间升为高电平
b.如果输入电压小于某一阈值,输出就会瞬间降为低电平
4.输入
⑥用程序读取与输入数据寄存器对应的某一位数据,可知端口输入电平
a.模拟输入:连接到ADC上(ADC需要接收模拟量)

b.复用功能输入:其他需要读取端口的外设,如串口输入引脚等(接收数字量)
5.输出
⑦数字部分输出
a.复用功能输出
b.(普通IO口输出)输出数据寄存器—写数据寄存器某一位可以控制对应端口(同时控制16个端口,只能整体 读写)
c.位设置清除寄存器:单独操作输出数据寄存器的某一位,而不影响其他位
单独控制其中一个端口而不影响其他端口方式
1.读出这个寄存器,用按位与和按位或的方式更 改某一位,最后将更改后的数据写回去(麻烦 ,效率低)
2.通过设置位设置清除寄存器(置1更改,置0保 持不变)
3.读写STM32“位带”区域(在STM32中,专 门分配的有段地址区域,这段地址映射了 RAM和外设寄 存器所有的位,读写这段地址 中的数据,就相当于读写所映射位置的某一位)
位带的操作方式
I 数据寄存器为1时,上管导通,下管断开, 输出直接接到VDD,就是输出高电平
II 数据寄存器为0时,上管断开,下管导通, 输出直接接到VSS,就是输出低电平
6.MOS管(电子开关)
MOS管(电子开关):负责将IO口接到VDD或VSS
a.推挽输出模式
(高低电平均有较强的驱动能力,所以推挽输出模式也可以叫强推输出模式):P-MOS与 N-MOS均有效
在推挽输出模式下,STM32对I0口具有绝对的控制权,高低电平都由STM32说的算
b.开漏输出模式
P-MOS无效,只有N-MOS工作
(这种模式下只有低电平有驱动能力,高电平是没有驱动能力的,在多机通信的情况下, 这个模式可以避免各个设备的相互干扰)
I 数据寄存器为1时,下管断开,这时输出相当于 断开,也就是高阻模式
II 数据寄存器为0时,下管导通,输出直接接 到VSS,也就是输出低电平
开漏输出模式可作为通信协议驱动方式(I2C通 信引脚)
开漏模式还可以用于输出5V的电平信号
(比如在I0口外接一个上拉电阻到5V的电源,当 输出低电平时,由内部的N-MOS直接接 VSS,当输出高电平时,由外部的上拉电阻拉 高至5V,这样就可以输出5V的电平信号,用 于兼容一些5V电平的设备)


c.关闭模式:
当引脚配置为输入模式的时候,这两个MOS管都无效,也就是输出关团,端口的电平由外部信号来控制
模式

在GPI0的这8种模式中,除了模拟输入这个模式会关闭数字的输入功能,在其他的7个模式中,所有的输入都是有效的
LED和蜂鸣器
介绍

硬件电路

限流电阻:一方面它可以防儿LED因为电流过大而烧 毁,另一方面它也可以调整LED的亮度
① 低电平驱动电路(正极接3.3v,负极接PAO)
a.当PA0输出低电平时,LED两端就会产生电压差,就会形成正向导通的电流,这样LED就会点亮了
b.当PA0输出高电平时,因为LED两端都是3.3V的电压,不会形成电流,所以高电平LED就是熄灭
②高电平驱动电路(负极接GND,正极接PAO)
高电平点亮,低电平熄灭了
选择使用高电平驱动还是低电平驱动
a.看这个I0口高低电平的驱动能力如何,高电平驱动能力弱不适合高电平驱动电路
b.使用了高电平弱驱动,低电平的强驱动的规则:一定程度上避免高低电平打架
对于功率稍微大一点的,直接用10口驱动会导致STM32负担过重,所以使用三极管
三极管的左边是基极,带箭头的是发射极,剩下的是集电极
③PNP三极管驱动电路
左边的基极给低电平,三极管就会导通,通过3.3V和GND,就可以给蜂鸣器提供驱动电流了
④NPN三极管驱动电路
基极给高电平,三极管截止,蜂鸣器就没有电流
PNP的三极管最好接在上边,NPN的三极管最好接在下边
按键
按键介绍

按键硬件电路

①按下按键,引脚为低电平,松手,引脚为高电平
a.当按键按下时,PA0被直接下拉到GND,此时读取PA0口的电压就是低电平
b.当按键松手时,PA0被悬空,引脚电压不确定,必须要求PA0是上拉输入的模式,否则就会出现引脚电压不确定的错误现象
②
a.当按键松手时,引脚由于上拉作用,自然保持为高电平
b.当按键按下时,引脚直接接到GND,也就是一股无穷大的力把这个引脚往下拉,引脚就为低电平,这种状态下,引脚不会出现悬空状态
PA0引脚可以配置为浮空输入或者上拉输入
如果是上拉输入,那就是内外两个上拉电阻共同作用了,电平就更加稳定,当引脚被强行拉到低时,损耗也就会大一些
③PA0通过按键接到3.3V,要求PA0必须要配置成下拉输入的模式
当按键按下时,引脚为高电平,松手时,引脚回到默认值低电平
④PAO需要配置为下拉输入模式或者浮空输入模式
传感器

①N1可变电阻:
a.当这个N1阻值变小时,下拉作用就会增强,中间的A0端的电压就会拉低,极端情况下,N1阻值为0,AO输出被完全下拉,输出0V
b.当N1阻值变大,下拉作用就会减弱,中间的引脚由于R1的上拉作用,电压就会升高,极端情况下,N1阻值无夯大,相当于断路,输出电压被R1拉高至VCC
②滤波电容(一端接在电路中,另一端接地的电容)——保证电路稳定,并不是电路主要框架
③LM393电压比较器芯片(运算放大器)
a.当这个同相输入端的电压大于反相输入端的电压时,输出就会瞬间升高为最大值也就是输出接VCC
b.反之当同相输入端的电压小于反相输入端的电压时,输出就会瞬间降低为最小值也就是输出接GND
这样就可以对一个模拟电压进行二值化
④电位器:拧动电位器,IN-就会生成一个可调的阈值电压
调试方式

OLED


中断系统



NVIC


EXTI外部中断
外部中断使用条件:对于STM32来说,想要获取的信号是外部驱动的很快的突发信号
EXTI

外部中断有个功能,就是从低功耗模式的停止模式下唤醒STM32
①PVD输出 :对于PVD电源电压监测,当电源从电压过低恢复时,就需要PVD借助一下外部中断退出停止模式
②RTC闹钟(为了省电):RTC定一个闹钟之后,STM32会进入停止模式,等到闹钟响的时候再唤醒,这也需要借助外部中断
③中断响应:申请中断,让CPU执行中断函数
④事件响应:选择触发事件,那外部中断的信号就不会通向CPU,而是通向其它外设,用来触发其它外设的操作(如触发ADC转换、触发DMA等)
事件响应不会触发中断,而是触发别的外设操作,属于外设之间的联合工作


AFIO

旋转编码器


TIM定时中断

定时器类型

①基本定时器

每隔一段时间在中断程序中调用代码手动触发一次DAC转换,然后DAC输出,使主程序处于频繁被中断的状态,影响主程序的运行和其他中断的响应
主模式触发DAC可以把这个定时器的更新事件,映射到这个触发输出TRGO(Trigger Out)的位置,然后TRGO直接接到DAC的触发转换引脚上,定时器的更新就不需要再通过中断来触发DAC转换,仅需要把更新事件通过主模式映射到TRGO,然后TRGO就会直接去触发DAC,整个过程不需要软件的参与,实现了硬件的自动化,这就是主模式的作用
②通用定时器

a.向下计数模式就是从重装值开始,向下自减,减到0之后,回到重装值同时申请中断,然后继续下一轮,依次循环,这就是向下计数
b.中央对齐的计数模式,就是从0开始,先向上自增,计到重装值,申请中断,然后再向下自减,减到0,再申请中断,然后继续下一轮,依次循环,这是中央对齐模式
③高级控制定时器

1.定时器基本功能(时钟)
基本结构

预分频时序

计数器时序

2.定时器输出比较功能(产生PWM波形,驱动电机)
输出比较简介




PWM简介


第一步,RCC开启时钟,把TIM外设和GPIO外设的时钟打开
第二步,配置时基单元,包括这前面的时钟源选择和这里的时基单元,都配置好
第三步,配置输出比较单元,里面包括这个CCR的值、输出比较模式、极性选择、输出使能这些参数,在库函数里也是用结构体统一来配置的
第四步,配置GPIO,把PWM对应的GPIO口,初始化为复用推挽输出的配置
第五步,就是运行控制,启动计数器,这样就能输出PWM




3.定时器输入捕获功能(测量方波频率)






4.定时器的编码器接口(编码电机测试)







舵机


直流电机驱动


ADC




ADC框图



ADC基本结构

第一步,开启RCC时钟,包括ADC和GPIO的时钟,另外这里ADCCLK的分频器,也需要配置一下然后从左到右
第二步,配置GPIO,把需要用的GPIO配置成模拟输入的模式
第三步,配置这里的多路开关,把左边的通道接入到右边的规则组列表里
第四步,配置ADC转换器
第五步,就是开关控制,调用一下ADC Cmd函数,开启ADC
ADC外围电路

4种转换模式




DMA




第一步,RCC开启DMA的时钟
第二步,直接调用DMA Init,初始化这里的各个参数
(包括外设和存储器站点的起始地址、数据宽度、地址是否自增,方向、传输计数器、是否需要自动重装、选择触发源,通道优先级)这所有的参数,通过一个结构体,就可以配置好
第三步,进行开关控制,DMA_Cmd
硬件触发:在对应的外设调用一下XX DMACmd,开启一下触发信号的输出
DMA的中断:调用DMA ITConfig,开启中断输出,再在NVIC里,配置相应的中断通道,写中断函数
给传输计数器赋值:DMA失能、写传输计数器、DMA使能



通信





USART外设



USART外设的使用思路:
第一步,开启时钟,把需要用的USART和GPIO的时钟打开
第二步,GPIO初始化,把TX配置成复用输出,RX配置成输入
第三步,配置USART,直接使用一个结构体(把这里所有的参数都配置好)
第四步,如果你只需要发送的功能,就直接开启USART,初始化就结束了
如果你需要接收的功能,可能还需要配置中断
在开启USART之前,再加LITConfig和NVIC的代码
初始化完成之后,如果要发送数据,调用一个发送函数
如果要接收数据,就调用接收的函数
如果要获取发送和接收的状态,就调用获取标志位的函数





![]()
如果多个串口都想用printf,用sprintf,可以把格式化字符输出到一个字符串里



USART串口数据包
发送数据包
HEX数据包
优点是,传输最直接,解标数据非常简单,比较适合一些模块发送原始的数据,比如一些使用串口通信的陀螺仪、温湿度传感器
缺点就是灵活性不足、载荷容易和包头包尾重复

1.包头包尾并不是全部都需要的(比如我们可以只要一个包头,把包尾删掉)
2.固定包长和可变包长的选择问题:
对应HX数据包来说,如果你的载荷会出现和包头包尾重复的情况,最好选择固定包长
如果载荷不会和包头包尾重复,可以选择可变包长
3.数据和包头包尾重复,可能会引起误判,解决方法:
第一种,限制载荷数据的范围,在发送的时候,对数据进行限幅
第二种,如果无法避免载荷数据和包头包尾重复,尽量使用固定长度的数据包,这样由于载荷数据是固定的,只要我们通过包头包尾对齐了数据
在接收载荷数据的时候,我们并不会判断它是否是包头包尾
在接收包头包尾的时候,我们会判断它是不是包头包尾
第三种,就是增加包头包尾的数量,并且让它尽量呈现出载荷数据出现不了的状态
文本数据包
优点是,数据直观易理解,非常灵活,比较适合一些输入指令进行人机交互的场合,比如蓝牙模块常用的AT指令,CNC和3D打印机常用的G代码
缺点就是解析效率低

接收数据包



I2C通信
第一块,就是介绍协议规则,然后用软件模拟的形式来实现协议
第二块,就是介绍STM32的12C外设,然后用硬件来实现协议


1.SCL时钟线:从机的权利比较小,对于SCL时钟线,在任何时刻都只能被动的读取,从机不允许控制SCL线
2.SDA数据线:对于SDA数据线,从机不允许主动发起对SDA的控制,只有在主机发送读取从机的命令后,或者从机应答的时候,从机才能短暂地取得SDA的控制权
3.如何规定每个设备SCL和SDA的输入输出模式:
①主机的SCL可以配置成推挽输出,所有从机的SCL都配置成浮空输入或者上拉输入(数据流向是,主机发送,所有从机接收)
②主机的SDA在发送的时候是输出,在接收的时候是输入,同样,从机的SDA也会在输入和输出之间反复切换,避免总线没协调好导致电源短路(半双工的协议)
4.12C的设计是,禁止所有设备输出强上拉的高电平,采用外置弱上拉电阻加开漏输出的电路结构
5.在总线外面SCL和SDA各外置一个上拉电阻作用:
第一,完全杜绝了电源短路现象,保证电路的安全
第二,避兔了引脚模式的频繁切换
第三,就是这个模式会有一个“线与”的现象!
(线与:就是只要有任意一个或多个设备输出了低电平,总线就处于低电平,只有所有设备都输出高电平,才处于高电平)12C可以利用这个电路特性,执行多主机模式下的时钟同步和总线仲裁

发送一个字节
低电平主机放数据,高电平从机读数据

接收一个字节
低电平从机放数据,高电平主机读数据

发送/接收应答




数据收发的核心部分(数据寄存器和数据移位寄存器)
需要发送数据时,可以把一个字节数据写到数据寄存器DR,当移位寄存器没有数据移位时,这个数据寄存器的值就会进一步,转到移位寄存器里,在移位的过程中,就可以直接把下一个数据放到数据寄存器里等着了,一旦前一个数据移位完成,下一个数据就可以无缝衔接,继续发送,当数据由数据寄存器转到移位寄存器时,就会置状态寄存器的TXE位为1,表示发送寄存器为空,输入的数据,一位一位地从引脚移入到移位寄存器里,当一个字节的数据收齐之后,数据就整体从移位寄存器转到数据寄存器,同时置标志位RXNE,表示接收寄存器非空,把数据从数据寄存器读出来,串口是全双工,这里数据收和发是分开的



MPU6050陀螺仪




寄存器
电源管理寄存器1

设备复位(写1,所有寄存器都恢复到默认值)
睡眠模式(写1,芯片睡眠,心片不工作,进入低功耗)
循环模式(写1,设备进入低功耗,过段时间,启动一次)
温度传感器失能(写1之后,禁用内部的温度传感器)
最后3位,用来选择系统时钟来源
电源管理寄存器2

后面6位,可以分别控制6个轴进入待机模式
ID号寄存器

ID号中间这6位,固定为110100
第一个:采样频率分频器,里面的8位为一个整体:作为分频值,配置采样频率的分频系数
配置寄存器

外部同步设置和低通滤波器配置
低通滤波器可以让输出数据更加平滑,配置滤波器参数越大,输出数据抖动就越小(0是不使用低通滤波器,
陀螺仪时钟为8KHZ,使用了滤波器,陀螺仪时钟就是1KHZ)
加速度计配置寄存器

高三位是自测使能位
中间两位是满量程选择
- 配置高通滤波器(内置小功能,运动检测用到的)
SPI通信
软件



波特率发生器时钟的上升沿,所有移位寄存器向左移动一位,移出去的位放到引脚上
波特率发生器时钟的下降沿,引脚上的位,采样输入到移位寄存器的最低位
上升沿之后,下一个边沿就是下降沿,在下降沿时,主机和从机内,都会进行数据采样输入



发送单字节


硬件


W25Q64



Unix时间戳





BKP和RTC
BKP备份寄存器和Flash存储器类似,Flash的数据是真正的掉电不丢失,而BKP的数据,是需要VBAT引脚接上备用电池来维持的

只要VBAT有电池供电,即使STM32主电源断电,BKP的值也可以维持原状




RTCCLK进来,需要首先经过RTC预分频器进行分频
重装载寄存器RTC_PRL
余数寄存器RTC_DIV(还是计数器的作用)
DI,就是每来一个时钟计一个数的用途,DIV计数器,是一个自减计数器,每来一个输入时钟,DIV的值自减一次,自减到0时,再来一个输入时钟,DIV输出一个脉冲,产生溢出信号,同时DIV从PRL获取重装值,回到重装值继续自减,
分频器其实就是一个计数器,计几个数溢出一次,那就是几分频,一个寄存器用来不断地计数,另一个寄存器,我们写入一个计数目标值,用来配置是几分频(重装值写入几,就是几+1分频)


PWR电源控制








看门狗

喂狗操作,其实就是重置递减计数器,减到0之后就复位,程序正常运行时,为了避免复位,就得在这个计数器减到0之前,及时地把计数值加大点
独立看门狗




配置独立看门狗流程
第一步,开启时钟(LSI时钟开启了,独立看门狗才能运行)
如果独立看门狗已经出硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关闭,在LSl振荡器稳定后,时钟供应给IWDG(如果我们开启了独立看门狗,那么与LSI就会跟随强制打开,等LSI稳定后;就可以动为独立看门狗提供时钟)
第二步,解除写保护
第三步,写入预分频器和重装奇存器
最后一步,启动独立看门狗,在主循环里,不断执行进行喂狗
![]()
窗口看门狗



配置窗口看门狗流程
第一步,开启窗口看门狗APB1的时钟
第二步,就是配置各个寄存器(比如,预分频,和窗口值),窗口看门狗没有写保护,第二步就可以直接写这些寄存器
第三步,写入控制寄存器CR(控制寄存器包含,看门狗使能位,计数器溢出标志位和计数器有效位)
最后一步,在运行过程中,不断向计数器写入想要的重装值
独立看门狗和窗口看门狗对比

Flash













1436

被折叠的 条评论
为什么被折叠?



