【STM32單片機】----實現LED燈閃爍實戰

34889d2e7fec4a02bb0ae3a22b011a2a.png

🎩 歡迎來到技術探索的奇幻世界👨?💻

📜 個人主頁:@一倫明悅-CSDN博客

?🏻 作者簡介:?C++軟件開發、Python機器學習愛好者

🗣??互動與支持💬評論?? ? ?👍🏻點贊?? ? ?📂收藏?? ? 👀關注+

如果文章有所幫助,歡迎留下您寶貴的評論,

點贊加收藏支持我,點擊關注,一起進步!

前言

? ? ? ?STM32是一系列由STMicroelectronics開發的32位ARM Cortex-M微控制器系列,廣泛應用于嵌入式系統中。它們提供了豐富的外設和性能,適用于各種應用領域,包括工業控制、汽車、消費電子等。STM32系列有多個產品系列,每個系列針對不同的應用需求提供了多種型號和配置選項。要對STM32有一個全面的總結,可以涵蓋其主要特點、產品系列、應用領域、開發工具和生態系統等方面的信息。

????????代碼實現資源鏈接

【免費】STM32實現LED燈閃爍資源-CSDN文庫icon-default.png?t=N7T8https://download.csdn.net/download/m0_59951855/89359786?spm=1001.2014.3001.5503

正文

01-LED燈1實現

? ? ? ?當想要在STM32單片機上實現LED燈的閃爍時,可以遵循以下步驟:

  1. 初始化GPIO引腳:首先,需要初始化用于連接LED的GPIO引腳。這包括設置引腳的模式(輸入/輸出)、速度、上拉/下拉等。

  2. 配置定時器(Timer):使用一個定時器來生成定期的中斷,以便控制LED的閃爍頻率。可以選擇適當的定時器和預分頻器來生成適當的時鐘頻率。

  3. 編寫中斷服務程序(ISR):在定時器中斷服務程序中,可以切換LED的狀態,從而使其閃爍。可以在每次中斷時切換LED的狀態,或者根據需要計算適當的間隔。

  4. 編寫主程序:在主程序中初始化所有必要的硬件和變量,并啟動定時器。然后,可以讓主程序進入一個無限循環,在循環中等待定時器中斷。

  5. 編譯和下載程序:最后,將程序編譯為可執行文件,并通過調試器將其下載到STM32單片機中進行測試。

????????LED燈1實現

????????LED1.h文件:

????????這段.h文件是LED模塊的頭文件,用于聲明LED相關的函數和變量。讓我解釋一下:

  1. #ifndef __LED_H?和?#define __LED_H:這是頭文件保護措施,確保在同一編譯單元中只包含一次該頭文件內容,防止重復定義。

  2. void LED1_Init(void);:這是LED1初始化函數的聲明,告訴編譯器該函數的存在和接口。

  3. #endif:結束頭文件的定義。

????????這個頭文件的作用是在其他源文件中包含它后,可以調用LED1_Init函數進行LED的初始化。

#ifndef __LED_H
#define __LED_Hvoid LED1_Init(void);#endif

????????LED1.cpp文件:這段代碼是用于在STM32F10x系列單片機上初始化一個LED(Light Emitting Diode)的函數。詳細解釋如下:

  1. #include "stm32f10x.h":這行代碼包含了STM32F10x系列的設備頭文件,其中包含了該系列單片機的寄存器定義和常量聲明等信息。

  2. void LED1_Init(void):這是一個無返回值的函數,用于初始化LED。

  3. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);:這行代碼用于使能GPIOA的時鐘。在STM32中,訪問GPIO需要先使能相應的時鐘。

  4. GPIO_InitTypeDef GPIO_InitStructure;:定義了一個結構體變量GPIO_InitStructure,用于配置GPIO初始化參數。

  5. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;:將GPIOA的引腳1配置為推挽輸出模式。在這種模式下,GPIO引腳可以提供高電平和低電平輸出。

  6. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;:選擇了GPIOA的引腳1作為LED連接的引腳。

  7. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;:配置了GPIO的輸出速度為50MHz。

  8. GPIO_Init(GPIOA, &GPIO_InitStructure);:根據上述配置初始化GPIOA的引腳1。

  9. 在注釋中提到了兩種驅動方式:

    • GPIO_ResetBits(GPIOA, GPIO_Pin_1);:將GPIOA的引腳1輸出低電平,LED熄滅。
    • GPIO_SetBits(GPIOA, GPIO_Pin_1);:將GPIOA的引腳1輸出高電平,LED點亮。

