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); //按键初始化函数声明
|