STM32工程--IO口--按鍵控制點燈程式

2020-10-12 14:00:36

STM32F4工程--IO口--按鍵控制點燈程式(庫函數)

  ----晶片:STM32F429IGT6


本文章介紹使用STM32F4微控制器,利用按鍵控制LED燈的亮滅,通過按鍵和LED的控制,達到學習微控制器IO口設定的目的。本文章的工程連結如下,可自行儲存。

連結:https://pan.baidu.com/s/1lfhJiBIoiZuD_DldKdFwRw 
提取碼:p5i1 


1、STM32F4微控制器IO的基本知識

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 複用推輓輸出

(在這就說著一個知識吧,說的有點少,大佬見笑了)


2、新增LED_KEY工程

建立一個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",表示參照該檔案


3、新增程式碼

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;	
			 }				
		}
		
	}
}
 

4、主要程式碼解釋

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);  //按鍵初始化函數宣告


5、補充

1、這裡的按鍵為電阻下拉,LED燈為電阻下拉。

2、這裡的按鍵為PA0口,LED燈為PB0口。

3、我為什麼在每個檔案裡都包含#include "sys.h"   答:我把所有的標頭檔案都放到了sys.h下,之後其他檔案只參照這一個檔案就可以包含sys.h下的所有頭函數。(這也是一個小技巧,可以使用一下)


每天更新一篇文章,用於督促自己學習,同時更希望能幫助到大家,若有侵權請聯絡刪掉。

(每天更新時間為第二天06:00前,有時事多需熬夜,望大家監督,如果可以希望大家多多給建議)