GPIO初始化及调用

下面把 HAL 库标准外设库(SPL) 初始化 GPIO 点亮/熄灭 LED 的完整步骤、示例代码和常用 API 逐一说清楚。用例默认 PC13 接 LED(蓝板常见;低电平点亮,高电平熄灭——若板子相反,只把写 1/0 对调即可)。

一、HAL 库:GPIO 初始化与点亮/熄灭 LED

步骤(通用顺序)

  1. 使能端口时钟 __HAL_RCC_GPIOx_CLK_ENABLE()

  2. 填写 GPIO_InitTypeDef 结构体(Pin/Mode/Speed …)

  3. HAL_GPIO_Init(GPIOx, &init) 完成配置

  4. HAL_GPIO_WritePin / TogglePin / ReadPin 控制或读引脚
    (可选)5) 若需 EXTI:还要配置中断优先级并使能 NVIC,使用 HAL_GPIO_EXTI_IRQHandler/HAL_GPIO_EXTI_Callback

示例代码(HAL)

led.h

#ifndef __LED_H__
#define __LED_H__#include "stm32f1xx_hal.h"/* ====== 硬件相关宏定义 ====== */
#define LED_GPIO_PORT      GPIOC        // LED 所在的端口(此处为 GPIOC)
#define LED_GPIO_PIN       GPIO_PIN_13  // LED 引脚号(PC13)/* ====== LED 控制函数声明 ====== */
void LED_Init(void);     // 初始化 LED 引脚
void LED_On(void);       // 点亮 LED
void LED_Off(void);      // 熄灭 LED
void LED_Toggle(void);   // 翻转 LED 状态#endif

led.c:

#include "led.h"/*** @brief  初始化 LED 引脚* @note   配置为推挽输出,默认熄灭(PC13高电平)*/
void LED_Init(void)
{/* 1. 使能 GPIOC 时钟(如果不打开,GPIO 寄存器无法操作) */__HAL_RCC_GPIOC_CLK_ENABLE();/* 2. 配置 GPIO 参数 */GPIO_InitTypeDef gpio = {0};              // 定义配置结构体并清零gpio.Pin   = LED_GPIO_PIN;                // 选择 PC13gpio.Mode  = GPIO_MODE_OUTPUT_PP;         // 推挽输出模式gpio.Speed = GPIO_SPEED_FREQ_LOW;         // 低速输出(足够驱动 LED)HAL_GPIO_Init(LED_GPIO_PORT, &gpio);      // 初始化 GPIOC 的 13 引脚/* 3. 缺省熄灭 LED(PC13 高电平 = 灭) */HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PIN, GPIO_PIN_SET);
}/*** @brief 点亮 LED*/
void LED_On(void)
{HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PIN, GPIO_PIN_RESET); // PC13 输出低电平
}/*** @brief 熄灭 LED*/
void LED_Off(void)
{HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PIN, GPIO_PIN_SET);   // PC13 输出高电平
}/*** @brief 翻转 LED 状态*/
void LED_Toggle(void)
{HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_GPIO_PIN);                // HAL 内部用 BSRR 实现
}

main.c

