- 构建开发板上的LED板级支持包
- ifndef _BSP_LED_H //防止头文件被重复引用
- define _BSP_LED_H
- include “stm32f4xx.h” //为了使用hal库里的函数,引入这个头文件
- define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET))
- define LED_YG_ON do{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET);}while(0)//do..while(0) : 只执行一次
- define LED_YG_OFF do{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);}while(0)//do..while(0) : 只执行一次
- define LED_YG_Toggle do{HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);}while(0)//do..while(0) : 只执行一次
- endif
构建开发板上的LED板级支持包

LED的板级支持包:
- GPIO初始化
在Makefile中的C sources中添加这么一段:
####################################### source####################################### C sourcesC_SOURCES = \....User/LED/bsp_led.c \
#ifndef __BSP_LED_H_ //防止头文件被重复引用#define __BSP_LED_H_#include "stm32f4xx.h" //为了使用hal库里的函数,引入这个头文件//1.声明一个函数,实现'初始化GPIO(LED)'的功能void LED_GPIO_Init(void);#endif
我的stm32f407vet6最小开发板LED只有一个,所以就初始化一个,大家按照自己的板子原理图上来
#include "bsp_led.h"/*** @brief* STM32F407VET6最小系统板的LED的GPIO进行初始化函数* date: 2022.6.27*/void LED_GPIO_Init(void){/*typedef struct{uint32_t Pin; //GPIO的引脚,可以配置为任何一个值uint32_t Mode;uint32_t Pull;uint32_t Speed;uint32_t Alternate;}GPIO_InitTypeDef;*/GPIO_InitTypeDef LED_GPIO_Init; //初始化的结构体__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC的时钟/*#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\((MODE) == GPIO_MODE_OUTPUT_PP) ||\((MODE) == GPIO_MODE_OUTPUT_OD) ||\((MODE) == GPIO_MODE_AF_PP) ||\((MODE) == GPIO_MODE_AF_OD) ||\((MODE) == GPIO_MODE_IT_RISING) ||\((MODE) == GPIO_MODE_IT_FALLING) ||\((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\((MODE) == GPIO_MODE_EVT_RISING) ||\((MODE) == GPIO_MODE_EVT_FALLING) ||\((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||\((MODE) == GPIO_MODE_ANALOG))*/LED_GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;//GPIO_MODE_OUTPUT_PP : 推挽输出/*#define IS_GPIO_PIN(PIN) (((((uint32_t)PIN) & GPIO_PIN_MASK ) != 0x00U) && ((((uint32_t)PIN) & ~GPIO_PIN_MASK) == 0x*/LED_GPIO_Init.Pin = GPIO_PIN_0; //GPIO_PIN_0 | GPIO_PIN_1 : 可以多个/*#define IS_GPIO_PULL(PULL) (((PULL) == GPIO_NOPULL) || ((PULL) == GPIO_PULLUP) || \((PULL) == GPIO_PULLDOWN))*/LED_GPIO_Init.Pull = GPIO_NOPULL;//上下拉。GPIO_PULLUP: 上拉;GPIO_PULLDOWN: 下拉; GPIO_NOPULL: 即不上拉也不下拉/*#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_SPEED_FREQ_LOW) || ((SPEED) == GPIO_SPEED_FREQ_MEDIUM) || \((SPEED) == GPIO_SPEED_FREQ_HIGH) || ((SPEED) == GPIO_SPEED_FREQ_VERY_HIGH))*/LED_GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;//GPIO_SPEED_FREQ_LOW: 慢;GPIO_SPEED_FREQ_VERY_HIGH: 快; GPIO_SPEED_FREQ_MEDIUM: 中HAL_GPIO_Init(GPIOC,&LED_GPIO_Init);}
include “stm32f4xx.h” //为了使用hal库里的函数,引入这个头文件
//2.宏定义LED的状态 /*
define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET))
*/ // #define LED_G_ON HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET)
define LED_YG_ON do{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET);}while(0)//do..while(0) : 只执行一次
define LED_YG_OFF do{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);}while(0)//do..while(0) : 只执行一次
define LED_YG_Toggle do{HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);}while(0)//do..while(0) : 只执行一次
//1.声明一个函数,实现’初始化GPIO(LED)’的功能 void LED_GPIO_Init(void);
endif
> 使用板级支持包```c.../* USER CODE BEGIN Includes */#include "bsp_led.h"/* USER CODE END Includes */.../* USER CODE BEGIN 2 */LED_GPIO_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */LED_YG_Toggle;HAL_Delay(500);}/* USER CODE END 3 */...
构建开发板上的按键板级支持包
与LED板级支持包基本一致
####################################### source####################################### C sourcesC_SOURCES = \....User/KEY/bsp_button.c \
#ifndef __BSP_BUTTON_H_#define __BSP_BUTTON_H_#include "stm32f4xx.h"//3.申明1和0的宏定义#define KEYUP 0#define KEYDOWN 1//1.声明一个函数,实现'初始化GPIO(KEY)'的功能void BUTTON_GPIO_Init(void);//2.读取按键是否被按下,就是按键的状态。按下/未按下uint8_t Button_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);#endif
#include "bsp_button.h"void BUTTON_GPIO_Init(void){GPIO_InitTypeDef BUTTON_GPIO_Init;__HAL_RCC_GPIOC_CLK_ENABLE();/*#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\((MODE) == GPIO_MODE_OUTPUT_PP) ||\((MODE) == GPIO_MODE_OUTPUT_OD) ||\((MODE) == GPIO_MODE_AF_PP) ||\((MODE) == GPIO_MODE_AF_OD) ||\((MODE) == GPIO_MODE_IT_RISING) ||\((MODE) == GPIO_MODE_IT_FALLING) ||\((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\((MODE) == GPIO_MODE_EVT_RISING) ||\((MODE) == GPIO_MODE_EVT_FALLING) ||\((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||\((MODE) == GPIO_MODE_ANALOG))*/BUTTON_GPIO_Init.Mode = GPIO_MODE_INPUT;//GPIO_MODE_INPUT: 输入BUTTON_GPIO_Init.Pin = GPIO_PIN_1;BUTTON_GPIO_Init.Pull = GPIO_NOPULL;//上下拉。GPIO_PULLUP: 上拉;GPIO_PULLDOWN: 下拉; GPIO_NOPULL: 即不上拉也不下拉/*#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_SPEED_FREQ_LOW) || ((SPEED) == GPIO_SPEED_FREQ_MEDIUM) || \((SPEED) == GPIO_SPEED_FREQ_HIGH) || ((SPEED) == GPIO_SPEED_FREQ_VERY_HIGH))*/BUTTON_GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;//GPIO_SPEED_FREQ_LOW: 慢;GPIO_SPEED_FREQ_VERY_HIGH: 快; GPIO_SPEED_FREQ_MEDIUM: 中HAL_GPIO_Init(GPIOC,&BUTTON_GPIO_Init);}uint8_t Button_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin){/*判断按键是否被按下*/if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == GPIO_PIN_SET){/*按键被按下*/while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == GPIO_PIN_SET);return KEYDOWN;}else{/*按键未被按下*/return KEYUP;}}
.../* USER CODE BEGIN Includes */#include "bsp_button.h"/* USER CODE END Includes */..../* USER CODE BEGIN 2 */BUTTON_GPIO_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(Button_Scan(GPIOC,GPIO_PIN_1) == KEYDOWN){LED_YG_Toggle;}}/* USER CODE END 3 */...
