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
英文地址,請注明出處:http://en.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;選擇…