stm32 笔记IO口点灯实验及HAL库使用

本文详细介绍了STM32 GPIO的八种工作模式,包括输入的浮空、上拉、下拉及模拟模式,以及输出的开漏、推挽复用功能。通过实例演示了如何配置GPIO寄存器实现灯泡控制,以及利用HAL库进行简化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GPIO 概述

全称:general purpose intput output,通用输入输出接口。

顾名思义,既可作为输入框也可以作为输入口。

引脚不一定是 GPIO,有些引脚也作为复位或晶振等使用。

GPIO的八种工作模式

输入:浮空输入,上拉输入,下拉输入,模拟输入

输出:开漏输出,开漏复用功能,推挽式输出,推挽式复用功能

输入:

浮空输入:浮空状态上拉开关和下拉开关都是关闭,当引脚接到空气会输出无意义值

下拉输入:GPIO 将接入带有电阻的负极,此时 CPU 接收到该 GPIO 的信号为 0,假设给这个 GPIO 一个高电平,因为电阻的关系,并不会将高电平全都吸收,此时 CPU 接收到该 GPIO 的信号为 1。意味该GPIO高电平有效。

上拉输入:GPIO 将接入带有电阻的正极,此时 CPU 接收到该 GPIO 的信号为 1;假设给这个 GPIO 一个低电平,因为电阻的关系,并不会将低电平全都吸收,此时 CPU 接收到该 GPIO 的信号为 0。意味该GPIO低电平有效。

模拟输入:不接入上拉和下拉电阻,绕过施密特触发器,直接进入模拟口。

输出:

开漏输出:有输出时只让 vss 高电平,并不设置 vdd 低电平驱动。此种输出方式,需要设置接收端需设置下拉电阻。开漏复用功能,即从外设获取信息到输出缓冲区再输出。

推挽式输出:有信号时 vss 高,无信号时 vdd 低电平。接收端无需接上拉或下拉电阻。

GPIO 寄存器

每组 io 口由10个寄存器组成,如果芯片有 GPIOA~GPIOI 9个组,那么一定对应 9x10 = 10 个寄存器。

如果一个 io 口配置两位。32 位寄存器正好配置 16 位口;如果一个 io 只需要配置一个 io 口,一般高十六位保留。

BSRR寄存器较为抽象,来单独描述下:

这是一个 32 位寄存器,其中 31~16 位为 BR 对其置1即对输出寄存器置1,如置0则不产生改变。

如当前十六位寄存器值为:

0100 0000 0000 0000

我们对BSRR赋:

BSRR = 1000 0000 0000 0000 0000 0000 0000 0000

 则当前寄存器值为:

1100 000 0000 0000

15~0 位则为 BS 寄存器复位寄存器,对其置1即对输出寄存器置0,如置0则不产生改变。

如当前十六位寄存器值为:

0100 0000 0000 0000

我们对BSRR赋:

BSRR = 0000 0000 0000 0000 0100 0000 0000 0000

 则当前寄存器值为:

0000 000 0000 0000

15~0 位则为 BS 寄存器复位寄存器,对其置1即对输出寄存器置0,如置0则不产生改变。

寄存器点灯实验

对于灯泡来说,两边电平不一致即可点亮。此时让 GPIOB0 或 GPIOB1 给出低电平即可点亮 LED0 或者 LED1。 

 所以对于 GPIOB 来说应该至少设置三个寄存器即可点亮灯泡,分别是:

MODER 端口模式寄存器,设置为输出模式

OTYPER 端口输出类型寄存器,设置为推挽输出(设置为开漏也可以)

ODR 端口输出数据寄存器,设置为 0000 0000 0000 0000 全为 0 低电平即可

寄存器电灯

设置 GPIOB 时钟

在设置三个寄存器之前,应先对 GPIOB 时钟进行设置:

 参考 stm32 手册 53 页,GPIOB 属于 AHB1 总线。 

 

翻阅芯片手册,我们需要将 GPIOB 使能。

所以 AHB1ENR 寄存器应该被赋值成 00000000 00000000 00000000 00000010