????????這段代碼的作用是初始化一個LED連接的GPIO引腳,配置為推挽輸出模式,并設置輸出速度為50MHz。

#include "stm32f10x.h"                  // Device headervoid LED1_Init(void)
{// 1、開啟時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 2、調用Init函數// 2-1、需要先進行結構體的定義GPIO_InitTypeDef GPIO_InitStructure;// 數據信號的推挽輸出,這個時候STM32對高低電平擁有絕對的控制權,此時LED燈長腳插在PA0口,短腳插在負極,高電平驅動也可以閃爍GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 變成了OD就成了開漏模式,就無法高電平驅動了GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;  // 選擇Pin_0是因為用的是GPIOA的0號引腳GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 輸出速度GPIO_Init(GPIOA,&GPIO_InitStructure);// 3、設置高電平,LED燈熄滅//GPIO_ResetBits(GPIOA,GPIO_Pin_1);//GPIO_SetBits(GPIOA,GPIO_Pin_2);
}

02-LED燈2實現

? ? ? ?LED燈2的實現如下:

????????LED2.h文件

????????這段.h文件是LED2模塊的頭文件,用于聲明LED2相關的函數和變量。解釋如下:

  1. #ifndef __LED2_H?和?#define __LED2_H:這是頭文件保護措施,確保在同一編譯單元中只包含一次該頭文件內容,防止重復定義。

  2. void LED2_Init(void);:這是LED2初始化函數的聲明,告訴編譯器該函數的存在和接口。

  3. #endif:結束頭文件的定義。

????????這個頭文件的作用是在其他源文件中包含它后,可以調用LED2_Init函數進行LED2的初始化。

#ifndef __LED2_H
#define __LED2_Hvoid LED2_Init(void);#endif

????????LED2.cpp文件:這段代碼是用于在STM32F10x系列單片機上初始化另一個LED的函數。解釋如下:

  1. #include "stm32f10x.h":同樣是包含了STM32F10x系列的設備頭文件,以便使用相關的寄存器定義和常量聲明。

  2. void LED2_Init(void):這是另一個無返回值的函數,用于初始化第二個LED。

  3. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);:這行代碼用于使能GPIOB的時鐘,因為第二個LED連接在GPIOB上。

  4. GPIO_InitTypeDef GPIO_InitStructure;:定義了一個新的結構體變量GPIO_InitStructure,用于配置GPIOB的初始化參數。

  5. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;:同樣將GPIOB的引腳1配置為推挽輸出模式。

  6. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;:選擇了GPIOB的引腳1作為第二個LED連接的引腳。

  7. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;:配置了GPIO的輸出速度為50MHz。

  8. GPIO_Init(GPIOB, &GPIO_InitStructure);:根據上述配置初始化GPIOB的引腳1。

????????這段代碼的作用與之前的LED1初始化函數類似,是初始化另一個LED連接的GPIO引腳,配置為推挽輸出模式,并設置輸出速度為50MHz。

#include "stm32f10x.h"                  // Device headervoid LED2_Init(void)
{// 1、開啟時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// 2、調用Init函數// 2-1、需要先進行結構體的定義GPIO_InitTypeDef GPIO_InitStructure;// 數據信號的推挽輸出,這個時候STM32對高低電平擁有絕對的控制權,此時LED燈長腳插在PA0口,短腳插在負極,高電平驅動也可以閃爍GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 變成了OD就成了開漏模式,就無法高電平驅動了GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;  // 選擇Pin_0是因為用的是GPIOA的0號引腳GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 輸出速度GPIO_Init(GPIOB,&GPIO_InitStructure);
}

03-延時函數實現

? ? ? ?Delay的實現如下:

????????Delay.h文件

????????這個.h文件定義了三個延時函數的聲明,分別是Delay_usDelay_msDelay_s,用于提供微秒級、毫秒級和秒級的延時功能。這些聲明可以讓其他源文件包含這個頭文件后直接調用這些函數,而不需要知道函數的具體實現細節。同時,文件開頭使用了#ifndef#define宏,以及#endif來實現頭文件保護,確保在同一編譯單元中只包含一次該頭文件內容,防止重復定義。

#ifndef __DELAY_H
#define __DELAY_Hvoid Delay_us(uint32_t us);  // 微秒延時
void Delay_ms(uint32_t ms);  // 毫秒延時
void Delay_s(uint32_t s);    // 秒延時#endif

