该篇为基本IO配置,其思路适用于任意款MCU
一、STM32四种管脚模式对比
- 普通推挽输出( GPIO_Mode_Out_PP ) :
使用场合
:一般用在0V 和 3.3V 的场合。线路经过两个P_MOS和 N_MOS管,负责上拉和下拉电流。使用方法
:直接使用输出电平
:推挽输出的低电平是 0V,高电平是 3.3V。 - 普通开漏输出( GPIO_Mode_Out_OD ):
使用场合
:一般用在电平不匹配的场合,如需要输出 5V 的高电平。使用方法:就需要再外部接一个上拉电阻,电源为5V,把 GPIO设置为开漏模式,当输出高组态时,由上拉电阻和电源向外输出5V 的电压。输出电平
:在开漏输出模式时,如果输出为0,低电平,则使 N_MOS导通,使输出接地。若控制输出为 1(无法直接输出高电平), 则既不输出高电平也不输出低电平, 为高组态。为正常使用,必须在外部接一个上拉电阻。特性
: 它具“线与”特性,即很多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态, 才由上拉电阻提供高电平 , 此高电平的 电压 为外部 上拉电阻所接的 电源 的电压。若其中一个引脚为低电平,那线路就相当于短路 接地 ,使得整条线路都为低电平,0 V。 - 复用推挽输出( GPIO_Mode_AF_PP ) : 用作串口的输出。
- 复用开漏输出( GPIO_Mode_AF_OD ):用在 IIC 。
Ps:所有的开漏输出都需要接上拉电阻
二、IO(按键)输入消抖
IO(按键)输入的消抖,往往是嵌入式开发的排名前几门基础课。消抖方法分为2种:1)硬件消抖; 2)软件消抖;这里就不讲解硬件消抖方式,主要讲软件消抖;
软件消抖也分为2种:
- 死循环延迟消抖
- 定时器轮询消抖;
这里讲解采用定时器轮询消抖方式。
- 定时器轮询消抖有什么好处?
- 那 定时器轮询消抖 需要什么?
- 实现思路、功能分层?
Ps:轮询的好处:IO(按键)输入的响应速度,直接与(裸机)系统效率挂钩;一旦其他地方出现问题,程序bug存在可以影响到IO(按键)输入的响应速度;采用轮询机制,在MCU从裸机移植到系统上,也会是十分便利
- 定时器轮询消抖的好处:很明显,相对死循环延迟,定时器轮询 不会空白占用浪费CPU的资源
- 定时器消抖需要一个定时器;往往在MCU系统中,一般有公用基准1ms的定时器,用于各类操作,直接采用该定时器即可
- 实现思路、功能分层?以下均为实现功能的函数
1)(基本的)IO口初始化配置
2)无消抖 单输入(按键)扫描
3)消抖处理:循环调用 无消抖单输入扫描;每次程序重新轮询一次,检查现电平状态相比之前是否翻转;翻转则重新备份时间(采取定时器当前时间),利用备份时间和当前时间 计算出来的时间差,实现延时消抖;
三、IO口自定义功能
IO口自定义是一个在基础功能外扩展的功能;当我们有一定量的IO(按键)输入和输出时,哪个输入(按键)往往都制定好什么功能,输出IO也根据程序条件判断做对应操作;举个例子,当我们想把A键的功能和B键的功能互挪,我们就需要重新更改固件程序;IO口自定义,可以实现无需更改固件程序,直接在线更改输入输出管教功能。
实现思路如下:
将各种功能以枚举的方式罗列出来;利用数组的方式,将 IO口[功能]
和 功能[IO口]
两个数组,相互映射;先由 IO口 映射到 功能 去 ,程序只根据条件变动 功能 ,然后再 功能 映射回 IO口 ,实现底层的电平操作
以下为实现IO口自定义功能的细节:
1)额外设计掉电储存功能;因为当你设置好每个按键功能后,如果掉电不保存,则每次重新上电需要重新设置功能;
2)程序上电初始化,先进行IO口初始化;然后再进行IO口自定义初始化:从掉电存储读取IO功能,更新到对应的IO口;每次更新功能,存储一次对应掉电数据,读取数据只在重新上电初始化执行一次;
3)自定义功能复位;每个可自定义功能的IO口,原本就该有自带的默认功能,然后根据需求再改动,对应的,也要有复位默认功能的操作;
数据掉电保存方法
1)外扩额外的ROM(例:24C02)
2)基于备份寄存器
特点:备份寄存器是依赖者备份电源的,当外界的VDD掉电,只要系统的VBAT能正常存在,那么Bakeup Domaain Registers
的内容可以被正常保存起来。
3)基于内部闪存
原理:FLASH 存储器又称为闪存,它也是可重复擦写的储器。它分为 NOR FLASH 和 NAND FLASH,NOR FLASH一般应用在代码存储的场合,如嵌入式控制器内部的程序存储空间;而 NAND FLASH 一般应用在大数据量存储的场合,如U 盘以及固态硬盘等,一般都是 NAND FLASH 类型的。
在stm32芯片中,Flash的读写单位都是以“页”为单位的,以STM32F103C8T6为例,它的每页大小为2K bytes;
读写保护解除:使用这种方法前提是,当前Flash页的读和写是允许的。
特点:使用该方法,相对比较复杂。但是由于保存数据以页为单位,页的大小可以多达2048bytes,所以该方法可以实用于保存掉电不易失的大数据。考虑到flash读写保护的逻辑机制,该方法最好在不考虑数据的安全性问题前提下,才使用这种方法。