#include "stm32f1xx_hal.h"
#include "led.h"/* 系统时钟配置函数(具体实现依赖 CubeMX 或手写) */
static void SystemClock_Config(void);int main(void)
{/* 1. HAL 库初始化:包括时钟源、SysTick 配置等 */HAL_Init();/* 2. 配置系统时钟(比如 HSE=8MHz → SYSCLK=72MHz) */SystemClock_Config();/* 3. 初始化 LED 引脚 */LED_Init();/* 4. 主循环:控制 LED 闪烁 */while (1){LED_On();       // 点亮HAL_Delay(300); // 延时 300 msLED_Off();      // 熄灭HAL_Delay(300); // 延时 300 msLED_Toggle();   // 翻转状态HAL_Delay(300); // 延时 300 ms}
}/* ===== 系统时钟配置函数(此处仅示意,实际需根据工程生成) ===== */
static void SystemClock_Config(void)
{/* 如果使用 CubeMX,一般会自动生成这里的代码。自己手写时,需要配置 HSE/PLL,把 SYSCLK 提升到 72MHz。如果不写,默认 SystemInit() 可能只运行在 8MHz HSI。 */
}

HAL 结构体/参数要点(F1)

  • Pin:引脚位图,可或起来(如 GPIO_PIN_0 | GPIO_PIN_1)。

  • Mode

    • GPIO_MODE_OUTPUT_PP / _OD(推挽/开漏)

    • GPIO_MODE_INPUTGPIO_MODE_ANALOG

    • GPIO_MODE_AF_PP / _AF_OD(复用推挽/开漏)

    • GPIO_MODE_IT_RISING/FALLING/RISING_FALLING(外部中断)

    • GPIO_MODE_EVT_*(事件)

  • SpeedGPIO_SPEED_FREQ_LOW/MEDIUM/HIGH(≈2/10/50 MHz)

注:F1 的 HAL 不带 Pull 字段(上拉/下拉由 CRL/CRH 的 CNF 决定;若要上拉/下拉,需把 Mode 设为输入并用 ODR 置 1/0 完成上/下拉,或直接用 HAL 的 GPIO_MODE_INPUT + 后续写 ODR)。

二、标准外设库(SPL):GPIO 初始化与点亮/熄灭 LED

步骤

  1. 使能端口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE)

  2. GPIO_InitTypeDef(Pin/Mode/Speed)

  3. GPIO_Init(GPIOx, &init)

  4. GPIO_SetBits / ResetBits / WriteBit 控制

示例代码(SPL)

led.h:

#ifndef __LED_H__
#define __LED_H__#include "stm32f10x.h"/* ====== 硬件相关宏定义 ====== */
#define LED_GPIO_PORT      GPIOC                  // LED 所在端口
#define LED_GPIO_PIN       GPIO_Pin_13            // LED 引脚 PC13
#define LED_GPIO_CLK       RCC_APB2Periph_GPIOC   // GPIOC 时钟/* ====== LED 控制函数声明 ====== */
void LED_Init(void);     // 初始化 LED 引脚
void LED_On(void);       // 点亮 LED
void LED_Off(void);      // 熄灭 LED
void LED_Toggle(void);   // 翻转 LED 状态#endif

led.c:

#include "led.h"/*** @brief  初始化 LED 引脚* @note   PC13 配置为推挽输出,默认熄灭*/
void LED_Init(void)
{/* 1. 使能 GPIOC 时钟 */RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);/* 2. 配置 PC13 为推挽输出 */GPIO_InitTypeDef gpio;gpio.GPIO_Pin   = LED_GPIO_PIN;      // 选择引脚gpio.GPIO_Speed = GPIO_Speed_2MHz;   // 输出速度 2MHzgpio.GPIO_Mode  = GPIO_Mode_Out_PP;  // 推挽输出GPIO_Init(LED_GPIO_PORT, &gpio);/* 3. 缺省熄灭 LED(PC13 高电平 = 灭) */GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN);
}/*** @brief 点亮 LED*/
void LED_On(void)
{GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN); // 低电平
}/*** @brief 熄灭 LED*/
void LED_Off(void)
{GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN);   // 高电平
}/*** @brief 翻转 LED 状态*/
void LED_Toggle(void)
{if (GPIO_ReadOutputDataBit(LED_GPIO_PORT, LED_GPIO_PIN))GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN); // 如果当前是 1 → 清零elseGPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN);   // 如果当前是 0 → 置 1
}

main.c:

