STM32 F1_GPIO
文章目录
一、GPIO(General purpose input output)简介
提示:这里可以添加本文要记录的大概内容:
1.1 特点
Stm32的IO翻转速度最快只需2个时钟周期(超频最高达50Mhz)
每个IO均可作中断
1.2电气特性
STM32IO能输出5V吗
芯片内部无法输出5V
开漏输出可以外接5V上拉
工作电压:2<VDD<3.6
GPIO工作电压范围:CMOS:-0.3≤Vin≤1.164 0
1.833≤Vin≤3.6 1
TTL(FT): -0.5≤Vin≤0.8
2≤Vin≤3.8
在高低电平之间的电压,高低不确定,设计时应该避免这种情况
输出电流:单个引脚最大能输出25mA电流,F103最大输出电流为150mA
1.3 不同型号的IO数量
F103ZET6 7组每组16个
提示:以下是本篇文章正文内容,下面案例可供参考
二、GPIO内部结构
1.保护二极管:用于防止引脚外部过高、过低的电压输入,二极管在此处是起钳位作用
2.上下拉电阻:30K-50K弱上拉电阻,驱动能力弱(3.3/40K≈0.08mA)
3.施密特触发器:将非标准方波整形成方波:
4.MOS管:压控型
STM32F4(上下拉的位置不同)
2.1 八种工作模式
输入:
输入浮空:默认状态不定
输入上拉:默认高
输入下拉:默认低
模拟输入:ADC、DAC
输出:
开漏输出:软件IIC通信
推挽输出:驱动能力强25mA
开漏复用:硬件IIC
推挽复用:片上外设如SPI
2.1.1 开漏输出
上下拉关闭
施密特触发器打开(仍可以读)
PMOS关闭
数据寄存器写0,NMOS打开,可输出低电平
数据寄存器写1,内部浮空状态,(无法从IO口输出高电平)输出高电平必须由外部上拉提供
2.1.2 复用开漏输出
无法通过寄存器来控制输出高低电平,输出通过片上外设决定
2.1.3 推挽输出
上下拉关闭
施密特触发器打开
数据寄存器写0,NMOS打开,可输出高电平
数据寄存器写1,PMOS打开,可输出低电平
2.1.4 复用推挽输出
无法通过寄存器控制输出高低电平,输出通过片上外设决定
2.2 推挽和开漏的特点
以后再补充
2.3 F1和F4/7/H7 IO输出差别
F1在输出的时候不能上下拉
F4/7/H7系列可以在输出的时候设置内部上下拉
三、GPIO寄存器介绍
3.1 STM32F1
STM32F103有7组GPIO,每组有16个IO,并且有七个寄存器。
CRH和CRL
配置输入输出以及工作模式,每个IO由4个BIT位控制,MODE[2]可配置输入还是输出(输出速度),CNF可选择开漏还是推挽或者模拟输入,数字输入。输入模式的上下拉由ODR寄存器选择
ODR
输入模式配置上下拉;输出模式下设置引脚的电平
IDR
只读寄存器,读引脚状态
BSRR[W]
高16位为位清除,写1清除ODR对应位,输出低电平,写0无效
低16位为位设置,写1置ODR对应位1,输出高电平,写0无效
``
只需要搞懂前五个寄存器,另外其余两个为了兼容其他系列不使用
3.2 STM32F4/7
MODER
配置输入输出模式,两个Bit控制一个IO
OTYPER
低16位有效,0推挽1开漏输出
OSPEEDR
输出速度控制,(输入不设置)2BIT控制要给IO
PUPDR
上下拉控制
ODR和BSRR寄存器的区别
在中断/任务调度中ODR会存在风险
推荐使用BSRR
四、软件实现
4.1 软件配置步骤
4.1.1 通用外设
- 初始化:时钟配置、参数设置、IO设置、中断设置
- 读函数(可选)
- 写函数(可选)
- 中断服务函数()
4.1.2 GPIO配置
1.GPIO时钟使能(宏):__HAL_RCC_GPIOX_CLK_ENABLE();
2.设置工作模式:HAL_GPIO_Init();
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
该函数的形参为两个结构体指针变量
GPIO_TypeDef结构体包含的是每组GPIO的寄存器,在该形参中需要传递的是GPIO的基地址,如下:使用哪个GPIO就填哪个
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)
GPIO_InitTypeDef结构体是每个IO口的工作模式选择,该形参中需要传递的是结构体变量的地址,需要新定义结构体变量,对结构体成员设置过后再传递地址。如:
gpio_initstruct.Pin = GPIO_PIN_5;
gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;
gpio_initstruct.Pull = GPIO_PULLUP;
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH; //(10 20 50MHZ)
HAL_GPIO_Init(GPIOB, &gpio_initstruct);
3.设置输出状态:HAL_GPIO_WritePin();
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
该函数形参为结构体指针变量,以及一个u16类型形参,一个枚举类型变量
第一个传递GPIO基地址
第二个选择引脚
第三个选择输出电平,可以用枚举变量
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_TogglePin();
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
//添加延时函数翻转
4.设置输入状态:HAL_GPIO_ReadPin();
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
读取该函数的返回值,即可知道引脚状态
`枚举值作为返回值该怎么用?`
//
4.2简单电路
如1:在共阳极二极管中,推挽和开漏都能控制LED的亮灭
在共阴极二极管中,只有推挽输出才能够控制LED的亮灭
如2:按键获取-软件消抖(在抖动时候判断电平不确定)
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。