构建开发板上的LED板级支持包

image.png
LED的板级支持包:

  • GPIO初始化

Makefile中的C sources中添加这么一段:

  1. ######################################
  2. # source
  3. ######################################
  4. # C sources
  5. C_SOURCES = \
  6. ....
  7. User/LED/bsp_led.c \
  1. #ifndef __BSP_LED_H_ //防止头文件被重复引用
  2. #define __BSP_LED_H_
  3. #include "stm32f4xx.h" //为了使用hal库里的函数,引入这个头文件
  4. //1.声明一个函数,实现'初始化GPIO(LED)'的功能
  5. void LED_GPIO_Init(void);
  6. #endif

我的stm32f407vet6最小开发板LED只有一个,所以就初始化一个,大家按照自己的板子原理图上来

  1. #include "bsp_led.h"
  2. /**
  3. * @brief
  4. * STM32F407VET6最小系统板的LED的GPIO进行初始化函数
  5. * date: 2022.6.27
  6. */
  7. void LED_GPIO_Init(void){
  8. /*
  9. typedef struct
  10. {
  11. uint32_t Pin; //GPIO的引脚,可以配置为任何一个值
  12. uint32_t Mode;
  13. uint32_t Pull;
  14. uint32_t Speed;
  15. uint32_t Alternate;
  16. }GPIO_InitTypeDef;
  17. */
  18. GPIO_InitTypeDef LED_GPIO_Init; //初始化的结构体
  19. __HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC的时钟
  20. /*
  21. #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\
  22. ((MODE) == GPIO_MODE_OUTPUT_PP) ||\
  23. ((MODE) == GPIO_MODE_OUTPUT_OD) ||\
  24. ((MODE) == GPIO_MODE_AF_PP) ||\
  25. ((MODE) == GPIO_MODE_AF_OD) ||\
  26. ((MODE) == GPIO_MODE_IT_RISING) ||\
  27. ((MODE) == GPIO_MODE_IT_FALLING) ||\
  28. ((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\
  29. ((MODE) == GPIO_MODE_EVT_RISING) ||\
  30. ((MODE) == GPIO_MODE_EVT_FALLING) ||\
  31. ((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||\
  32. ((MODE) == GPIO_MODE_ANALOG))
  33. */
  34. LED_GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;//GPIO_MODE_OUTPUT_PP : 推挽输出
  35. /*
  36. #define IS_GPIO_PIN(PIN) (((((uint32_t)PIN) & GPIO_PIN_MASK ) != 0x00U) && ((((uint32_t)PIN) & ~GPIO_PIN_MASK) == 0x
  37. */
  38. LED_GPIO_Init.Pin = GPIO_PIN_0; //GPIO_PIN_0 | GPIO_PIN_1 : 可以多个
  39. /*
  40. #define IS_GPIO_PULL(PULL) (((PULL) == GPIO_NOPULL) || ((PULL) == GPIO_PULLUP) || \
  41. ((PULL) == GPIO_PULLDOWN))
  42. */
  43. LED_GPIO_Init.Pull = GPIO_NOPULL;//上下拉。GPIO_PULLUP: 上拉;GPIO_PULLDOWN: 下拉; GPIO_NOPULL: 即不上拉也不下拉
  44. /*
  45. #define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_SPEED_FREQ_LOW) || ((SPEED) == GPIO_SPEED_FREQ_MEDIUM) || \
  46. ((SPEED) == GPIO_SPEED_FREQ_HIGH) || ((SPEED) == GPIO_SPEED_FREQ_VERY_HIGH))
  47. */
  48. LED_GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;//GPIO_SPEED_FREQ_LOW: 慢;GPIO_SPEED_FREQ_VERY_HIGH: 快; GPIO_SPEED_FREQ_MEDIUM: 中
  49. HAL_GPIO_Init(GPIOC,&LED_GPIO_Init);
  50. }
  • 点亮LED/熄灭LED/翻转LED
    • 使用宏定义(#define)实现点亮 ```c

      ifndef _BSP_LED_H //防止头文件被重复引用

      define _BSP_LED_H

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

  1. > 使用板级支持包
  2. ```c
  3. ...
  4. /* USER CODE BEGIN Includes */
  5. #include "bsp_led.h"
  6. /* USER CODE END Includes */
  7. ...
  8. /* USER CODE BEGIN 2 */
  9. LED_GPIO_Init();
  10. /* USER CODE END 2 */
  11. /* Infinite loop */
  12. /* USER CODE BEGIN WHILE */
  13. while (1)
  14. {
  15. /* USER CODE END WHILE */
  16. /* USER CODE BEGIN 3 */
  17. LED_YG_Toggle;
  18. HAL_Delay(500);
  19. }
  20. /* USER CODE END 3 */
  21. ...

烧录详情请看(vscode使用stm32)

构建开发板上的按键板级支持包

LED板级支持包基本一致

  1. ######################################
  2. # source
  3. ######################################
  4. # C sources
  5. C_SOURCES = \
  6. ....
  7. User/KEY/bsp_button.c \
  1. #ifndef __BSP_BUTTON_H_
  2. #define __BSP_BUTTON_H_
  3. #include "stm32f4xx.h"
  4. //3.申明1和0的宏定义
  5. #define KEYUP 0
  6. #define KEYDOWN 1
  7. //1.声明一个函数,实现'初始化GPIO(KEY)'的功能
  8. void BUTTON_GPIO_Init(void);
  9. //2.读取按键是否被按下,就是按键的状态。按下/未按下
  10. uint8_t Button_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
  11. #endif
  1. #include "bsp_button.h"
  2. void BUTTON_GPIO_Init(void){
  3. GPIO_InitTypeDef BUTTON_GPIO_Init;
  4. __HAL_RCC_GPIOC_CLK_ENABLE();
  5. /*
  6. #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\
  7. ((MODE) == GPIO_MODE_OUTPUT_PP) ||\
  8. ((MODE) == GPIO_MODE_OUTPUT_OD) ||\
  9. ((MODE) == GPIO_MODE_AF_PP) ||\
  10. ((MODE) == GPIO_MODE_AF_OD) ||\
  11. ((MODE) == GPIO_MODE_IT_RISING) ||\
  12. ((MODE) == GPIO_MODE_IT_FALLING) ||\
  13. ((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\
  14. ((MODE) == GPIO_MODE_EVT_RISING) ||\
  15. ((MODE) == GPIO_MODE_EVT_FALLING) ||\
  16. ((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||\
  17. ((MODE) == GPIO_MODE_ANALOG))
  18. */
  19. BUTTON_GPIO_Init.Mode = GPIO_MODE_INPUT;//GPIO_MODE_INPUT: 输入
  20. BUTTON_GPIO_Init.Pin = GPIO_PIN_1;
  21. BUTTON_GPIO_Init.Pull = GPIO_NOPULL;//上下拉。GPIO_PULLUP: 上拉;GPIO_PULLDOWN: 下拉; GPIO_NOPULL: 即不上拉也不下拉
  22. /*
  23. #define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_SPEED_FREQ_LOW) || ((SPEED) == GPIO_SPEED_FREQ_MEDIUM) || \
  24. ((SPEED) == GPIO_SPEED_FREQ_HIGH) || ((SPEED) == GPIO_SPEED_FREQ_VERY_HIGH))
  25. */
  26. BUTTON_GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;//GPIO_SPEED_FREQ_LOW: 慢;GPIO_SPEED_FREQ_VERY_HIGH: 快; GPIO_SPEED_FREQ_MEDIUM: 中
  27. HAL_GPIO_Init(GPIOC,&BUTTON_GPIO_Init);
  28. }
  29. uint8_t Button_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin){
  30. /*判断按键是否被按下*/
  31. if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == GPIO_PIN_SET){
  32. /*按键被按下*/
  33. while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == GPIO_PIN_SET);
  34. return KEYDOWN;
  35. }else{
  36. /*按键未被按下*/
  37. return KEYUP;
  38. }
  39. }
  1. ...
  2. /* USER CODE BEGIN Includes */
  3. #include "bsp_button.h"
  4. /* USER CODE END Includes */
  5. ....
  6. /* USER CODE BEGIN 2 */
  7. BUTTON_GPIO_Init();
  8. /* USER CODE END 2 */
  9. /* Infinite loop */
  10. /* USER CODE BEGIN WHILE */
  11. while (1)
  12. {
  13. /* USER CODE END WHILE */
  14. /* USER CODE BEGIN 3 */
  15. if(Button_Scan(GPIOC,GPIO_PIN_1) == KEYDOWN){
  16. LED_YG_Toggle;
  17. }
  18. }
  19. /* USER CODE END 3 */
  20. ...