首页 > 其他分享 >STM32学习笔记-GPIO

STM32学习笔记-GPIO

时间:2024-10-30 20:51:35浏览次数:3  
标签:高电平 引脚 低电平 笔记 STM32 设置 寄存器 GPIO

参考江科大32单片机学习相关知识

GPIO基本构造

在这里插入图片描述

APB2(Advanced Peripheral Bus 2)是STM32微控制器架构中的一个外设总线,用于连接一些高性能外设,如定时器、USART、ADC和GPIO等。这些外设通常对性能要求较高,需要更快的数据传输速率。相较于APB1,总线频率更高,适合用于需要快速响应的外设。
寄存器高16位用不到,只用低16位

1. 输入模式和输出模式

在这里插入图片描述

在这里插入图片描述

  • 浮动输入:不连接任何电阻,GPIO口在未施加电压时处于不确定状态。适合不需要上拉或下拉的场景。

  • 上拉输入:通过内部电阻将GPIO引脚拉高。当外部信号接地时,GPIO读取为低电平;未接地时读取为高电平。

  • 下拉输入:通过内部电阻将GPIO引脚拉低。当外部信号接到高电压时,GPIO读取为高电平;未接高电压时读取为低电平。
    FT(five tolerance)输入容忍5V

  • 模拟输入:GPIO无效,引脚直接接内部ADC

  • 推挽输出:能在高低电平之间切换,并提供较大的电流驱动能力。适合驱动LED和其他负载。又被称为强推输出模式

  • 开漏输出:只能在低电平时驱动外部设备,而高电平需要外部拉高。适合多路复用或总线系统中的信号线。如I2C

  • 复用开漏输出:在开漏输出模式下,GPIO引脚能够通过内部开关连接到地(GND),但不能主动驱动高电平。高电平状态需要外部上拉电阻来实现。当GPIO引脚被设置为低电平时,开关闭合,信号被拉低。当引脚被设置为高电平时,开关断开,信号线处于高阻抗状态,此时需要外部上拉电阻将信号拉高,注意,此时没有驱动能力。

  • 复用推挽输出:在推挽输出模式下,GPIO引脚能够同时驱动高电平和低电平。它通过两个开关(一个连接到电源,一个连接到地)实现输出。工作原理:当GPIO引脚被设置为高电平时,连接到电源的开关闭合,信号被拉高。当引脚被设置为低电平时,连接到地的开关闭合,信号被拉低。

3. 配置方法

在STM32中,配置输入输出模式通常通过设置MODER寄存器实现。每两个比特位表示一个引脚的模式。
在STM32微控制器中,GPIO口的寄存器用于配置和控制引脚的行为。每个GPIO端口都有一组特定的寄存器,主要包括以下几类:

1. MODER(模式寄存器)

  • 功能:配置每个GPIO引脚的工作模式。
  • 位域:每两个比特位对应一个引脚的模式设置。
    • 00: 输入模式
    • 01: 输出模式
    • 10: 复用模式
    • 11: 模拟模式

2. OTYPER(输出类型寄存器)

  • 功能:设置引脚的输出类型。
  • 位域
    • 0: 推挽输出
    • 1: 开漏输出

3. OSPEEDR(输出速度寄存器)

  • 功能:配置引脚的输出速度。
  • 位域:每两个比特位对应一个引脚的速度设置。
    • 00: 低速
    • 01: 中速
    • 10: 高速
    • 11: 极高速

4. PUPDR(上拉下拉寄存器)

  • 功能:配置引脚的上拉或下拉电阻。
  • 位域
    • 00: 无上拉/下拉
    • 01: 上拉
    • 10: 下拉
    • 11: 保持不变

5. IDR(输入数据寄存器)

  • 功能:读取引脚的输入状态。
  • 位域:每个位对应一个引脚的输入状态,1表示高电平,0表示低电平。

6. ODR(输出数据寄存器)

  • 功能:控制输出引脚的电平。
  • 位域:每个位对应一个引脚的输出状态,设置为1则输出高电平,0则输出低电平。

7. BSRR(位设定/重置寄存器)

  • 功能:快速设置或重置引脚的输出状态。
  • 位域:高16位用于设置引脚为高电平,低16位用于设置引脚为低电平。

