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