STM32 入門實錄:從 0 到 3 色 LED 呼吸式閃爍

一、需求 & 最終效果

  • 硬件:Blue-Pill(STM32F103C8T6)+ 3 只 LED(紅 PA0、黃 PA1、綠 PA2)
  • 現象:上電后紅→黃→綠→黃→全滅,每步 100 ms,循環往復。

二、硬件連接

LED 端連接說明
陰極GND共陰極接法
陽極PA0 / PA1 / PA2串 330 Ω 電阻

若為 共陽極,把 GPIO_SetBits/ResetBits 互換即可。

三、工程準備(CubeIDE 3 步)

1. 新建工程
File → New → STM32 Project → 搜索 STM32F103C8Tx → Finish

2. 解決庫缺失
Project → Properties → C/C++ Build → Settings → MCU GCC Compiler → Preprocessor
添加宏:

STM32F10X_MD
USE_STDPERIPH_DRIVER

3.添加庫文件
把下列文件放入 Src/Inc 并加入編譯:

stm32f10x_gpio.c/.h
stm32f10x_rcc.c/.h
misc.c/.h

四、核心源碼

#include "stm32f10x.h"#define RED_LIGHT    GPIO_Pin_0
#define YELLOW_LIGHT GPIO_Pin_1
#define GREEN_LIGHT  GPIO_Pin_2
#define ALL_LIGHTS   (RED_LIGHT | YELLOW_LIGHT | GREEN_LIGHT)static void delay_ms(uint32_t ms)
{/* 72 MHz ≈ 18000 次/1 ms,實測微調 */while (ms--)for (volatile uint32_t i = 0; i < 18000; i++);
}int main(void)
{/* 1. 時鐘 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/* 2. GPIO 配置 */GPIO_InitTypeDef gpio = {.GPIO_Pin   = ALL_LIGHTS,.GPIO_Mode  = GPIO_Mode_Out_PP,.GPIO_Speed = GPIO_Speed_50MHz};GPIO_Init(GPIOA, &gpio);/* 3. 全滅(共陽:高電平滅) */GPIO_SetBits(GPIOA, ALL_LIGHTS);/* 4. 流水燈序列 */const uint16_t seq[] = {RED_LIGHT, YELLOW_LIGHT, GREEN_LIGHT, YELLOW_LIGHT};const uint8_t  len   = sizeof(seq) / sizeof(seq[0]);while (1){for (uint8_t i = 0; i < len; i++){GPIO_ResetBits(GPIOA, seq[i]);   // 亮delay_ms(100);GPIO_SetBits(GPIOA, seq[i]);     // 滅}}
}

五、編譯 & 燒錄

  • Build(錘子圖標)→ Run → 選擇 ST-Link(OpenOCD)
  • Console 出現 Programming Finished & Verify OK 即成功。

【CSDN 原創】STM32F103 流水燈實戰:從 0 到 3 色 LED 呼吸式閃爍
——基于標準外設庫(SPL)+ 寄存器級優化
作者:Ryan | 日期:2024-08-25
關鍵詞:STM32F103、標準外設庫、GPIO、流水燈、延時、寄存器
一、需求 & 最終效果

硬件:Blue-Pill(STM32F103C8T6)+ 3 只 LED(紅 PA0、黃 PA1、綠 PA2)
現象:上電后紅→黃→綠→黃→全滅,每步 100 ms,循環往復。
視頻:文末 GIF 演示(已上傳)。

二、硬件連接
表格
復制
LED 端 連接 說明
陰極 GND 共陰極接法
陽極 PA0 / PA1 / PA2 串 330 Ω 電阻

若為 共陽極,把 GPIO_SetBits/ResetBits 互換即可。

三、工程準備(CubeIDE 3 步)

新建工程
File → New → STM32 Project → 搜索 STM32F103C8Tx → Finish
解決庫缺失
Project → Properties → C/C++ Build → Settings → MCU GCC Compiler → Preprocessor
添加宏:

復制

STM32F10X_MD
USE_STDPERIPH_DRIVER

添加庫文件
把下列文件放入 Src/Inc 并加入編譯:

復制stm32f10x_gpio.c/.h
stm32f10x_rcc.c/.h
misc.c/.h

四、核心源碼
c
復制

#include “stm32f10x.h”

#define RED_LIGHT GPIO_Pin_0
#define YELLOW_LIGHT GPIO_Pin_1
#define GREEN_LIGHT GPIO_Pin_2
#define ALL_LIGHTS (RED_LIGHT | YELLOW_LIGHT | GREEN_LIGHT)

static void delay_ms(uint32_t ms)
{
/* 72 MHz ≈ 18000 次/1 ms,實測微調 */
while (ms–)
for (volatile uint32_t i = 0; i < 18000; i++);
}

int main(void)
{
/* 1. 時鐘 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

/* 2. GPIO 配置 */
GPIO_InitTypeDef gpio = {.GPIO_Pin   = ALL_LIGHTS,.GPIO_Mode  = GPIO_Mode_Out_PP,.GPIO_Speed = GPIO_Speed_50MHz
};
GPIO_Init(GPIOA, &gpio);/* 3. 全滅(共陽:高電平滅) */
GPIO_SetBits(GPIOA, ALL_LIGHTS);/* 4. 流水燈序列 */
const uint16_t seq[] = {RED_LIGHT, YELLOW_LIGHT, GREEN_LIGHT, YELLOW_LIGHT};
const uint8_t  len   = sizeof(seq) / sizeof(seq[0]);while (1)
{for (uint8_t i = 0; i < len; i++){GPIO_ResetBits(GPIOA, seq[i]);   // 亮delay_ms(100);GPIO_SetBits(GPIOA, seq[i]);     // 滅delay_ms(100);}
}

}

五、編譯 & 燒錄

  • Build(錘子圖標)→ Run → 選擇 ST-Link(OpenOCD)
  • Console 出現 Programming Finished & Verify OK 即成功。

六、踩坑記錄

現象根因解決
undefined reference to assert_param未定義宏添加 STM32F10X_MD + USE_STDPERIPH_DRIVER
燈不亮共陽極接反互換 SetBits/ResetBits
延時誤差大空循環不精確后期換 SysTickTIM2

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94630.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94630.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94630.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Playwright與PyTest結合指南

Playwright與PyTest的結合&#xff0c;為Web自動化測試帶來了強大的動力。它讓你既能利用Playwright現代、跨瀏覽器的自動化能力&#xff0c;又能借助PyTest成熟測試框架的結構化、可擴展性來高效管理和組織測試用例。我會帶你了解如何將這兩者結合使用。 為了讓你快速上手&am…

plantsimulation知識點 一條軌道上多臺RGV如何引用

最近做項目有如下需求&#xff1a;軌道1上初始化生成三臺RGV&#xff0c;然后通過另一條軌道2上的傳感器代碼控制軌道1上的三臺RGV&#xff0c;之前如果另一條軌道只有一臺RGV&#xff0c;我是通過軌道2.cont來引用這臺RGV的。但是現在軌道上有了多臺RGV&#xff0c;此代碼就不…

【Canvas與盾牌】“靡不有初,鮮克有終”黃豎條盾牌

【成圖】【代碼】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>黃豎條盾牌 Draft1</title><style type"text/css"&…

使用linux+javascript+html+mysql+nodejs+npm+express等構建信息資料采集系統

一、適用場景 1、人才信息庫、檔案管理&#xff0c;構建企業或單位內部人才庫。 2、公務員/事業單位招聘&#xff0c;網上報名填寫資料、上傳證書等。 3、科研項目申報&#xff0c;課題負責人信息、成果附件、審查材料上傳。 4、志愿者招募&#xff1a;在線填寫報名信息&#…

低空經濟產業白皮書:音視頻鏈路在智能飛行體系中的核心地位

引言 低空經濟正在成為繼數字經濟、新能源產業之后的又一戰略制高點。它不僅意味著無人機物流、空中通勤、應急救援、文旅體驗等新業態的興起&#xff0c;更代表著 城市治理、智能制造、公共服務全面進入空域數字化時代。從政策引導到產業投資&#xff0c;從技術突破到應用創新…

【LeetCode 熱題 100】32. 最長有效括號——(解法二)動態規劃

Problem: 32. 最長有效括號 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(N)空間復雜度&#xff1a;O(N)整體思路 這段代碼同樣旨在解決 “最長有效括號” 問題&#xff0c;但它采用的是一種 動態規劃 (Dynamic Programming) 的方法。這種方法通過構建一個DP表…

使用Docker部署ZLMediaKit流媒體服務器實現gb/t28181協議的設備

最近在研究一個攝像頭&#xff0c;通信協議是 gb/t28181。對于這個協議也是第一次接觸&#xff0c;通過查閱多方資料&#xff0c;找到了兩個開源的源碼&#xff0c;來實現 視頻播放、攝像頭直播。以前也沒有深入的了解過關于視頻播放的這方面的技術&#xff0c;偶爾網站播放視頻…

硬件三人行--運算基礎篇

第3講 負反饋放大電路

【LINUX網絡】TCP原理

目錄 本文介紹 1. 什么是TCP&#xff1f; 2. TCP結構 為什么需要協議棧&#xff1a;兩臺主機通信的復雜性解決方案 3. 確認應答機制 進一步理解什么是確認和請求以及序號 進一步理解什么是序號和確認序號 并發發送帶來的問題以及解決方案&#xff08;序號&#xff09; …

Java -- 文件基礎知識--Java IO流原理--FileReader

目錄 1. 常用文件操作 2. Java IO流原理 2.1 流的分類 3. FileReader和FileWriter介紹 FileReader相關方法&#xff1a; FileWriter常用方法&#xff1a; 文件是保存數據的地方&#xff0c;比如大家經常使用的word文檔&#xff0c;txt文件&#xff0c;excel文件...都是文…

向量方法證明正余弦定理的數學理論體系

向量方法證明正余弦定理的數學理論體系 摘要&#xff1a; 向量理論為幾何定理的證明提供了強有力的代數化工具。本文基于向量空間的基本概念與運算性質&#xff0c;嚴格推導平面幾何中的正弦定理與余弦定理。通過建立系統的向量表示框架&#xff0c;將幾何關系轉化為向量運算&a…

【筆記ing】大模型算法架構

前言 隨著人工智能技術的飛速發展,大模型算法及其架構已成為推動科技前沿的重要力量。它們不僅能夠處理海量的數據,還具備強大的表征學習能力,能夠應對日益復雜的場景需求。本章節將介紹大模型算法及其架構,帶您了解其背后的原理、技術創新以及在實際應用中的廣闊前景。 …

ConcurrentHashMap的原理

1.底層數據結構JDK1.7底層采用分段的數組鏈表實現JDK1.8 采用的數據結構跟HashMap1.8的結構一樣,數組鏈表/紅黑二叉樹2.加鎖的方式JDK1.7采用Segment分段鎖,底層使用的是ReentrantLockJDK1.8采用CAS添加新節點,采用synchronized鎖定鏈表或紅黑二叉樹的首節點,相對Segment分段鎖…

【論文閱讀】健全個體無輔助運動期間可穿戴傳感器雙側下肢神經機械信號的基準數據集

Benchmark Datasets for Bilateral Lower-Limb Neuromechanical Signals from Wearable Sensors during Unassisted Locomotion in Able-Bodied Individuals 原文&#xff1a;DOI&#xff1a; 10.3389/frobt.2018.00014 2018年 翻譯&#xff1a;靠岸學術 目錄 1引言 2儀器設…

反向海淘系統搭建:從架構設計到合規運營的全方位指南

一、系統架構設計1.1 分層架構設計反向海淘系統通常采用四層架構設計&#xff1a;?接入層?&#xff1a;負責與淘寶開放平臺、1688海外接口通信&#xff0c;處理接口認證、請求轉發與響應解析。?業務層?&#xff1a;包含商品檢索、訂單管理、支付處理、物流追蹤等核心模塊。…

20.22 QLoRA微調實戰:中文語音識別數據準備全流程解密

QLoRA微調實戰:中文語音識別數據準備全流程解密 實戰項目:QLoRA 微調數據準備詳解 本環節我們將以中文語音識別任務為場景,詳細拆解 QLoRA 微調前的數據準備流程。以下流程圖展示了完整的數據處理路徑: #mermaid-svg-A3ZpWn1ysZUg6jg4 {font-family:"trebuchet ms&q…

工業電子看板賦能線纜工廠生產高效運轉

在制造業智能化轉型的浪潮中&#xff0c;工業電子看板已不再只是“顯示數據的屏幕”&#xff0c;而是成為連接設備層、控制層與管理層的實時信息樞紐。尤其在線纜制造這類對工藝參數敏感、生產連續性要求高的行業中&#xff0c;電子看板通過對關鍵數據的透明化、實時化與交互化…

Java爬蟲是什么,如何獲取API接口

一、Java爬蟲的定義Java爬蟲是一種基于Java編程語言開發的網絡爬蟲程序。它通過模擬瀏覽器行為&#xff0c;向目標網站發送HTTP請求&#xff0c;獲取網頁內容并解析出所需數據。Java爬蟲技術廣泛應用于數據采集、市場分析、競爭情報等領域。二、Java爬蟲獲取API接口的方法&…

Python篇---返回類型

基礎返回類型&#xff1a;在 Python 中&#xff0c;函數的返回類型就像函數 “產出” 的不同 “物品”&#xff0c;理解它們能幫你更好地控制代碼的輸出。下面用通俗的方式介紹常見的返回類型及用法&#xff1a;一、最基礎的返回類型1. 無返回值&#xff08;None&#xff09;特…

ArkTS 與 TypeScript 的關系及鴻蒙開發常見錯誤案例

隨著 HarmonyOS NEXT&#xff08;純血鴻蒙&#xff09; 的到來&#xff0c;開發者在學習鴻蒙應用開發時會遇到一個新的語言 —— ArkTS。很多人會疑惑&#xff1a;它和 TypeScript&#xff08;TS&#xff09;是什么關系&#xff1f;又有哪些新的特性&#xff1f;在實際開發中&a…