8. LCKR(锁定寄存器)

  • 功能:锁定GPIO引脚的配置,防止在运行时被意外修改。
  • 操作:通过写入特定序列来锁定或解锁引脚配置。

9. AFR(替代功能寄存器)

  • 功能:配置引脚的替代功能(复用功能)。
  • 位域:每个引脚的复用功能由4位表示,可以选择多种外设功能(如UART、SPI等)。

10. 注意事项

  • 时钟使能:在配置GPIO寄存器之前,需确保对应GPIO端口的时钟已使能。
  • 寄存器操作:直接操作寄存器时,应注意位域的清除与设置,以避免影响其他引脚配置。
  • 复用设置:在复用模式下,需要仔细设置替代功能寄存器,确保外设能够正常工作。

LED

以下是GPIO输入模式的简单示例,假设连接一个按钮:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟,使用各个外设前必须开启时钟,否则对外设的操作无效。APB2PeriphClockCmd:这个函数用于使能或禁用 APB2 外设的时钟
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				//GPIO引脚,赋值为第0号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
															//函数内部会自动根据结构体的参数配置相应寄存器
															//实现GPIOA的初始化
	
	/*主循环,循环体内的代码会一直循环执行*/
	while (1)
	{
		/*设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法*/
		
		/*方法1:GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平*/
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为低电平
		Delay_ms(500);										//延时500ms
		GPIO_SetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为高电平
		Delay_ms(500);										//延时500ms
		
		/*方法2:GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定*/
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);		//将PA0引脚设置为低电平
		Delay_ms(500);										//延时500ms
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);			//将PA0引脚设置为高电平
		Delay_ms(500);										//延时500ms
		
		/*方法3:GPIO_WriteBit设置低/高电平,由数据0/1指定,数据需要强转为BitAction类型*/
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);		//将PA0引脚设置为低电平
		Delay_ms(500);										//延时500ms
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);		//将PA0引脚设置为高电平
		Delay_ms(500);										//延时500ms
	}
}

1.RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

是一行用于开启 STM32 微控制器中 GPIOA 时钟的代码。RCC:时钟控制器(Reset and Clock Control),负责管理系统中的时钟和复位。
APB2PeriphClockCmd:这个函数用于使能或禁用 APB2 外设的时钟。APB2 是高级外设总线,用于连接某些外设(如 GPIO、USART 等)

2. GPIO_InitTypeDef

GPIO_InitTypeDef GPIO_InitStructure; 是一行用于定义一个结构体变量的代码,这个结构体用于配置 GPIO 引脚的参数。这个结构体包含多个字段,用于设置 GPIO 的工作模式、引脚、速度等参数。

  • GPIO_Pin:用于指定要配置的 GPIO 引脚。例如,GPIO_Pin_0 表示第 0 号引脚(PA0)。
  • GPIO_Mode:用于设置 GPIO 的工作模式,比如输入、输出、复用或模拟模式。
  • GPIO_Speed:用于配置引脚的速度,比如 2 MHz、50 MHz 或 100 MHz。
  • GPIO_OType:设置引脚的输出类型,可以选择推挽输出或开漏输出。
  • GPIO_PuPd:配置引脚的上拉/下拉电阻,选择上拉、下拉或无上拉/下拉。

3.GPIO_Init(GPIOA, &GPIO_InitStructure);

函数:GPIO_Init 是 STM32 标准外设库中提供的函数,用于根据指定的参数配置 GPIO 引脚。这个函数会根据传入的结构体变量设置相应的寄存器。

4.GPIO设置

  • void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//功能:将指定的 GPIOx 引脚GPIO_Pin设置为高电平
  • void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//功能:将指定的 GPIOx 引脚GPIO_Pin设置为低电平
  • void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//根据给定的值BitVal(要写入的值,使用 Bit_SET 或 Bit_RESET)设置指定的 GPIO 引脚GPIO_Pin。。
  • void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//将一个 16 位的值写入指定的 GPIOx端口的所有引脚。值的每一位对应 GPIO 端口的每一个引脚,1 表示高电平,0 表示低电平。

LED闪烁

