【STM32F407学习笔记】GPIO(一)
【STM32F407学习笔记】GPIO(一)
- 1. GPIO基础知识
- 1.1 GPIO工作方式
- 1.2 GPIO相关配置寄存器
- 1.2.1 端口模式寄存器:GPIOx_MODER
- 1.2.2 输出类型寄存器:GPIOx_OTYPER
- 1.2.3 输出速度寄存器:GPIOx_OSPEEDR
- 1.2.4 上拉/下拉寄存器:GPIOx_PUPDR
- 1.2.5 输入数据寄存器:GPIOx_IDR
- 1.2.6 端口置位/复位寄存器:GPIOx_BSRR(包含BSSRH和BSSRL)
- 2. GPIO输出的相关库函数
- 重要函数
- 3 实验操作
- 3.1 使用库函数进行操作
- 3.2 使用寄存器操作
1. GPIO基础知识
1.1 GPIO工作方式
- 4种输入模式:
- 输入浮空
- 输入上拉
- 输入下拉
- 模拟输入
- 4种输出模式:
- 开漏输出(带上拉或下拉)
- 开漏复用功能(带上拉或下拉)
- 推挽输出(带上拉或下拉)
- 推挽复用功能(带上拉或下拉)
- 4种最大输出速度:
- 2MHz
- 25MHz
- 50MHz
- 100MHz
上电复位后GPIO默认为浮空状态,部分特殊功能引脚为特定状态。
推挽输出:可以输出强高低电平,连接数字器件
开漏输出:只可以输出强低电平,高电平需要靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型驱动
1.2 GPIO相关配置寄存器
每组GPIO端口的寄存器包括10个寄存器:
- 4个32位配置寄存器
- GPIOx_MODER:端口模式寄存器
- GPIOx_OTYPER:输出类型寄存器
- GPIOx_OSPEEDR:输出速度寄存器
- GPIOx_PUPDR:输出上下拉寄存器
- 2个32位数据寄存器
- GPIOx_IDR:输入数据寄存器
- GPIOx_ODR:输出数据寄存器
- 1个端口置位/复位寄存器
- GPIOx_BSRR
- 1个端口配置锁存寄存器
- GPIOx_LCKR
- 2个端口复用功能寄存器
- GPIOx_AFRL
- GPIOx_AFRH
通过这10个寄存器,可以控制一组GPIO的16个IO口
1.2.1 端口模式寄存器:GPIOx_MODER
位2y:2y+1 MODERy[1:0]:端口x配置位(y=0,1,…,15)
- 00:输入(复位状态)
- 01:通用输出
- 10:复用功能模式
- 11:模拟模式
1.2.2 输出类型寄存器:GPIOx_OTYPER
位32:16保留,必须为复位值
位15:0 OTy[1:0]:端口x配置位(y=0,1,…,15)
- 0:输出推挽(复位状态)
- 1:输出开漏
1.2.3 输出速度寄存器:GPIOx_OSPEEDR
位2y:2y+1 OSPEEDRy[1:0]:端口x配置位(y=0,1,…,15)
- 00:2MHz(低速)
- 01:25MHz(中速)
- 10:50MHz(快速)
- 11:100MHz(高速)
1.2.4 上拉/下拉寄存器:GPIOx_PUPDR
位2y:2y+1 PUPDRy[1:0]:端口x配置位(y=0,1,…,15)
- 00:无上下拉
- 01:上拉
- 10:下拉
- 11:保留
1.2.5 输入数据寄存器:GPIOx_IDR
位32:16保留,必须保持复位值
位15:0 IDRy[15:0]:端口输入数据(y=0,1,…,15)
这些位为只读形式,只能在字模式下访问,它们包含相应IO口的输入值
1.2.6 端口置位/复位寄存器:GPIOx_BSRR(包含BSSRH和BSSRL)
注意:同时对BSy和BRy进行操作,则置位操作BSy优先级更高。
位32:16 BRy:端口x复位位y(y=0,1,…,15)(BSSRH)
- 0:不会对ODRx位进行任何操作
- 1:对相应的ODRx位进行复位操作
位15:0 BSy:端口x置位位y(y=0,1,…,15)(BSSRL)
- 0:不会对ODRx位进行任何操作
- 1:对相应的ODRx位进行置位操作
2. GPIO输出的相关库函数
重要函数
- GPIO初始化
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
作用:初始化一个或多个IO口(同一组的GPIO)的工作模式,输出类型,速度以及上下拉方式。
typedef struct {uint32_t GPIO_Pin//指定要初始化的端口GPIOMode_TypeDef GPIO_Mode;//端口模式GPIOSpeed_TypeDef GPIO_Speed;//速度GPIOOType_TypeDef GPIO_OType; //输出类型GPIOPuPd_TypeDef GPIO_PuPd;//上拉或者下拉 }GPIO_InitTypeDef; /*端口模式*/ typedef enum { GPIO_Mode_IN = 0x00, // 输入GPIO_Mode_OUT = 0x01, // 普通输出模式GPIO_Mode_AF = 0x02, // 复用功能GPIO_Mode_AN = 0x03 // 模拟功能 }GPIOMode_TypeDef; /*速度*/ typedef enum { GPIO_Low_Speed = 0x00, /*!< Low speed */GPIO_Medium_Speed = 0x01, /*!< Medium speed */GPIO_Fast_Speed = 0x02, /*!< Fast speed */GPIO_High_Speed = 0x03 /*!< High speed */ }GPIOSpeed_TypeDef; /*输出类型*/ typedef enum { GPIO_OType_PP = 0x00,// 推挽输出GPIO_OType_OD = 0x01 // 开漏输出 }GPIOOType_TypeDef; /*上下拉*/ typedef enum { GPIO_PuPd_NOPULL = 0x00, // 浮空GPIO_PuPd_UP = 0x01, // 上拉GPIO_PuPd_DOWN = 0x02 // 下拉 }GPIOPuPd_TypeDef;
- 设置输出电平
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); //置位 实际操作BSRRL寄存器 void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//复位 实际操作BSRRH寄存器 void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//设置值 void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);// 写入端口的值
3 实验操作
3.1 使用库函数进行操作
// 挂载时钟
// GPIOD
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
// 配置端口PD13,14,15;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;// 普通输出模式
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//100Mhz
GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_DOWN;// 上拉
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;// 引脚
GPIO_Init(GPIOD,&GPIO_InitStructure);
delay_init(128);
while(1)
{GPIO_SetBits(GPIOD,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);delay_ms(200);GPIO_ResetBits(GPIOD,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);delay_ms(200);
}
3.2 使用寄存器操作
// 挂载时钟
RCC->AHB1ENR|=(1<<3); //GPIOD
// 配置端口13
// 01:普通输出模式
GPIOD->MODER&=~(3<<(13*2));
GPIOD->MODER|=(1<<(13*2));
// 0:推挽输出
GPIOD->OTYPER|=(0<<13);
// 11:高速
GPIOD->OSPEEDR|=(3<<(13*2));
// 01:上拉
GPIOD->PUPDR|=(1<<(13*2)); delay_init(128);
while(1)
{GPIOD->BSRRL|=(1<<13);// 置位PD13delay_ms(200);GPIOD->BSRRH|=(1<<13);// 复位PD13delay_ms(200);
}
【STM32F407学习笔记】GPIO(一)相关推荐
- 华芯微特SWM181学习笔记--GPIO应用与环境搭建
华芯微特SWM181 系列 32 位 MCU(以下简称 SWM181)内嵌 ARM® CortexTM-M0 内核, SWM181 支持片上包含精度为 1%以内的 24MHz.48MHz 时钟,并提供 ...
- RT-1052学习笔记 - GPIO架构分析
RT-1052学习笔记 - GPIO架构分析 一.RT1052之GPIO与IOMUX 二.GPIO架构分析 分析GPIO的外设框架 库函数操作 1.初始化MUX 2.初始化PAD 3.初始化GPIO外 ...
- STM32F407学习笔记——MG90S舵机模块(基本控制)
STM32F407学习笔记--MG90S舵机模块(基本控制) 一.基本原理: 通过改变PWM占空比来实现舵机进行不同角度转动,下面给出旋转角度与脉冲时间及对应占空比的关系(时基脉冲=20ms). 旋转 ...
- 新唐芯片学习笔记——GPIO
新唐芯片学习笔记--GPIO 概述 NuMicro®NUC029 最多有40个通用I/O引脚,这些引脚和其它功能共享.40个引脚分为6个端口,分别命名为P0, P1, P2, P3, P4和P5,每个 ...
- STM32学习笔记---GPIO
STM32的学习笔记-GPIO 我使用的是STM32F401ZGT6,有7组IO口,每组16个引脚,共112个引脚. 因为太菜了,确实容易出错,还请赐教 参考官方文档:八种IO口模式区别 结构原理 该 ...
- 立创梁山派学习笔记——GPIO输出控制
梁山派 前言 开发板简介 GD32F407ZGT6官方资源 数据手册 1.系统框图 2. 引脚复用表 3.命名规则 4.其他 用户手册 固件库与PACK包 开发环境搭建 立创官方的资料包 资料齐活,开 ...
- 树莓派学习笔记——GPIO功能学习
0.前言 树莓派现在越来越火,网上树莓派的资料也越来越多.树莓派源自英国,国外嵌入式开源领域具有良好的分享精神,树莓派各种集成库也层出不穷,下面推荐几个. [ python GPIO ] [开发语言] ...
- 正点原子stm32F407学习笔记2——GPIO操作跑马灯实验
一.库函数版本 1.硬件原理图 2.软件设计 打开上一节新建的库函数版本工程模板,直接点击工程下面的 USER 目录下面的 Template.uvproj. 跑马灯实验我们主要用到的固件库文件是: s ...
- AM335x(TQ335x)学习笔记——GPIO关键驱动移植
或按照S5PV210学习秩序.我们首先解决的关键问题.TQ335x有六个用户按钮,每个上.下.剩下.对.Enter和ESC. 我想开始学习S5PV210当同一,写输入子系统驱动器的关键问题要解决,但浏 ...
最新文章
- c语言博客作业02--循环结构
- varnish 4.0 官方文档翻译12-VCL
- CMake基础 第7节 编译标志
- Hadoop之ReduceTask工作机制
- 这是一场数学、数学、数学的盛会
- 并发重复请求及幂等场景的实现总结
- Android开发笔记(五十)定时器AlarmManager
- 进程和线程(4)-进程 vs. 线程
- 网站生成EXE文件运行——PHP网站打包工具PHPWAMP
- 这8款数据恢复软件你见过吗?数据恢复软件推荐
- qq空间留言板删除 php,怎么批量删除QQ空间的说说
- HTML+CSS+JavaScript实现放大镜效果
- C# 同间字查询 (汉字转拼音 拼音转汉字 简体繁体互转 )
- 融合通信无人值守系统解决方案
- 去掉/隐藏 word的回车符
- python3小说爬虫之起点女生网
- 一份招聘公告暴露英特尔外包芯片计划
- 占豪--2010年的市场机会在哪里(兼谈股指期货与楼市)
- Scratch(三):跳一跳
- Java 程序员开发常用的工具