换成十六进制代码就是:

//GPIOB 时钟 使能
RCC->AHB1ENR = 0x00000002;

配置输出模式

MODER 寄存器配置为输出模式,应该为 00000000 00000000 00000000 00000101

十六进制:

//输出模式 通用输出
GPIOB->MODER = 0x00000005;

配置输出类型

 

 

OTYPER 寄存器配置为推挽模式,应该为 00000000 00000000 00000000 00000000

 换成十六进制代码就是:

//推挽输出
GPIOB->OTYPER = 0x00000000;

寄存器配置

 

ODR 端口输出寄存器配置为: 00000000 00000000 00000000 00000000

低电平即可点亮灯泡,所以全设置为0

 换成十六进制代码就是:

	//寄存器
	GPIOB->ODR = 0x00000000;

全部代码:

 在此之前需要设置整体时钟。

#include "sys.h"
#include "delay.h" 

int main(void)
{
	Stm32_Clock_Init(360,25,2,8);//设置时钟,180Mhz
	delay_init(180);		//初始化延时函数
	
	//GPIOB 时钟 使能
	RCC->AHB1ENR = 0x00000002;
	
	//输出模式 通用输出
	GPIOB->MODER = 0x00000005;
	
	//推挽输出
	GPIOB->OTYPER =0x00000000;
	
	//寄存器
	GPIOB->ODR = 0x00000000;
}

成功点亮 

HAL 库点灯

需要使用 GPIO_InitTypeDef 结构体定义寄存器类型。之后使用 HAL_GPIO_Init() 进行初始化。

 HAL_GPIO_WritePin() 函数则向GPIOB 置位

int main(void)
{
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    LED_Init();                     //初始化LED  
    
	GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
	
    GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB1,0
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
	
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);	//PB0置1,默认初始化后灯灭
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);	//PB1置1,默认初始化后灯灭
}

### STM32 HAL使用教程及下载地址 #### 一、STM32 HAL概述 STM32 HAL是一种硬件抽象层(Hardware Abstraction Layer),旨在提供一种统一的方式访问STM32微控制器的功能[^3]。它通过封装底层寄存器操作,简化了开发者的工作流程,并增强了代码的可移植性和兼容性。 #### 二、HAL的下载方法 为了获取最新的STM32 HAL及相关工具,可以按照以下方式完成: 1. **官方资源网站** 访问STMicroelectronics官方网站 (https://www.st.com/) 并进入“Software & Tools”页面,在其中查找并下载适用于目标芯片系列的STM32CubeMX以及对应的固件包[^2]。这些工具包含了完整的HAL源码及其文档说明。 2. **STM32CubeMX集成环境** 利用STM32CubeMX这款图形化配置工具能够自动生成基于HAL驱动程序初始化代码框架,极大地方便初学者快速上手项目开发工作流[^1]。 #### 三、基本使用步骤详解 以下是利用STM32 HAL开展实际项目的几个核心环节描述: 1. **创建新工程** 打开STM32CubeMX界面后选择对应型号的目标单片机设备,依据需求调整外设参数设置完毕之后导出至Keil MDK或者IAR Embedded Workbench平台构建最终应用程序结构体。 2. **编写业务逻辑代码** 基于生成的基础模板填充具体的算法实现部分,比如控制LED灯闪烁效果或是读取按键状态反馈等功能模块设计思路均需在此阶段予以落实执行。 3. **编译调试验证成果** 将修改后的整个解决方案重新加载到物理板卡上面运行测试确认预期行为表现正常无误即可视为成功完成了本次学习实践过程。 ```c // 示例:简单的GPIO输出控制函数演示 #include "stm32f4xx_hal.h" void GPIO_Init(void){ __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 配置PA5为推挽输出模式 */ GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } int main(void){ HAL_Init(); GPIO_Init(); while(1){ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); //切换PA5电平高低态 HAL_Delay(500); //延时半秒时间间隔 } } ``` 上述例子展示了如何借助HAL API接来操控特定端引脚的状态变化情况,从而达到点亮熄灭外部连接器件的目的。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值