闪烁还是挺简单的,江科大连延时函数也不讲,直接调用,还是非常容易的思路。

标签:高电平,引脚,低电平,笔记,STM32,设置,寄存器,GPIO
From: https://blog.csdn.net/zxjiaya/article/details/143370788

相关文章

  • 读书笔记3
    13.估算1、通过学习估算,并将此技能发展到事物的数量级有直觉的程度,你就能展现出一种魔法般的能力,确定他们的可行性。2、多准确才足够准确?130个工作日和大概6个月,是不同的,显然,前者表示的精度更高。我们在做估算的时候也需要选好描述估算时间的单位值。3、估算结果怎么来呢。首......
  • 强连通分量学习笔记+杂题
    图论系列:前言:僕は明快さ故にアイロニー優柔不断なフォローミー後悔後悔夜の果て相关题单:戳我一.强连通分量相关定义基本摘自oiwiki,相关定义还是需要了解。(实际就是搬了个oiwiki)强连通分量主要在研究有向图可达性,针对的图类型为有向弱联通图。1.强连通定义强连通:对......
  • 【SQL】Hive/Spark SQL笔记之时间函数、环比/同比/时间比较计算
    获取当天:'${zdt.format("yyyy-MM-dd")}'//获取上月月末select'${zdt.lastMonth().format("yyyy-MM-dd")}'T-1上月末select'${zdt.addDay(-1).lastMonth().format("yyyyMMdd")}'1个小时前select'${zdt.addHour(-1)......
  • 读书笔记2
    6.交流交流又有技巧,与客户的交流更是如此,书中介绍了几个需要注重的方面:1.知道自己要说什么首先要自己组织好语言。围绕心中所想的框架展开阐述2.了解听众想要什么交流时双方的事,是双方希望通过交流来达到共识,所以我们需要知道听众想要听到什么,比如,你可以用以下方法展开:你想......
  • 程序员修炼之道阅读笔记
    读完《程序员修炼之道:从小工到专家》的第二章“注重实效的途径”,我收获颇丰。这一章详细阐述了实现注重实效编程的具体方法和途径。它强调了在编程过程中的各种细节和要点,为我们提供了切实可行的指导。其中,关于早期原型制作的内容让我印象深刻。通过快速构建原型,我们可以更早地......
  • 【机器人学导论】简明学习笔记1——概述
    主要参考学习资料:《机器人学导论(第4版)》JohnJ.Craig著台大机器人学之运动学——林沛群前置课程:博主目前只对线性代数和理论力学方面有一定基础,学习过程中遇到额外必要的前置知识我会做补充或者开辟新的知识笔记专栏笔记特点:简明扼要,对学习资料进行消化调整辅助理解码......
  • 程序员修炼之道:从小工到专家阅读笔记
    阅读《程序员修炼之道:从小工到专家》的第一章“注重实效的哲学”,让我深受启发。这一章强调了程序员应具备的务实态度和思维方式。它提醒我们,在编程的世界里,不能仅仅局限于技术的表面,而要深入理解问题的本质。实效不仅仅是关于写出能运行的代码,更是要写出可靠、易维护且能适应变......
  • Linux 常用命令笔记
    Linux命令行常用快捷键Ctrl+a:移到行首Ctrl+e:移到行尾ctrl+u:光标处往前删除ctrl+k:光标处往后删除Linux常用命令汇总vim:dd:删除游标所在的一整行(常用)网络相关命令汇总netstat:打印网络连接、路由表、接口统计、伪装连接和多播成员关系lsof:lsof(listopenfiles)是一个列出当......
  • Learn-前端-笔记-day05
    浮动div是块状元素,一个div都是独占一行,此时很多div元素在一排排列,就可以用到浮动,让竖着的盒子横着排列。浮动属性<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"......
  • Lyndon 理论学习笔记
    字符串,太深刻了/kk定义下标从1开始。\(+\)是字符串拼接。\(|s|\)表示\(s\)的长度。\(s_i\)表示\(s\)的第\(i\)个字符。\(s^k\)表示\(k\)个\(s\)拼接的结果。字符串间的大小关系用字典序比较。Lyndon串字符串\(s\)是Lyndon串当且仅当\(s\)小于其......