文章目录
前言
博主在学习STM32的同时,对学习内容做了较为详细的记录,包括理论知识和代码例程,为了方便整理总结,故发表此博客,希望和大家共同学习,共勉!
一、STM32 GPIO口简介
二、GPIO工作模式
2.1 四种输入:
浮空输入:此端口在默认情况下什么都不接呈高阻态,这种设置在数据传输时用的比较多。
上拉输入:上拉输入模式与浮空输入模式相比,仅仅是在数据通道上部,接入了一个上拉电阻,这个上拉电阻的阻值介于 30K~50K 欧姆,CPU 可以随时在输入数据寄存器的另一端,读出 I/O 端口的电平状态。
这种模式的好处在于我们什么都不输入时,由于内部上拉电阻的原因,处理器会觉得我们输入了高电平,这就避免了不确定的输入。该端口在默认情况下输入为高电平。
下拉输入:下拉输入模式与浮空输入模式相比,仅仅是在数据通道上部,接入了一个下拉电阻。与上拉输入模式类似,这种模式的好处在于外部没有输入时,由于内部下拉电阻的原因,我们的处理器会觉得我们输入了低电平。
模拟输入:STM32 的模拟输入通道的配置很简单,信号从 I/O 端口直接进入 ADC 模块。此时所有的上拉、下拉电阻和施密特触发器,均处于断开状态,因此输入数据寄存器将不能反映端口上的电平状态,也就是说,模拟输入配置下,信号不经过输入数据寄存器,CPU 不能在输入数据寄存器上读到有效的数据。该输入模式,使我们可以获得外部的模拟信号。
2.2四种输出:
开漏输出:开漏输出不可以直接输出高电平,开漏输出的输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。
推挽输出:推挽输出可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由 IC 的电源决定。
开漏复用输出:复用,即GPIO口的状态是由片上外设控制的,GPIO 的基本功能是普通的 I/O,而 STM32 有自己的各个功能模块
二、新建第一个工程
点击扳手,选择UTF8,防止中文乱码
三、库函数配置
Library文件:存放库函数
两个it(interrupt)文件是用来存放中断函数
宏定义:
添加宏定义
库函数:间接配置寄存器
- 使能时钟、
- 配置端口模式
第一个选择显示哪个GPIO,第二个是参数的结构体
跳转查看函数介绍
GPIO_InitTypeDef为结构体类型,GPIO_InitStructure为结构体类型定义的变量
开启使能->定义一个名字》选择推挽模式(高低电平)》选择P13口》速度
GPIO_SetBits选择高电平
GPIO_ResetBits选择低电平
结构体定义放在第一行
三、GPIO基本结构
每个GPIO外设,都有16个引脚,所以只使用低16位
寄存器(32位 )就是特殊的存储器,用于存储数据,内核通过APB2总线对寄存器读写
驱动器用来增加信号的驱动能力
输出寄存器写1,对应引脚输出高电平
输出寄存器写0,对应引脚输出低电平
为了避免引脚悬空导致的输入数据不确定,需要加上上拉电阻或者下拉电阻
上拉输入默认为高电平输入模式
下拉默认为低电平输入模式
开漏模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”会使端口保持高阻态 (Hi-Z)(P-MOS 始终不激活)所以配置为开漏输出外部必须有上拉电阻,一般就面向一些总线设备如IIC。
高阻态(High impedance)表示电路中的某个节点具有相对电路中其他点相对更高的阻抗。通俗的讲,可以看作输出(输入)电阻非常大。它的极限状态可以认为悬空(开路)。也就是说理论上高阻态不是悬空,它是对地或对电源电阻极大的状态。
推挽模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”可激活P-MOS。
施密特触发器:用于对输入电压进行整形,可以有效避免因信号波动造成的输出抖动现象。
施密特触发器(Schmitt trigger)是包含正反馈的比较器电路。
• 当输入电压高于正向阈值电压,输出为高;
• 当输入电压低于负向阈值电压,输出为低;
• 当输入在正负向阈值电压之间,输出不改变,也就是说输出由高电准位翻转为低电准位,或是由低电准位翻转为高电准位时所对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化,因此将这种元件命名为触发器。
施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波波形。
四、工程示例
4.1 LED灯闪烁
第一步:RCC开启GPIO时钟(时钟相当于GPIO外设心脏)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
第二步:使用GPIO_Init函数初始化GPIO
跳转GPIO_Pin的时候,会有多个定义,选择member这一项
点灯用推挽输出
第三步:使用输出或者输入函数控制GPIO口
在Library找到rcc.h这个文件,在.h文件最下遍,一般都是库函数所有函数声明
最常用的RCC函数:AHB,APB2,APB1
介绍:
GPIO外设:
void GPIO_DeInit(GPIO_TypeDef* GPIOx);调用这个外设后,所指定GPIO外设就会被复位
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);用结构体的参数来初始化GPIO口
一般初始化外设都用INIT函数
GPIO_StructInit,这个函数可以把结构体变量赋一个默认值
GPIO_WriteBit()用于将引脚电平置一或者清零(点灯就可以直接用这个)
实现读写函数
4.2 LED流水灯
通过按位或
4.3 按键介绍
示意图:使用引脚PB12口
单片机需要对抖动进行过滤
图一:按下按键引脚为低电平,松手引脚为高电平(常用)
下边两种相反
按键一端接GPIO口,另一端接GND
4.3 按键控制LED
对于驱动代码,一般会进行封装
LED.c用来存放驱动程序的主体代码,LED.h用来存放这个驱动程序对外提供的函数或者变量的声明
没有代码提示的话摁 ctrl+alt+空格(代码提示)
在LED.c初始化完成后将LED_Init初始化函数放到LED.h(注意+分号)
两个下划线前边+空格
Endif和ifndef组成括号
对模块外部声明,这个函数可以被外部调用
在主函数头文件中加入#include “LED.h
void在函数的最前面代表没有返回值,就是KEY初始化这样,void在括号里面代表不输入参数,但需要有返回值
4.5 OLED硬件介绍
硬件电路
Show Char显示函数:第一个参数指定行第二个参数指定列,第三个参数是要显示的字符
ShowNum显示十进制数字,第四个为长度,长度参数比数字长度大,就会在前边补0,比数字长度小,就会把高位切掉
Stm32引脚上电后,如果不初始化,默认浮空输入模式
Keil5调试功能:Debug –使用st-link
五、C语言补充知识
unsigned char无符号字符型
因为左边一列的名字比较长,而且int的位数根据系统的不同也会不同,所以起了新的名字_t表示是用typedef命名的变量类型
宏定义和typedef的区别:宏定义的新名字在左,typedef的新名字在右边且typedef只能专门给变量类型换名字
作用:组合不同类型变量
例:struct{char x;int y;float z;}c即为定义一个结构体变量,名字叫c
结构体的引用:格式为结构体变量名称加点然后为结构体子项的名称,来引用结构体成员,或者使用结构体指针
因为比较长,用typedef将结构体换个名字
在主函数中,还需要给结构体变量类型命名一个结构体变量名字,直接使用结构体变量的名字来引出结构体成员数据