单片机型号STM32F407VET6。

概述

GPIO的分类:

  • 可接受5V输入的(FT),绝大多数引脚都是;

  • 只能接受3.3V输入的(TTa),只有PA4PA5,就是DAC输出的两个引脚;

  • 其他,包括BOOT0NRST这两个特殊功能的引脚。

GPIO不仅可以用作GPIO,每个GPIO都有复用功能(alternate function,AF)和附加功能(additional function),AF用GPIOx_AFR来配置,附加功能用外设中的寄存器。

一组GPIO为16个,从Px0Px15xAI,有些封装上有些引脚不存在。

GPIO的功能主要有4类:

  • 输出,推挽(push-pull,PP)或开漏(open-drain,OD),可选上拉(pull-up,PU)或下拉(pull-down,PD),4档速度;

  • AF,细节同上;

  • 输入,可选上拉或下拉;

  • 模拟,用于ADC和DAC。

HAL

HAL把外部中断也归到了GPIO中,这里暂且不涉及外部中断。

初始化这种事情我都交给STM32CubeMX来完成(STM32CubeIDE内置)。我已经初步领略到HAL的设计思想,以后专门开一篇写。

GPIO有以下函数:

  • HAL_GPIO_Init():初始化一组GPIO中的一个或多个;

  • HAL_GPIO_DeInit():把一组GPIO中的一个或多个还原为复位状态;

  • HAL_GPIO_ReadPin():读引脚电平,返回GPIO_PinState枚举类型,可能值为GPIO_PIN_RESET = 0GPIO_PIN_SET = 1

  • HAL_GPIO_WritePin():写引脚电平,是原子操作,允许中断发生;

  • HAL_GPIO_TogglePin():翻转引脚电平;

  • HAL_GPIO_LockPin():锁定引脚配置,在复位前不可修改,引脚电平还可以写。

#include "main.h"
#include <stdbool.h>
int main(void)
{
bool prev = true;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
bool now = HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET;
if (!prev && now)
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
prev = now;
HAL_Delay(1);
}
}

(STM32CubeMX生成的代码是两格缩进的,这让我非常不爽!)

LED0LED1分别连接到PA6PA7,低电平亮;KEY0KEY1分别连接到PE4PE3,上拉。程序的功能为:KEY0按下时LED0亮,松开熄灭;KEY1按下时切换LED1的亮暗状态。

寄存器

每一组GPIO都有10个寄存器:

  • GPIOx_MODER,32位,2位MODERy[1:0]一组(y015,下同),设置GPIO模式;

  • GPIOx_OTYPER,16位,1位OTy一组,设置GPIO输出类型;

  • GPIOx_OSPEEDR,32位OSPEEDRy[1:0],设置GPIO输出速度;

  • GPIOx_PUPDR,32位PUPDRy[1:0],设置上拉下拉;

  • GPIOx_IDR,16位IDRy,读取输入电平;

  • GPIOx_ODR,16位ODRy,设置输出电平;

  • GPIOx_BSRR,低16位BSy,写1GPIOx_ODR中对应位置1;高16位BRy,写1GPIOx_ODR中对应位清0;同时写1BSy优先;

  • GPIOx_LCKR:低16为LCKy,第16位LCKK,需要一个特定的写入过程(参考datasheet或HAL_GPIO_LockPin实现),可以锁定GPIOx_MODERGPIOx_OTYPERGPIOx_OSPEEDRGPIOx_PUPDRGPIOx_AFRLGPIOx_AFRH这6个控制寄存器中的对应位;

  • GPIOx_AFRLGPIOx_AFRH,4位AFRHy[3:0]为一组,设置复用输出。

GPIO的输出级有一个NMOS和一个PMOS:

  • 在推挽输出模式下,ODRx0,NMOS导通;ODRx1,PMOS导通;

  • 在开漏输出模式下,ODRx0,NMOS导通;ODRx1,高阻态;PMOS都不会导通。

开漏输出的应用有矩阵键盘和I²C等,需要上拉电阻,通常用内置的即可。

用寄存器重写上面的程序:

