一、前提
学习了STM32CubeMX,但是网上教程很多都是只是过程,没有太多细致的东西,所以自己写一下,有啥错误,请各位大佬指教,互相学习。
二、工具:
1、芯片:STM32F407ZGT6
2、软件:MDK-Keil、STM32CubeMx
三、实验场景
GPIO的输出,LED开关
四、工作原理
1、相关寄存器
MODER寄存器,该寄存器是 GPIO端口模式控制寄存器,用于控制
OTYPER寄存器,该寄存器用于控制 GPIOx的输出类型,该寄存器各位描述见表
OSPEEDR寄存器,该寄存器用于控制 GPIOx的输出速度
PUPDR寄存器,该寄存器用于控制 GPIOx的上拉 /下拉
2、硬件原理
① 保护二极管
保护二极管共有两个,用于保护引脚外部过高或过低的电压输入。当引脚输入电压高于VDD时,上面的二极管导通,当引脚输入电压低于VSS时,下面的二极管导通,从而使输入芯片内部的电压处于比较稳定的值。虽然有二极管的保护,但这样的保护却很有限,大电压大电流的接入很容易烧坏芯片。所以在实际的设计中我们要考虑设计引脚的保护电路。
② 上拉、下拉电阻
它们阻值大概在30~50K欧之间,可以通过上、下两个对应的开关控制,这两个开关由寄存器控制。当引脚外部的器件没有干扰引脚的电压时,即没有外部的上、下拉电压,引脚的电平由引脚内部上、下拉决定,开启内部上拉电阻工作,引脚电平为高,开启内部下拉电阻工作,则引脚电平为低。同样,如果内部上、下拉电阻都不开启,这种情况就是我们所说的浮空模式。浮空模式下,引脚的电平是不可确定的。引脚的电平可以由外部的上、下拉电平决定。需要注意的是,STM32的内部上拉是一种“弱上拉”,这样的上拉电流很弱,如果有要求大电流还是得外部上拉。
③施密特触发器
对于标准施密特触发器,当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变,也就是说输出由高电准位翻转为低电准位,或是由低电准位翻转为高电准位对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化,因此将这种元件命名为触发器。这种双阈值动作被称为迟
滞现象,表明施密特触发器有记忆性。从本质上来说,施密特触发器是一种双稳态多谐振荡器。
④P-MOS管和N-MOS管
这个结构控制GPIO的开漏输出和推挽输出两种模式。开漏输出 输 出端相当于三极管的集电极 要得到高电平状态需要上拉电阻才行 。推挽 输出 :这两只对称的 MOS管每次只有一只导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载拉电流。推拉式输出既能提高电路的负载能力,又能提高开关速度。
GPIO八种工作模式
1、输入浮空
输入浮空模式:
上拉 /下拉电阻为断开状态,施密特触发器打开,输出被禁止。 输入浮空模式下, IO口的电平完全是由外部电路决定。如果 IO引脚没有连接其他的设备,那么检测其输入电平是不确定的。该模式可以用于按键检测等场景。
2、输入上拉
输入上拉模式:上拉电阻导通,施密特触发器打开,输出被禁止。在需要外部上拉电阻的时候,可以使用内部上拉电阻,这样可以节省一个外部电阻,但是内部上拉电阻的阻值较大,所以只是“弱上拉”,不适合做电流型驱动。
3、输入下拉
输入下拉模式:下拉电阻导通,施密特触发器打开,输出被禁止。在需要外部下拉电阻的时候,可以使用内部下拉电阻,这样可以节省一个外部电阻,但是内部下拉电阻的阻值较大,所以不适合做电流型驱动。
4、模拟功能
模拟功能:上下拉电阻断开,施密特触发器关闭,双 MOS管也关闭。该模式用于 ADC采集或者 DAC输出,或者低功耗下省电。
5、开漏输出
开漏输出模式:
STM32的开 漏 输出模式是数字电路 输出的一种 ,从 结果上看它只能输出低电平 Vss或者 高阻态 。根据 《 STM32F4xx参考手册 _V4(中文版 ).pdf》 第 183页关于 GPIO输出配置 的 描述 ,我 们可以推知 开漏模式下 输出电路 大致是这 样工作的:
⚫ P-MOS被“输出 控制 ”控制 在 截止状态, 因此 IO的状态 取 决于 N-MOS的 导通状况 。
⚫ 只 有 N-MOS还受 控制于 输出 寄存器 输出控制器 对 输入信号 进行了 逻辑 非的操作 。
⚫ IO到输入电路 的 采 样电路仍 被打开 且 可以选择是否使用 上 下拉电阻 。
根据参考手册的描述,我们替换
了 “输出 控制 ”部分 作出了如图 13.1.2.7的开漏模式下的简化等效图,图 13.1.2.7中①的输入对应的 ② 的 输出是我们 最 关心的 开 漏输出的结果。简化后的 图 13.1.2.7能 更好 地 表示 开漏输出模式的 输出 关系 。
开漏输出的具体的理解描述如下
开漏模式下,P-MOS管是一直截止的,所以 P-MOS管的栅极一直接 VSS。如果输出数据
寄存器设置为 0时,经过“输出控制”的逻辑非操作后,输出逻辑 1到 N-MOS管的栅极,这
时 N-MOS管就会导通,使得 I/O引脚接到 VSS,即输出低电平。
如果输出数据寄存器设置为1时,经过“输出控制器”的逻辑非操作后,输出逻辑 0到 N-MOS管的栅极,这时 N-MOS管就会截止。因为 P-MOS管是一直截止的,使得 I/O引脚呈现高阻态,即不输出低电平,也不输出高电平。因此要 I/O引脚输出高电平就必须接上拉电阻。这时可以接内部上拉电阻,或者接一个外部上拉电阻。由于内部上拉电阻的阻值较大,所以只是“弱上拉”。需要大电流驱动,请接外部的上拉电阻。此外,上拉电阻具有线与特性,即如果有很多开漏模式的引脚连在一起的时候,只有当所有引脚都输出高阻态,电平才为 1,只要有其中一个为低电平时,就等于接地,使得整条线路都为低电平 0。我们的 IIC通信( IIC_SDA)就用到这个原理。
另外在开漏输出模式下,施密 特触发器是打开的,所以 IO口引脚的电平状态会被采集到输入数据寄存器中,如果对输入数据寄存器进行读访问可以得到 IO口的状态。也就是说开漏输出模式下,我们可以对 IO口进行读数据。
6、推挽输出
推挽输出模式:
STM32的推 挽 输出模式,从 结果上看它 会 输出低电平 VSS或者 高 电平 VDD。
推挽 输出跟开漏输出不同的是,推挽输出模式P-MOS管和N-MOS管都用上。同 样地, 我 们 根据参考 手册 推 挽模式下 的 输出 描述 ,列出等效原理 如 图 13.1.2.8所示,根据手册 描述可以把 “输出 控制 ”简单 地等效为一个 非 门 。
推挽输出的具体的理解描述如下:
如果输出数据寄存器设置为0时,经过“输出控制”的逻辑非操作后,输出逻辑 1到 P-MOS管的栅极,这时 P-MOS管就会截止,同时也会输出逻辑 1到 N-MOS管的栅极,这时 N-MOS管就会导通,使得I/O引脚接到 VSS,即输出低电平。
如果输出数据寄存器设置为1时,经过“输出控制”的逻辑非操作后,输出逻辑 0到 N-MOS管的栅极,这时 N-MOS管就会截止,同时也会输出逻辑 0到 P-MOS管的栅极,这时 P-MOS管就会导通,使得 I/O引脚接到 VDD,即输出高电平。
上面的描述可以知道,推挽输出模式下,P-MOS管和 N-MOS管同一时间只能有一个 MOS管是导通的。 当引脚高低电平切换时,两个管子轮流导通,一个负责灌电流,一个负责拉电流,使其负载能力和开关速度都有很大的提高。
另外在推挽输出模式下,施密特触发器也是打开的,我们可以读取 IO口的电平状态。
由于推挽输出模式输出高电平时,是直接连接VDD ,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达 25mA。该模式也是最常用的输出模式。
7、开漏式复用功能
开漏式复用功能:一个 IO口可以是通用的 IO口功能,还可以是其他外设的特殊功能引脚,这就是 IO口的复用功能。一个 IO口可以是多个外设的功能引脚,我们需要选择作为其中一个外设的功能引脚。当选择复用功能时,引脚的状态是由对应的外设控制,而不是输出数据寄存器。除了复用功能外,其他的结构分析请参考开漏输出模式。
另外在开漏式复用功能模式下,施密特触发器也是打开的,我们可以读取 IO口的电平状态,同时外设可以读取 IO口的信息。
8、推挽式复用功能
推挽式复用功能:复用 功能介绍 请查看开漏式复用功能,结构分析请参考推挽输出模式这里不再赘述。
五、工程创建
1、设置RCC
Disable:禁用外部时钟
BYPASS Clock Source:外部有源晶振(旁路时钟源)
Crystal/Ceramic Resonator:外部无源晶振(陶瓷晶振)
HSE和LSE我们都选择Crystal/Ceramic Resonator
2、设置SYS
Timebase Source:时钟源,我们选择SysTick(滴答定时器)
:Low(低电平),High(高电平)
2、GPIO mode(引脚模式):Output Push Pull(推挽输出)Output Open Drain(开漏输出)
3、GPIO Pull-up/Pull-dowm(上拉/下拉):No pull-up and no pull-dowm(无上下拉)Pull-up(上拉)Pull-down(下拉)
4、Maxinum output speed (引脚速度):Low(低)Medium(中)High(高)Very High(最高)
5、User Label(给引脚设置名称)
4、配置时钟源
5、生成工程程序
注意,存储目录不能有中文,不然就会出现报错
点击GENERATE CIDE即可生成项目
六、程序解析
1、生成的工程文件
2、main函数
3、main.h
User Label(给引脚设置名称)
4、gpio.c
以上的这些其实都是软件中测试的生成的
七、stm32f4xx_hal_gpio库讲解
https://blog.youkuaiyun.com/weixin_42892212/article/details/141627479?spm=1001.2014.3001.5501
八、添加代码
在main中添加下列代码