????????Delay.cpp文件:這段代碼提供了三個延時函數:Delay_usDelay_msDelay_s,分別用于提供微秒級、毫秒級和秒級的延時。下面分別解釋這三個函數:

  1. void Delay_us(uint32_t xus):這個函數用于提供微秒級的延時。它使用了STM32的系統滴答(SysTick)定時器來實現延時。xus參數是要延時的微秒數,通過乘以72(STM32的系統時鐘頻率,HCLK,假設為72MHz)來計算出SysTick定時器的重裝載值。然后設置SysTick定時器的時鐘源為HCLK,啟動定時器,等待定時器計數到0,最后關閉定時器。

  2. void Delay_ms(uint32_t xms):這個函數用于提供毫秒級的延時。它通過調用Delay_us函數來實現,每次調用Delay_us函數延時1000微秒,即1毫秒,通過xms參數指定的次數來控制總的延時毫秒數。

  3. void Delay_s(uint32_t xs):這個函數用于提供秒級的延時。它通過調用Delay_ms函數來實現,每次調用Delay_ms函數延時1000毫秒,即1秒,通過xs參數指定的次數來控制總的延時秒數。

????????這三個延時函數都可以在STM32的開發中用于控制程序的執行流程,實現特定的延時效果。

#include "stm32f10x.h"/*** @brief  微秒級延時* @param  xus 延時時長,范圍:0~233015* @retval 無*/
void Delay_us(uint32_t xus)
{SysTick->LOAD = 72 * xus;				//設置定時器重裝值SysTick->VAL = 0x00;					//清空當前計數值SysTick->CTRL = 0x00000005;				//設置時鐘源為HCLK,啟動定時器while(!(SysTick->CTRL & 0x00010000));	//等待計數到0SysTick->CTRL = 0x00000004;				//關閉定時器
}/*** @brief  毫秒級延時* @param  xms 延時時長,范圍:0~4294967295* @retval 無*/
void Delay_ms(uint32_t xms)
{while(xms--){Delay_us(1000);}
}/*** @brief  秒級延時* @param  xs 延時時長,范圍:0~4294967295* @retval 無*/
void Delay_s(uint32_t xs)
{while(xs--){Delay_ms(1000);}
} 

04-主函數實現

? ? ? ?主函數實現代碼如下:

????????這段主函數代碼主要完成了以下幾個任務:

  1. 包含了必要的頭文件,如STM32F10x系列的設備頭文件、延時函數頭文件、LED1和LED2的頭文件。

  2. 在main函數中調用了LED1_Init和LED2_Init函數,分別初始化了兩個LED的引腳。

  3. 進入一個無限循環(while(1)),在循環中實現了LED1和LED2的閃爍效果:

    a. 首先點亮LED1,延時1000ms,然后熄滅LED1,延時1000ms,實現LED1每秒閃爍一次的效果。

    b. 接著點亮LED2,延時500ms,然后熄滅LED2,延時500ms,實現LED2每0.5秒閃爍一次的效果。

