天天看點

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

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的路徑。添加辦法我想你已經知道了,(不知道的話見上一篇文章,或者上浏覽器,哈哈哈)添加後的工程界面如下:(這個是我重建立了個工程,上次的工程名字不好聽)

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

此時我們的LED_KEY.c的檔案是空白的,我們先打上一行代碼:#include "LED_KEY.h"

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

此時我們可以通過右鍵--->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",表示引用該檔案

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

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前,有時事多需熬夜,望大家監督,如果可以希望大家多多給建議)