#include "stm32f10x.h"
#include "led.h"/* 时钟配置函数 */
static void Clock_Config(void);int main(void)
{/* 1. 配置系统时钟(如果需要) */Clock_Config();/* 2. 初始化 LED 引脚 */LED_Init();/* 3. 主循环:控制 LED 闪烁 */while (1){LED_On();   // 点亮for(volatile int i=0;i<600000;i++);  // 简单延时LED_Off();  // 熄灭for(volatile int i=0;i<600000;i++);LED_Toggle(); // 翻转状态for(volatile int i=0;i<600000;i++);}
}/*** @brief  时钟配置* @note   SPL 启动文件里默认调用 SystemInit(),会把 HSE/PLL 配置成 72MHz。*         如果已经够用,这里可以留空。*/
static void Clock_Config(void)
{/* 一般用默认 SystemInit 即可 */
}

SPL 结构体/参数要点

  • GPIO_Mode

    • GPIO_Mode_AIN(模拟输入)

    • GPIO_Mode_IN_FLOATING(浮空输入)

    • GPIO_Mode_IPD / GPIO_Mode_IPU(下拉/上拉输入)

    • GPIO_Mode_Out_PP / _Out_OD(通用推挽/开漏输出)

    • GPIO_Mode_AF_PP / _AF_OD(复用推挽/开漏输出)

  • GPIO_SpeedGPIO_Speed_2MHz / 10MHz / 50MHz(仅对输出/复用输出有效)

三、图里 HAL GPIO 其他函数的作用(并给出 SPL 对应函数)

HAL 函数作用(要点)关键参数SPL/等价做法
HAL_GPIO_Init(GPIOx, &init)根据 Pin/Mode/Speed 配置端口(本质写 CRL/CRH)GPIOx:端口;Pin 位图;ModeSpeedGPIO_Init(GPIOx, &init)
HAL_GPIO_DeInit(GPIOx, GPIO_Pin)复位指定引脚到缺省(模拟输入),清除 EXTI 绑定GPIO_Pin 位图GPIO_DeInit(GPIOx)(注意 SPL 是“整个端口复位”;单独复位需手写寄存器)
HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PinState)通过 BSRR 原子置 1/清 0GPIO_PinStateGPIO_PIN_SET/RESETGPIO_WriteBit/SetBits/ResetBitsGPIOx->BSRR/BRR
HAL_GPIO_TogglePin(GPIOx, GPIO_Pin)翻转输出(对 ODR 异或)GPIO_Pin 位图无直接 API,可 GPIO_WriteBit(GPIOx,pin, (BitAction)!GPIO_ReadOutputDataBit(...)) 或操作 ODR
HAL_GPIO_ReadPin(GPIOx, GPIO_Pin)IDR,返回 GPIO_PIN_SET/RESETGPIO_PinGPIO_ReadInputDataBit(GPIOx, pin)
HAL_GPIO_LockPin(GPIOx, GPIO_Pin)通过 LCKR 锁定配置,直到下次复位(防误改)GPIO_Pin 位图GPIO_PinLockConfig(GPIOx, pin)
HAL_GPIO_EXTI_IRQHandler(GPIO_Pin)通用 EXTI 线中断处理:清挂起位并调用回调GPIO_Pin:哪条线触发SPL:在 EXTIxx_IRQHandlerEXTI_GetITStatus/EXTI_ClearITPendingBit,然后自己回调
HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)弱定义(__weak)回调,用户重写做业务GPIO_Pin:触发的线SPL:自己写回调或在 IRQHandler 里直接处理

EXTI 的初始化(两库都需要额外步骤)

  • HAL:把引脚 Mode 设为 GPIO_MODE_IT_*,然后用 HAL_NVIC_SetPriorityHAL_NVIC_EnableIRQ 开中断即可。

  • SPL:GPIO_EXTILineConfig(AFIO_PORTx, PinSourcex) + EXTI_Init(&cfg) + NVIC_Init(&nvic)

四、常见易错点与小技巧

  • 时钟别忘开:F1 的 GPIO 都在 APB2,HAL 用 __HAL_RCC_GPIOx_CLK_ENABLE();SPL 用 RCC_APB2PeriphClockCmd(...)

  • 蓝板 PC13 低电平点亮:别把“写 1 点亮”写反。

  • 原子操作首选 BSRR:HAL 的 WritePin/TogglePin 已经用 BSRR,SPL 用 GPIOx->BSRR/BRR 更安全。

  • 速度只对输出有效:输入模式时 Speed 无意义。

  • 锁定功能:量产固件防误改时可用 HAL_GPIO_LockPin / GPIO_PinLockConfig

  • 多脚同时配置Pin 可位或(如 GPIO_PIN_0|GPIO_PIN_1),一次初始化多个引脚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919541.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GPT入门】第48课 LlamaFacotory 合并原模型与LoRA模型

