一:GPIO
1:简历
2:模式
输入 : IO向32发送信号, 即外设发送信号
GPIO_Mode_AIN -----模拟输入
GPIO_Mode_IN_FLOATING -----浮空输入
GPIO_Mode_IPD -----下拉输入
GPIO_Mode_IPU ------上拉输入
GPIO_MODE_INPUT----输入模式
输出 : 32向IO发送信号, 即外设接收信号
输出模式时,可以读取引脚的电平值
F1在输出模式,禁止使用内部上下拉
GPIO_Mode_Out_OD ----开漏输出
GPIO_Mode_AF_OD --------复用开漏输出
GPIO_Mode_Out_PP ------推挽输出
GPIO_Mode_AF_PP ----复用推挽输出
3:位结构
保护二极管:保护过低的输入或者过高的输入;
引脚上的这两个保护二极管可以将引脚外部过高或过低的电压进行钳位,当引脚电压高于VDD_FT 或VDD(3.3V)时,上方的二极管导通吸收这个高电压,当引脚电压低于VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。水平的检测管脚Pin是受保护的节点。当该点电压超过VDD+VD1(0.7V)时,上面的二极管导通。而当该点电压小于-VD2(-0.7V)时,下面的二极管导通。因此,该点电压被钳制在VDD+VD1到-VD2间。
尽管STM32 芯片内部有这样的保护,但并不意味着STM32 的引脚就无所不能,从之前的电流特性表中可知,IO口的电流很小,如果直接将引脚连接大功率器件,比如电机,那么要么电机不转,要么烧坏芯片。因此若要驱动一些大功率器件,必须要加大功率及隔离电路驱动。也可以说STM32引脚是用来做控制,而不是做驱动使用的
内部上拉、下拉电阻
上拉和下拉电阻上都有一个开关,通过配置上下拉电阻开关,可以控制引脚的默认状态电平。当开启上拉时引脚默认电压为高电平,开启下拉时,引脚默认电压为低电平,这样就可以消除引脚不定状态的影响。当然也可以将上拉和下拉的开关都关断,这种状态我们称为浮空模式,一旦配置成这个模式,引脚的电压是不确定的,如果用万用表测量此模式下管脚电压时会发现只有1 点几伏,而且还不时改变,所以一般情况下我们都会给引脚设置成上拉或者下拉模式,使它有一个默认状态。STM32 上下拉及浮空模式的配置是通过GPIOx_CRL 和GPIOx_CRH 寄存器控制的。STM32 内部的上拉其实是一个弱上拉,也就是说通过此上拉电阻输出的电流很小,如果想要输出一个大电流,那么就需要外接上拉电阻了
施密特触发器
P-MOS & N-MOS管
4:八种模式
输入模式
A: 浮空输入
B:下拉输入
C:上拉输入
D:模拟输入
输出模式
A: 开漏输出
B:复用开漏输出
C:推挽输出
D:复用推挽输出
E: 模式总结
二:寄存器
一组有16个IO口
PA0~PA15; PB0~PB15
介绍GPIO相关的寄存器;
A:端口配置低寄存器(CRL)
注意这个是低寄存器,下面的 B:端口配置高寄存器(CRH)是一个高的寄存器;说明64位控制16个IO口; 也就是说4位控制一个IO
B:端口配置高寄存器(CRH)
注意这个是高寄存器,下面的 A:端口配置低寄存器(CRL)是一个高的寄存器;说明64位控制16个IO口; 也就是说4位控制一个IO
C:端口输入数据寄存器(IDR)
1位控一个IO口
D:端口输出数据寄存器(ODR)
1位控一个IO口
E:端口位设置/清除寄存器(GPIOx_BSRR)
三:GPIO配置步骤
__HAL_RCC_GPIOX_CLK_ENABLE在stm32f1xx_hal rcc.h文件夹下面
剩下的4个函数都在stm32f1xx_hal_gpio.h文件里面。
只有输入模式才可以选择上下拉;
四:实验
1: led闪烁
#include "stm32f1xx_hal.h"
#include "rcc.h"
#include "led.h"
#include "delay.h"/*LED的一段接在高电平,所以低电平点亮*/
void LED_Init(void)
{__HAL_RCC_GPIOB_CLK_ENABLE() ;GPIO_InitTypeDef GPIO_InitType;GPIO_InitType.Mode=GPIO_MODE_OUTPUT_PP;GPIO_InitType.Pin=GPIO_PIN_5;GPIO_InitType.Pull=GPIO_NOPULL;GPIO_InitType.Speed=GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB,&GPIO_InitType); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);} int main(void)
{HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72); /* 延时初始化 */LED_Init(); /* LED初始化 */while(1){
// HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
// delay_ms(200);
// HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
// delay_ms(200);HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);delay_ms(200);}}
2:按键控制LED
我们一般采用的是:按键的一段接地;结论---按下低电平, 不按下--高电平
按键一段接电源,那就和上面的相反
判断按键没有按下时是高电平还是低电平,需要根据具体的电路设计和按键的工作原理来确定。
一般来说,按键电路默认一端接地,另一端与I/O相连。当按键没有被按下时,按键电路处于开路状态,此时I/O口所连接的引脚电平状态取决于电路设计。如果电路设计中,按键未按下时通过电阻连接到高电平(例如3.3V或5V,上拉),那么当按键未按下时,I/O口接收到的就是高电平。反之,如果电路设计中,按键未按下时直接与低电平(例如0V或GND下拉)相连,那么当按键未按下时,I/O口接收到的就是低电平。
#include "stm32f1xx_hal.h"
#include "rcc.h"
/*LED的一段接在高电平,所以低电平点亮*/
void LED_Init(void)
{__HAL_RCC_GPIOB_CLK_ENABLE() ;GPIO_InitTypeDef GPIO_InitType;GPIO_InitType.Mode=GPIO_MODE_OUTPUT_PP;GPIO_InitType.Pin=GPIO_PIN_5;GPIO_InitType.Pull=GPIO_NOPULL;GPIO_InitType.Speed=GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB,&GPIO_InitType); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);}
void KEY_Init(void)
{__HAL_RCC_GPIOB_CLK_ENABLE() ;GPIO_InitTypeDef GPIO_InitType;GPIO_InitType.Mode=GPIO_MODE_INPUT;GPIO_InitType.Pin=GPIO_PIN_1;GPIO_InitType.Pull=GPIO_PULLUP; //上拉GPIO_InitType.Speed=GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB,&GPIO_InitType); } uint8_t KEY_Scan(void)
{ //按下if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0){delay_ms(10);if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0){while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0);return 1;}}//按键没有按下return 0;}
int main(void)
{HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72); /* 延时初始化 */LED_Init(); /* LED初始化 */KEY_Init();while(1){if (KEY_Scan()==1){//按下HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);}}}
本视频相关材料
链接:https://pan.baidu.com/s/1eaGxz4OkIzhcatCcs4ZUbg?pwd=5j2p
提取码:5j2p
--来自百度网盘超级会员V2的分享