【STM32F429單片機(jī)學(xué)習(xí)】單片機(jī)學(xué)習(xí)之LED跑馬燈實(shí)驗(yàn)
LED跑馬燈實(shí)驗(yàn)文件組成
一、LED.c(GPIO口的初始化、LED燈的基本功能)
分析代碼(顏色一樣的為一步)
首先引入頭文件
#include "led.h"?
引入了頭文件的一些聲明變量后 ,定義LED初始化其實(shí)就是初始化GPIO口+LED的基本功能?
void LED_Init(void)
{
定義一個(gè)結(jié)構(gòu)體,后續(xù)當(dāng)HAL庫函數(shù)初始化GPIO中的參數(shù)(函數(shù)的傳參要求)
??? GPIO_InitTypeDef GPIO_Initure;
使用任何IO口都要打開其時(shí)鐘,此代碼為打開B這個(gè)一群IO的時(shí)鐘
??? __HAL_RCC_GPIOB_CLK_ENABLE();?????????? //開啟GPIOB時(shí)鐘
?在時(shí)鐘打開后,我們要接下來要對IO口的輸出模式、速度等進(jìn)行設(shè)定
??? GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB1,0
??? GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;? //推挽輸出
??? GPIO_Initure.Pull=GPIO_PULLUP;????????? //上拉
??? GPIO_Initure.Speed=GPIO_SPEED_HIGH;???? //高速
??? HAL_GPIO_Init(GPIOB,&GPIO_Initure);
??? 對LED功能進(jìn)行簡單設(shè)置,其實(shí)就給IO配置高低電平,HAL_GPIO_WritePin與HAL_GPIO_ReadPin相對,一個(gè)是寫 一個(gè)是讀取,此函數(shù)需要三個(gè)參數(shù),前兩個(gè)為指針型的表示哪個(gè)IO口,然后次IO口的第幾個(gè),最后一個(gè)有兩種狀態(tài)分別是set reset表示高與低
?? HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);?? ?//PB0置1,默認(rèn)初始化后燈滅
??? HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);?? ?//PB1置1,默認(rèn)初始化后燈滅
}
注:燈不一定高電平有效 也不一定低電平有效 還是需要看怎么接的 到底是上拉 還是下拉
二、LED.h(聲明)
.h的保護(hù)代碼,目的是讓.h文件包含一次,防止編譯報(bào)錯
#ifndef _LED_H
#define _LED_H
#include "sys.h"
定義宏 讓PBOUT的值傳遞給LED0與1
#define LED0 PBout(1)?? //LED0
#define LED1 PBout(0)?? //LED1
聲明.c文件中的函數(shù)
void LED_Init(void);
#endif
三、main.c(主函數(shù))
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
定義主函數(shù)
int main(void)
{?
在主函數(shù)中調(diào)用你需要的函數(shù)(函數(shù)從.c文件定義,.h文件聲明)
??? HAL_Init();???????????????????? //初始化HAL庫? ?
??? Stm32_Clock_Init(360,25,2,8);?? //設(shè)置時(shí)鐘,180Mhz
??? delay_init(180);??????????????? //初始化延時(shí)函數(shù)
??? LED_Init();???????????????????? //初始化LED ?
構(gòu)造一個(gè)死循環(huán)
??? while(1)
?? ?{
通過HAL_GPIO_WritePin對I配置電平,來到LED一閃一滅的功能
? HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); //LED0對應(yīng)引腳PB1拉低,亮,等同于LED0(0)
??????? HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);?? //LED1對應(yīng)引腳PB0拉高,滅,等同于LED1(1)
??????? delay_ms(500);?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//延時(shí)500ms
??????? HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);?? //LED0對應(yīng)引腳PB1拉高,滅,等同于LED0(1)
??????? HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //LED1對應(yīng)引腳PB0拉低,亮,等同于LED1(0)
??????? delay_ms(500);????????????
?? ? }
?}?? ?