----晶片:STM32F429IGT6
本文章介紹使用STM32F4微控制器,利用按鍵控制LED燈的亮滅,通過按鍵和LED的控制,達到學習微控制器IO口設定的目的。本文章的工程連結如下,可自行儲存。
連結:https://pan.baidu.com/s/1lfhJiBIoiZuD_DldKdFwRw
提取碼:p5i1
STM32F4微控制器, IO 可以由軟體設定成如下 8 種模式中的任何一種:
(1)GPIO_Mode_AIN 模擬輸入 ------用於檢測模擬訊號
(2)GPIO_Mode_IN_FLOATING 浮空輸入------可以做KEY的按鍵輸入
(3)GPIO_Mode_IPD 下拉輸入------內部連線有下拉電阻
(4)GPIO_Mode_IPU 上拉輸入------內部連線有上拉電阻
(5)GPIO_Mode_Out_OD 開漏輸出
(6)GPIO_Mode_Out_PP 推輓輸出
(7)GPIO_Mode_AF_OD 複用開漏輸出
(8)GPIO_Mode_AF_PP 複用推輓輸出
(在這就說著一個知識吧,說的有點少,大佬見笑了)
建立一個LED_KEY.c和LED_KEY.h兩個檔案,放到工程的HARDWARE資料夾下,建立的辦法是新建一個記事本,把名字改為LED_KEY.c和LED_KEY.h就可以了,記住把原來的.txt字尾名給他刪掉。
然後在工程的HARDWARE檔案下新增LED_KEY.c,然後再包含LED_KEY的路徑。新增辦法我想你已經知道了,(不知道的話見上一篇文章,或者上瀏覽器,哈哈哈)新增後的工程介面如下:(這個是我重新建了個工程,上次的工程名字不好聽)
此時我們的LED_KEY.c的檔案是空白的,我們先打上一行程式碼:#include "LED_KEY.h"
此時我們可以通過右鍵--->Open document LED_KEY.h來開啟LED_KEY.h檔案。我們先開啟這個檔案輸入
#ifndef _LED_KEY_H
#define _LED_KEY_H
#endif
輸入這個的意思是:如果LED_KEY.h第一次被參照,那麼_LED_KEY_H
沒有被定義,所以#define _LED_KEY_H
和#endif
中間的標頭檔案內容就被執行,也就是標頭檔案內容被定義。那麼如果led.h第二次被參照,由於_LED_KEY_H
已經被第一次參照時定義了,所以不會執行#define _LED_KEY_H
和#endif
中間的標頭檔案內容,也就是不會重複定義標頭檔案內容。
在mian.c檔案上方新增程式碼#include "LED_KEY.h",表示參照該檔案
在LED_KEY.c下加入以下程式碼:
#include "LED_KEY.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE(); //開啟GPIOB時鐘
GPIO_Initure.Pin=GPIO_PIN_0; //PB0
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推輓輸出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //PB0置1,預設初始化後燈滅
}
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //開啟GPIOA時鐘
GPIO_Initure.Pin=GPIO_PIN_0; //PA0
GPIO_Initure.Mode=GPIO_MODE_INPUT; //輸入
GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}
在LED_KEY.h下加入以下程式碼:
#ifndef _LED_KEY_H
#define _LED_KEY_H
#include "sys.h" //包含標頭檔案
#define LED PBout(0) //定義LED0
#define KEY_LED HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) //KEY_LED按鍵PA0
void LED_Init(void); //LED燈初始化函數
void KEY_Init(void); //按鍵初始化函數
#endif
在main.c下加入以下程式碼:
#include "sys.h"
#include "LED_KEY.h"
int main(void)
{
HAL_Init(); //--初始化HAL庫
Stm32_Clock_Init(360,25,2,8); //--設定時鐘,180Mhz
delay_init(180); //---初始化延時函數
KEY_Init();//------------------------按鍵初始化函數
LED_Init();//------------------------LED初始化函數
while(1)
{
if(KEY_LED==1)
{
delay_ms(10);
if(KEY_LED==1)
{
LED=!LED;
}
}
}
}
1、main.c 下函數解釋
KEY_Init(); LED_Init();這兩個函數是宣告,想必大家都懂,函數使用前需要宣告一下。
while(1){ } 這裡面的函數也特別簡單,檢測按鍵是否被按下,如果按下就LED燈亮滅翻轉一下。
2、LED_KEY.c 下函數解釋
IO口初始化如下
GPIO_InitTypeDef GPIO_Initure; 這個是GPIO的結構體函數
__HAL_RCC_GPIOB_CLK_ENABLE(); 這個是時鐘函數,使用時選對應時鐘
GPIO_Initure.Pin=GPIO_PIN_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);
}
3、LED_KEY.h 下函數解釋
PBout(0) PB0的輸出狀態,PBout(0) =1;表示PB0口輸出高電平,PBout(0) =0;表示PB0口輸出低電平。
HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) 讀取PA0的引腳狀態
void LED_Init(void); //LED燈初始化函數宣告
void KEY_Init(void); //按鍵初始化函數宣告
1、這裡的按鍵為電阻下拉,LED燈為電阻下拉。
2、這裡的按鍵為PA0口,LED燈為PB0口。
3、我為什麼在每個檔案裡都包含#include "sys.h" 答:我把所有的標頭檔案都放到了sys.h下,之後其他檔案只參照這一個檔案就可以包含sys.h下的所有頭函數。(這也是一個小技巧,可以使用一下)
每天更新一篇文章,用於督促自己學習,同時更希望能幫助到大家,若有侵權請聯絡刪掉。
(每天更新時間為第二天06:00前,有時事多需熬夜,望大家監督,如果可以希望大家多多給建議)