【GPT入门】第48课 LlamaFacotory 合并原模型与LoRA模型1.合并原模型与LoRA训练的增量模型2. 测试模型1.合并原模型与LoRA训练的增量模型 llamafactory-cli webui 执行合并 合并后模型大小 (base) rootautodl-container-b4b04ea4f2-b5ee47d1:~# du -sh /root/autodl-tmp/mod…

Python爬虫实战:研究tumblr,构建博客平台数据采集分析系统

1. 引言 1.1 研究背景 在信息爆炸的时代,社交媒体平台已成为人们获取信息、表达观点和进行社交互动的主要渠道。这些平台上积累的海量数据包含了用户偏好、社会趋势、文化现象等丰富信息,对学术研究、市场分析、产品开发等领域具有重要价值。 Tumblr 作为一个综合性的轻博客…

集成算法学习总结

一、集成学习基础认知 核心思想&#xff1a;集成学习&#xff08;ensemble learning&#xff09;通过构建并结合多个个体学习器来完成学习任务&#xff0c;类似于 “多个专家共同决策”&#xff0c;通常比单个学习器的性能更优。其核心逻辑是利用多个学习器的优势互补&#xff…

线程安全的产生以及解决方案

线程安全原子性&#xff08;Atomicity&#xff09;、可见性&#xff08;Visibility&#xff09;、有序性&#xff08;Ordering&#xff09; 是保证线程安全的三大核心要素 —— 线程安全问题的本质&#xff0c;几乎都是这三个特性中的一个或多个被破坏导致的。操作不会被 “中途…

Spring Cloud Netflix学习笔记01

文章目录前言一、微服务概述什么是微服务&#xff1f;微服务与微服务架构微服务优缺点优点缺点微服务技术栈有那些&#xff1f;二.SpringCloud入门概述SpringCloud是什么&#xff1f;SpringCloud和SpringBoot的关系Dubbo 和 SpringCloud技术选型总结SpringCloud能干嘛&#xff…

专题:2025母婴行业消费洞察与分龄营养趋势报告|附40 +份报告PDF、交互图表数据汇总下载

原文链接&#xff1a;https://tecdat.cn/?p43654 当95后妈妈拿着计算器对比DHA纯度&#xff0c;当爸爸们为“防红屁屁纸尿裤”货比三家&#xff0c;母婴行业的风向早就变了。从“一把奶粉喂到3岁”到“按月龄定制营养包”&#xff0c;从“进口就好”到“看专利数据下单”&…

redhat6/centos6 配置yum源

由于RHEL6/centos6系统官方早就停止通知维护了&#xff0c;公司的开发服务器有比较老&#xff0c;发现竟然scp都没有装。。。今天配置个本地yum源&#xff0c;安装一下常规软件和开发环境比较简单&#xff0c;直接上代码1.上传一个centos6的iso文件CentOS-6.5-x86_64-bin-DVD1.…

day31 SQLITE

数据库相关函数数据库创建int sqlite3_open( const char *filename, sqlite3 **ppDb);功能&#xff1a;打开数据库&#xff0c;不存在则创建参数&#xff1a;const char *filename 数据库名sqlite3 **ppDb 二级指针&#xff0c;传出ppDb数据库的一级指…

嵌入式-SPI番外之按钮驱动程序的编写-Day15

目录 一、按钮简单操作回忆 二、按钮新操作实现 &#xff08;1&#xff09;按钮的点击实现灯亮/灭 ①连接电路 ②初始化板载LED和按钮 ③按钮程序的基本原理&#xff08;核心仍为0亮/1灭&#xff09; ④按钮消抖的原理 三、按钮封装的操作-点击&#xff0c;双击&#xf…

星域智链科技:用科技点亮生活,以 AI 拓展无限可能