#include "main.h"
#include <stdbool.h> #define LED0_Bit 6
#define LED1_Bit 7
#define KEY0_Bit 4
#define KEY1_Bit 3 int main(void)
{
bool prev = true;
HAL_Init();
SystemClock_Config();
__HAL_RCC_GPIOA_CLK_ENABLE();
LED0_GPIO_Port->ODR |= 1 << LED0_Bit;
LED0_GPIO_Port->MODER |= 0b01 << (LED0_Bit * 2);
LED1_GPIO_Port->ODR |= 1 << LED1_Bit;
LED1_GPIO_Port->MODER |= 0b01 << (LED1_Bit * 2);
__HAL_RCC_GPIOE_CLK_ENABLE();
KEY0_GPIO_Port->PUPDR |= 0b01 << (KEY0_Bit * 2);
KEY1_GPIO_Port->PUPDR |= 0b01 << (KEY1_Bit * 2);
while (1)
{
if (!(KEY0_GPIO_Port->IDR & 1 << KEY0_Bit))
LED0_GPIO_Port->BSRR = 1 << (16 + LED0_Bit);
else
LED0_GPIO_Port->BSRR = 1 << LED0_Bit;
bool now = !(KEY1_GPIO_Port->IDR & 1 << KEY1_Bit);
if (!prev && now)
LED1_GPIO_Port->ODR ^= 1 << LED1_Bit;
prev = now;
HAL_Delay(1);
}
}

只把GPIO相关的改成了寄存器操作,时钟之类的还是用的HAL。

STM32学习笔记——GPIO的更多相关文章

  1. STM32学习笔记——OLED屏

    STM32学习笔记--OLED屏 OLED屏的特点: 1.  模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2.  显示尺寸为0.96寸 3.  分辨率为128*64 4.   ...

  2. STM32学习笔记——点亮LED

    STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...

  3. stm32学习笔记——外部中断的使用

    stm32学习笔记——外部中断的使用 基本概念 stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个.比如说,PA0,PB0 ...

  4. STM32学习笔记(四)——串口控制LED(中断方式)

    目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...

  5. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  6. STM32学习笔记-NVIC中断知识点

    STM32学习笔记-NVIC中断知识点总结 中断优先级设置步骤 1. 系统运行后先设置中断优先级分组 函数:void NVIC_PriorityGroupConfig(uint32_tNVIC_Pri ...

  7. stm32学习笔记之GPIO功能框图分析

    GPIO 是通用输入输出端口的简称,简单来说就是STM32 可控制的引脚,STM32 芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯.控制以及数据采集的功能.STM32 芯片的GPIO被分 ...

  8. STM32学习笔记之一(初窥STM32)

    怎么做好学习笔记? 答:自我感知-->学习知识-->归纳总结-->自我升华(真正属于自己的知识是,抛开书本,运用时,你还能记得的思想) 自我感知--看到知识概念,先自我感觉那应该是个 ...

  9. STM32学习笔记(一)——点亮一个LED

    引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到 ...

随机推荐

  1. 【Java】封装、继承、多态

    封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代 ...

  2. Python的深浅copy详解

    Python的深浅copy详解 目录 Python的深浅copy详解 一.浅copy的原理 1.1 浅copy的定义 1.2 浅copy的方法 二.深copy的原理 2.1 深copy的定义 2.2 ...

  3. D - Leading and Trailing LightOJ - 1282

    题解:求n^k的前三位和后三位. 后三位直接快速幂对1000去余就可以了.前三位可以转换成浮点数来操作,也是用快速幂,我们只保留答案的前三位,当前值大于1000.0的话就除以10,直到结果小于等于10 ...

  4. 尝试用python开发一款图片压缩工具1:尝试 pillow库

    开发目的 我经常使用图片.公众号文章发文也好,还是生活中要使用素材.图片是一种比文字更加直观的载体.但是图片更加占用带宽,很多软件都对图片有大小限制.图片太大也会影响加载速度.我试过几款图片压缩工具, ...

  5. Python 如何移除旧的版本特性,如何迎接新的特性?

    2020 年 4 月 20 日,Python 2 的最后一个版本 2.7.18 发布了,这意味着 Python 2 是真正的 EOL(end of life)了,一个时代终于落幕了. Python 2 ...

  6. vue+element-ui中引入阿里播放器

    1.在public文件下的index.html文件中插入以下代码: <link rel="stylesheet" href="https://g.alicdn.co ...

  7. Java封装 概述

    封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式.好处:隐藏实现细节,提供公共的访问方式提高了代码的复用性提高安全性 封装原则:将不需要对外提供的内容都隐藏起来把属性隐藏,提供公共方法对其访 ...

  8. 开发一款图片压缩工具(二):使用 pngquant 实现图片压缩

    上一篇我尝试使用了 pillow 库对 png 图片进行了压缩,效果不好.这次我换用 pngquant 来压缩.pngquant 是用于 PNG 图像有损压缩的命令行实用程序和库.压缩程序会显著减小文 ...

  9. JVM致命错误日志详解

    目录 文件描述 文件位置 文件头 错误信息记录 JVM运行信息 崩溃原因 错误信息 线程描述 线程信息 信号信息 计数器信息 机器指令 内存映射信息 线程堆栈 其他信息 进程描述 线程列表 虚拟机状态 ...

  10. ST3 package control

    view-> showconsole    (ctrl+`) import urllib.request,os,hashlib; h = 'df21e130d211cfc94d9b0905775 ...