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前,有時事多需熬夜,望大家監督,如果可以希望大家多多給建議)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/169501.html
標籤:其他
上一篇:VARON設計流程及示例
