STM32学习笔记——GPIO
单片机型号STM32F407VET6。
概述
GPIO的分类:
可接受5V输入的(FT),绝大多数引脚都是;
只能接受3.3V输入的(TTa),只有
PA4
和PA5
,就是DAC输出的两个引脚;其他,包括
BOOT0
和NRST
这两个特殊功能的引脚。
GPIO不仅可以用作GPIO,每个GPIO都有复用功能(alternate function,AF)和附加功能(additional function),AF用GPIOx_AFR
来配置,附加功能用外设中的寄存器。
一组GPIO为16个,从Px0
到Px15
,x
为A
到I
,有些封装上有些引脚不存在。
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 = 0
和GPIO_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生成的代码是两格缩进的,这让我非常不爽!)
LED0
和LED1
分别连接到PA6
和PA7
,低电平亮;KEY0
和KEY1
分别连接到PE4
和PE3
,上拉。程序的功能为:KEY0
按下时LED0
亮,松开熄灭;KEY1
按下时切换LED1
的亮暗状态。
寄存器
每一组GPIO都有10个寄存器:
GPIOx_MODER
,32位,2位MODERy[1:0]
一组(y
为0
到15
,下同),设置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
,写1
把GPIOx_ODR
中对应位置1
;高16位BRy
,写1
把GPIOx_ODR
中对应位清0
;同时写1
时BSy
优先;GPIOx_LCKR
:低16为LCKy
,第16位LCKK
,需要一个特定的写入过程(参考datasheet或HAL_GPIO_LockPin
实现),可以锁定GPIOx_MODER
、GPIOx_OTYPER
、GPIOx_OSPEEDR
、GPIOx_PUPDR
、GPIOx_AFRL
、GPIOx_AFRH
这6个控制寄存器中的对应位;GPIOx_AFRL
和GPIOx_AFRH
,4位AFRHy[3:0]
为一组,设置复用输出。
GPIO的输出级有一个NMOS和一个PMOS:
在推挽输出模式下,
ODRx
为0
,NMOS导通;ODRx
为1
,PMOS导通;在开漏输出模式下,
ODRx
为0
,NMOS导通;ODRx
为1
,高阻态;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的更多相关文章
- STM32学习笔记——OLED屏
STM32学习笔记--OLED屏 OLED屏的特点: 1. 模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2. 显示尺寸为0.96寸 3. 分辨率为128*64 4. ...
- STM32学习笔记——点亮LED
STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...
- stm32学习笔记——外部中断的使用
stm32学习笔记——外部中断的使用 基本概念 stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个.比如说,PA0,PB0 ...
- STM32学习笔记(四)——串口控制LED(中断方式)
目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...
- stm32学习笔记----双串口同时打开时的printf()问题
stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...
- STM32学习笔记-NVIC中断知识点
STM32学习笔记-NVIC中断知识点总结 中断优先级设置步骤 1. 系统运行后先设置中断优先级分组 函数:void NVIC_PriorityGroupConfig(uint32_tNVIC_Pri ...
- stm32学习笔记之GPIO功能框图分析
GPIO 是通用输入输出端口的简称,简单来说就是STM32 可控制的引脚,STM32 芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯.控制以及数据采集的功能.STM32 芯片的GPIO被分 ...
- STM32学习笔记之一(初窥STM32)
怎么做好学习笔记? 答:自我感知-->学习知识-->归纳总结-->自我升华(真正属于自己的知识是,抛开书本,运用时,你还能记得的思想) 自我感知--看到知识概念,先自我感觉那应该是个 ...
- STM32学习笔记(一)——点亮一个LED
引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到 ...
随机推荐
- python编程语言是什么?它能做什么?
Python是一种全栈的开发语言,你如果能学好Python,前端,后端,测试,大数据分析,爬虫等这些工作你都能胜任. 当下Python有多火我不再赘述,,Python有哪些作用呢? 就目前Python ...
- python基础之函数详解
Python基础之函数详解 目录 Python基础之函数详解 一.函数的定义 二.函数的调用 三.函数返回值 四.函数的参数 4.1 位置参数 4.2 关键字参数 实参:位置实参和关键字参数的混合使用 ...
- 并查集判树 poj 1308
例题: poj 1308 题目大意比较简单,对任意两个点,有且仅有一条道路,也就是一棵树. 题解:一棵树中,肯定是不能有环的,而且只能由一个根节点.(没认真读题,只知道在那里判环....),所以这个题 ...
- 最短路径变形 POJ 2253
Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sit ...
- 原创hadoop2.6.4 namenode HA+Federation集群高可用部署
今天下午刚刚搭建了一个高可用hadoop集群,整理如下,希望大家能够喜欢. namenode HA:得有两个节点,构成一个namenode HA集群 namenode Federation:可以有 ...
- Redis Linux安装+配置
1.进入指定目录,下载资源(也可本地下载后复制到指定目录) wget http://download.redis.io/releases/redis-5.0.5.tar.gz 2.解压到指定目录 ta ...
- python-Django收集主机信息json格式
Control: from django.conf.urls import patterns, include, url from django.contrib import admin admin. ...
- Java中基础类基础方法(学生类)(手机类)
学生类: //这是我的学生类class Student { //定义变量 //姓名 String name; //null //年龄 int age; //0 //地址 String address; ...
- 原生Js贪吃蛇游戏实战开发笔记
前言 本课程是通过JavaScript结合WebAPI DOM实现的一版网页游戏---贪吃蛇的开发全过程,采用面向以象的思想设计开发.通过这个小游戏的开发, 不仅可以掌握JS的语法的应用,还可以学会D ...
- http_response_code()和header()
1.http_response_code — 获取/设置响应的 HTTP 状态码向服务器发送成功状态码:http_response_code(200); 返回值如果提供了response_code,将 ...