星域智链科技&#xff08;东莞市&#xff09;有限公司简介 星域智链科技&#xff08;东莞市&#xff09;有限公司&#xff0c;理念是 让科技便利生活、丰富生活&#xff0c;专注于科技、AI领域。 全场景 GPS 定位器 —— 精准追踪&#xff0c;守护安全&#xff0c;适用于车辆…

国内代理IP在SEO行业中的应用

随着互联网的快速发展&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为了数字营销的重要组成部分。无论是企业还是个人站长&#xff0c;都希望通过SEO提升自己网站的排名和流量。然而&#xff0c;随着竞争的激烈&#xff0c;传统的SEO优化手段已经逐渐显现出局限性…

Linux + arm 内存屏障

ARM 硬件层的屏障指令DMB (Data Memory Barrier)&#xff1a;保证在它之前的内存访问&#xff08;符合给定域/类型&#xff09;在它之后的内存访问之前对可见性排序。常用域&#xff1a;ish&#xff08;Inner Shareable&#xff09;&#xff0c;sy&#xff08;system-wide&…

网络安全中的远程控制活动检测与防御策略

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;远程控制技术在IT领域中用于网络连接和设备操作&#xff0c;但同样被黑客利用进行非法入侵。端口占用情况是识别远程控制活动的关键因素&#xff0c;使用工具如"cports"可以监控这些端口。系统中未知…

UIGestureRecognizer 各个子类以及其作用

在 iOS 里&#xff0c;UIGestureRecognizer 是一个抽象基类&#xff0c;专门用来处理手势事件。它本身不能直接用&#xff0c;必须用它的 子类。这些子类分别对应常见的手势识别器。常见的 UIGestureRecognizer 子类及作用1. UITapGestureRecognizer作用&#xff1a;点击手势&a…

计算机网络 HTTPS 全流程

HTTPS 通信的全流程&#xff08;特别是 TLS 握手阶段&#xff09;中使用的三个随机数是保障安全性的核心设计&#xff0c;不能随意减少。每个随机数都承担着至关重要的安全职责。下面详细解释 HTTPS 全流程&#xff0c;并重点分析这三个随机数的作用和必要性&#xff1a;&#…

DL00271-基于YOLOv11的激光雷达LiDAR船舶目标检测含完整数据集

【CSDN推荐】基于YOLOv11的激光雷达&#xff08;LiDAR&#xff09;船舶目标检测——含完整数据集&#xff01;&#x1f6a2; 科研人员必看&#xff01; 高校老师、学生和研究者们&#xff0c;前沿技术来了&#xff01;本论文利用YOLOv11模型&#xff0c;结合激光雷达&#xff0…

SQL-leetcode—3374. 首字母大写 II

3374. 首字母大写 II 表&#xff1a;user_content -------------------- | Column Name | Type | -------------------- | content_id | int | | content_text| varchar | -------------------- content_id 是这张表的唯一主键。 每一行包含一个不同的 ID 以及对应的文…

告别笼统的 200 OK:一份给 API 设计者的 HTTP 状态码终极指南

文章目录写在前面问题描述核心结论与建议简要描述详细阐述1xx - 信息性响应 (Informational)2xx - 成功 (Successful)3xx - 重定向 (Redirection)4xx - 客户端错误 (Client Error)5xx - 服务器错误 (Server Error)HTTP 状态码速查表参考以及更多更详细的状态码查询写在前面 你…

从防抖节流到链表树:编程世界中的抽象优化艺术

从防抖节流到链表树&#xff1a;编程世界中的抽象优化艺术 在编程的知识体系中&#xff0c;有些概念看似毫不相关&#xff0c;却在底层逻辑上有着惊人的相似之处。防抖与节流、链表与树&#xff0c;这两组分属不同领域的概念&#xff0c;正是这种思维共性的典型代表。它们不仅展…

第三阶段数据-3:数据库脚本生成,备份与还原,分离与附加

1_生成数据库脚本&#xff08;1&#xff09;在数据库上右键选择任务&#xff08;2&#xff09;选择生成脚本&#xff08;3&#xff09;选择下一步&#xff0c;如果下次不想显示此页面&#xff0c;可勾选不再显示此页&#xff08;4&#xff09;如果导出全部数据&#xff0c;选择…