🎩 歡迎來到技術探索的奇幻世界👨?💻
📜 個人主頁:@一倫明悅-CSDN博客
?🏻 作者簡介:?C++軟件開發、Python機器學習愛好者
🗣??互動與支持:💬評論?? ? ?👍🏻點贊?? ? ?📂收藏?? ? 👀關注+
如果文章有所幫助,歡迎留下您寶貴的評論,
點贊加收藏支持我,點擊關注,一起進步!
前言
? ? ? ?STM32是一系列由STMicroelectronics開發的32位ARM Cortex-M微控制器系列,廣泛應用于嵌入式系統中。它們提供了豐富的外設和性能,適用于各種應用領域,包括工業控制、汽車、消費電子等。STM32系列有多個產品系列,每個系列針對不同的應用需求提供了多種型號和配置選項。要對STM32有一個全面的總結,可以涵蓋其主要特點、產品系列、應用領域、開發工具和生態系統等方面的信息。
????????代碼實現資源鏈接
【免費】STM32實現LED燈閃爍資源-CSDN文庫https://download.csdn.net/download/m0_59951855/89359786?spm=1001.2014.3001.5503
正文
01-LED燈1實現
? ? ? ?當想要在STM32單片機上實現LED燈的閃爍時,可以遵循以下步驟:
初始化GPIO引腳:首先,需要初始化用于連接LED的GPIO引腳。這包括設置引腳的模式(輸入/輸出)、速度、上拉/下拉等。
配置定時器(Timer):使用一個定時器來生成定期的中斷,以便控制LED的閃爍頻率。可以選擇適當的定時器和預分頻器來生成適當的時鐘頻率。
編寫中斷服務程序(ISR):在定時器中斷服務程序中,可以切換LED的狀態,從而使其閃爍。可以在每次中斷時切換LED的狀態,或者根據需要計算適當的間隔。
編寫主程序:在主程序中初始化所有必要的硬件和變量,并啟動定時器。然后,可以讓主程序進入一個無限循環,在循環中等待定時器中斷。
編譯和下載程序:最后,將程序編譯為可執行文件,并通過調試器將其下載到STM32單片機中進行測試。
????????LED燈1實現
????????LED1.h文件:
????????這段.h文件是LED模塊的頭文件,用于聲明LED相關的函數和變量。讓我解釋一下:
-
#ifndef __LED_H
?和?#define __LED_H
:這是頭文件保護措施,確保在同一編譯單元中只包含一次該頭文件內容,防止重復定義。 -
void LED1_Init(void);
:這是LED1初始化函數的聲明,告訴編譯器該函數的存在和接口。 -
#endif
:結束頭文件的定義。
????????這個頭文件的作用是在其他源文件中包含它后,可以調用LED1_Init函數進行LED的初始化。
#ifndef __LED_H
#define __LED_Hvoid LED1_Init(void);#endif
????????LED1.cpp文件:這段代碼是用于在STM32F10x系列單片機上初始化一個LED(Light Emitting Diode)的函數。詳細解釋如下:
-
#include "stm32f10x.h"
:這行代碼包含了STM32F10x系列的設備頭文件,其中包含了該系列單片機的寄存器定義和常量聲明等信息。 -
void LED1_Init(void)
:這是一個無返回值的函數,用于初始化LED。 -
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
:這行代碼用于使能GPIOA的時鐘。在STM32中,訪問GPIO需要先使能相應的時鐘。 -
GPIO_InitTypeDef GPIO_InitStructure;
:定義了一個結構體變量GPIO_InitStructure
,用于配置GPIO初始化參數。 -
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
:將GPIOA的引腳1配置為推挽輸出模式。在這種模式下,GPIO引腳可以提供高電平和低電平輸出。 -
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
:選擇了GPIOA的引腳1作為LED連接的引腳。 -
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
:配置了GPIO的輸出速度為50MHz。 -
GPIO_Init(GPIOA, &GPIO_InitStructure);
:根據上述配置初始化GPIOA的引腳1。 -
在注釋中提到了兩種驅動方式:
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相關的函數和變量。解釋如下:
-
#ifndef __LED2_H
?和?#define __LED2_H
:這是頭文件保護措施,確保在同一編譯單元中只包含一次該頭文件內容,防止重復定義。 -
void LED2_Init(void);
:這是LED2初始化函數的聲明,告訴編譯器該函數的存在和接口。 -
#endif
:結束頭文件的定義。
????????這個頭文件的作用是在其他源文件中包含它后,可以調用LED2_Init函數進行LED2的初始化。
#ifndef __LED2_H
#define __LED2_Hvoid LED2_Init(void);#endif
????????LED2.cpp文件:這段代碼是用于在STM32F10x系列單片機上初始化另一個LED的函數。解釋如下:
-
#include "stm32f10x.h"
:同樣是包含了STM32F10x系列的設備頭文件,以便使用相關的寄存器定義和常量聲明。 -
void LED2_Init(void)
:這是另一個無返回值的函數,用于初始化第二個LED。 -
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
:這行代碼用于使能GPIOB的時鐘,因為第二個LED連接在GPIOB上。 -
GPIO_InitTypeDef GPIO_InitStructure;
:定義了一個新的結構體變量GPIO_InitStructure
,用于配置GPIOB的初始化參數。 -
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
:同樣將GPIOB的引腳1配置為推挽輸出模式。 -
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
:選擇了GPIOB的引腳1作為第二個LED連接的引腳。 -
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
:配置了GPIO的輸出速度為50MHz。 -
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_us
、Delay_ms
和Delay_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_us
、Delay_ms
和Delay_s
,分別用于提供微秒級、毫秒級和秒級的延時。下面分別解釋這三個函數:
-
void Delay_us(uint32_t xus)
:這個函數用于提供微秒級的延時。它使用了STM32的系統滴答(SysTick)定時器來實現延時。xus
參數是要延時的微秒數,通過乘以72(STM32的系統時鐘頻率,HCLK,假設為72MHz)來計算出SysTick定時器的重裝載值。然后設置SysTick定時器的時鐘源為HCLK,啟動定時器,等待定時器計數到0,最后關閉定時器。 -
void Delay_ms(uint32_t xms)
:這個函數用于提供毫秒級的延時。它通過調用Delay_us
函數來實現,每次調用Delay_us
函數延時1000微秒,即1毫秒,通過xms
參數指定的次數來控制總的延時毫秒數。 -
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-主函數實現
? ? ? ?主函數實現代碼如下:
????????這段主函數代碼主要完成了以下幾個任務:
包含了必要的頭文件,如STM32F10x系列的設備頭文件、延時函數頭文件、LED1和LED2的頭文件。
在main函數中調用了LED1_Init和LED2_Init函數,分別初始化了兩個LED的引腳。
進入一個無限循環(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的亮滅間隔。
總結如下步驟:
包含必要的頭文件,如STM32的設備頭文件和延時函數頭文件。
初始化LED的GPIO引腳,可以通過調用初始化函數實現。
進入一個無限循環,通常使用
while(1)
。在循環中,通過操作GPIO引腳的寄存器,設置LED引腳的狀態,從而控制LED的亮滅。
在LED狀態改變后,添加適當的延時,以控制LED的亮滅間隔。
循環執行步驟4和步驟5,實現LED的閃爍效果。
????????這樣,通過簡單的C語言代碼,就可以在STM32上實現LED的閃爍功能。