????????這樣,主函數完成了對兩個LED燈的初始化和控制,使它們交替閃爍。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "LED2.h"int main(void){LED1_Init();LED2_Init();// 4、設置低電平,LED燈亮起
//	GPIO_ResetBits(GPIOA,GPIO_Pin_1);// 5、也可以GPIO_WriteBit()函數設置高低電平// 前兩個參數和Set和Reset一樣,第三個參數用于清除端口值,和設置端口值// 如果參數=Bit_RESET,清除端口值,設置為低電平,燈亮;反之參數=Bit_SET,為高電平,燈滅
//	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);// 6、若是需要實現LED燈閃爍的命令,就需要在While死循環中進行一些設置while(1){// 點亮 兩個函數都可以
//		GPIO_ResetBits(GPIOA,GPIO_Pin_0);
//		Delay_ms(500);  // 延時函數直接調用即可
//	    GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
//		GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);  // 0為低電平// 7、這里加延時函數
//		Delay_ms(500);// 熄滅 
//		GPIO_SetBits(GPIOA,GPIO_Pin_0);
//		Delay_ms(500);
//	    GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET); 如果這里想要直接使用自己定義的參數代替第三個參數,
//		GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);  // 1為高電平//  (BitAction)0 需要加//	    Delay_ms(500);GPIO_SetBits(GPIOA,GPIO_Pin_1);Delay_ms(1000);GPIO_ResetBits(GPIOA,GPIO_Pin_1);Delay_ms(1000);GPIO_SetBits(GPIOB,GPIO_Pin_1);Delay_ms(500);GPIO_ResetBits(GPIOB,GPIO_Pin_1);Delay_ms(500);}}

總結

? ? ? ?實現LED燈閃爍的核心在于控制GPIO引腳的高低電平狀態和添加適當的延時。在STM32上,通過操作寄存器來控制GPIO引腳狀態,然后利用延時函數來控制LED的亮滅間隔。

總結如下步驟:

  1. 包含必要的頭文件,如STM32的設備頭文件和延時函數頭文件。

  2. 初始化LED的GPIO引腳,可以通過調用初始化函數實現。

  3. 進入一個無限循環,通常使用while(1)

  4. 在循環中,通過操作GPIO引腳的寄存器,設置LED引腳的狀態,從而控制LED的亮滅。

  5. 在LED狀態改變后,添加適當的延時,以控制LED的亮滅間隔。

  6. 循環執行步驟4和步驟5,實現LED的閃爍效果。

????????這樣,通過簡單的C語言代碼,就可以在STM32上實現LED的閃爍功能。

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

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

相關文章

【機器學習-23】關聯規則(Apriori)算法:介紹、應用與實現

在現代數據分析中,經常需要從大規模數據集中挖掘有用的信息。關聯規則挖掘是一種強大的技術,可以揭示數據中的隱藏關系和規律。本文將介紹如何使用Python進行關聯規則挖掘,以幫助您發現數據中的有趣模式。 一、引言 1. 簡要介紹關聯規則學習…

[處理器芯片]-5 超標量CPU實現之ALU

ALU(Arithmetic Logic Unit,算術邏輯單元),是CPU執行單元中最主要的組成部分。 1 主要功能 算術運算:執行加法、減法、乘法和除法等算術運算。 邏輯運算:執行與、或、非、異或等邏輯運算。 移位運算&am…

動態路由實驗—OSPF

動態路由協議實驗-------OSPF 鏈路狀態路由選擇協議又被稱為最短路徑優先協議&#xff0c;它基SPF&#xff08;shortest path first &#xff09;算法 實驗要求&#xff1a;各個PC之間能夠互通 1.四臺PC配置如下 PC1 PC2 PC3 PC4 2.配置各個交換機的口子的IP R1 <HUAWE…

Room注解無效原因

在Android項目中&#xff0c;如果父模塊使用Kotlin&#xff0c;而子模塊用Java編寫&#xff0c;并且在子模塊中使用了Room庫&#xff0c;那么你會發現需要使用kapt而不是annotationProcessor來處理Room注解。這里有幾個原因和背景知識&#xff1a; 1. 項目配置的影響 父模塊的…

spiderfoot一鍵掃描IP信息(KALI工具系列九)

目錄 1、KALI LINUX簡介 2、spiderfoot工具簡介 3、在KALI中使用spiderfoot 3.1 目標主機IP&#xff08;win&#xff09; 3.2 KALI的IP 4、命令示例 4.1 web訪問 4.2 掃描并進行DNS解析 4.3 全面掃描 5、總結 1、KALI LINUX簡介 Kali Linux 是一個功能強大、多才多…

YOLOv8+PyQt:實時檢測(攝像頭、視頻)

1.YOLO&#xff1a;CPU實時檢測&#xff08;攝像頭、視頻&#xff09;https://blog.csdn.net/qq_45445740/article/details/106557451 2.YOLOv8PyQt&#xff0c;實現攝像頭或視頻的實時檢測 需要安裝 PySide6 和 ultralytics pip install PySide6 pip install ultralyticsfr…

基于docxtpl的模板生成Word

docxtpl是一個用于生成Microsoft Word文檔的模板引擎庫。它結合了docx模塊和Jinja2模板引擎&#xff0c;使用戶能夠使用Microsoft Word模板文件并在其中填充動態數據。這個庫提供了一種方便的方式來生成個性化的Word文檔&#xff0c;并支持條件語句、循環語句和變量等控制結構&…

如何在 Elasticsearch 中選擇精確 kNN 搜索和近似 kNN 搜索

作者&#xff1a;來自 Elastic Carlos Delgado kNN 是什么&#xff1f; 語義搜索&#xff08;semantic search&#xff09;是相關性排名的強大工具。 它使你不僅可以使用關鍵字&#xff0c;還可以考慮文檔和查詢的實際含義。 語義搜索基于向量搜索&#xff08;vector search&…

Angular Ivy:新渲染引擎的性能提升與優化

Angular Ivy是Angular 9及更高版本中引入的默認渲染引擎&#xff0c;它取代了以前的View Engine。Ivy的目標是提高Angular的性能、減少包大小和提高開發者的生產力。 1. AOT編譯的改進&#xff1a; 在Ivy中&#xff0c;Angular使用了更早的AOT&#xff08;Ahead-of-Time&…

在AnolisOS8.9系統安裝docker-compose

在AnolisOS8.9系統安裝docker-compose 下載docker-compose之前請先確保docker已經安裝完&#xff0c;教程可以參考 在阿里Anolis OS 8.9龍蜥操作系統安裝docker 下載最新版的docker-compose文件 sudo curl -L https://github.com/docker/compose/releases/download/v2.21.0…

大數據工具之HIVE-參數調優,調度亂碼(二)

一、調度亂碼 在利用HUE工具,搭建WORKFLOW流程的過程中,如果直接執行hivesql數據正常,不會出現亂碼現象,如果利用WORKFLOW搭建的流程,進行數據的拉取,會出現數據中文亂碼現象,這些亂碼主要是由于select 中的硬編碼中文導致出現的現象 具體現象如下: select case when …

百度 提前批 國際化廣告部 (深圳-機器學習/數據挖掘/自然語言處理工程師) 一面+二面面經

文章目錄 0、面試情況1、一面1.1、簡歷上的項目介紹了個遍1.2、dbscan原理1.3、為什么梯度的負方向就是損失函數下降最快的方向&#xff1f;1.4、bn原理&#xff0c;為什么bn能解決過擬合&#xff0c;1.5、auc原理&#xff0c;為什么ctr或你的廣告推薦里用auc指標&#xff1f;1…

TG5032CGN TCXO 超高穩定10pin端子型適用于汽車動力轉向控制器

TG5032CGN TCXO / VC-TCXO是一款應用廣泛的晶振&#xff0c;具有超高穩定性&#xff0c;CMOS輸出和使用晶體基振的削波正弦波輸出形式。且有低相位噪聲優勢&#xff0c;是溫補晶體振蕩器(TCXO)和壓控晶體振蕩器(VCXO)結合的產物&#xff0c;具有TCXO和VCXO的共同優點&#xff0…

后臺接口返回void但是response有設置合適的相關信息,前端調用接口解析Blob數據下載excel文件

1、pom.xml文件增加依賴&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></dependency> 2、接口代碼如下&#xff1a; /*** 企業列表--導出*/GetMapping(value "/downloadTenantL…

微信小程序上線必備:SSL證書申請以及安裝

一、認識ssl證書 1、ssl證書是什么&#xff1f; SSL證書&#xff0c;全稱Secure Socket Layer Certificate&#xff0c;是一種數字證書&#xff0c;它遵循SSL&#xff08;現在通常指TLS&#xff0c;Transport Layer Security&#xff09;協議標準&#xff0c;用于在客戶端&…

SpringCloud系列(26)--OpenFeign超時控制

前言&#xff1a;在上一章節中我們簡單的介紹了如何使用OprnFeign去調用微服務&#xff0c;因為消費側和服務側是兩個不同的微服務&#xff0c;這樣可能會出現超時的現象&#xff0c;例如服務側需要3秒處理任何才能返回結果&#xff0c;但消費側可能2秒就斷開連接了&#xff0c…

【深度學習】2.單層感知機

目標&#xff1a; 實現一個簡單的二分類模型的訓練過程&#xff0c;通過模擬數據集進行訓練和優化&#xff0c;訓練目標是使模型能夠根據輸入特征正確分類數據。 演示: 1.通過PyTorch生成了一個模擬的二分類數據集&#xff0c;包括特征矩陣data_x和對應的標簽數據data_y。標簽…

加密與安全_AES RSA 密鑰對生成及PEM格式的代碼實現

文章目錄 RSA&#xff08;非對稱&#xff09;和AES&#xff08;對稱&#xff09;加密算法一、RSA&#xff08;Rivest-Shamir-Adleman&#xff09;二、AES&#xff08;Advanced Encryption Standard&#xff09; RSA加密三種填充模式一、RSA填充模式二、常見的RSA填充模式組合三…

新業務 新市場 | 靈途科技新品亮相馬來西亞亞洲防務展

5月6日&#xff0c;靈途科技攜新品模組與武漢長盈通光電&#xff08;股票代碼&#xff1a;688143&#xff09;攜手參加第18屆馬來西亞亞洲防務展。首次亮相海外&#xff0c;靈途科技便收獲全球客戶的廣泛關注&#xff0c;為公司海外市場開拓打下堅實基礎。 靈途科技與長盈通共同…

Dbs封裝_連接池

1.Dbs封裝 每一個數據庫都對應著一個dao 每個dao勢必存在公共部分 我們需要將公共部分抽取出來 封裝成一個工具類 保留個性化代碼即可 我們的工具類一般命名為xxxs 比如Strings 就是字符串相關的工具類 而工具類 我們將其放置于util包中我們以是否有<T>區分泛型方法和非泛…