【STM32F1_GPIO】

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 通用外设

  1. 初始化:时钟配置、参数设置、IO设置、中断设置
  2. 读函数(可选)
  3. 写函数(可选)
  4. 中断服务函数()

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提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值