STM32 在使用define初始化时,可能需要很多XXXGPIOX,
示例使用了连接符“##”和exp限制宏的展开完成了相关功能
#ifndef __LED_BLINK_H#define __LED_BLINK_H
#include "stm32f4xx_hal.h"#include "main.h"#include "type_def.h"
//only chane these two lines#define LED_BLINK_PORT_GROUP E#define LED_BLINK_PIN GPIO_PIN_8
#define GPIO_FUNC_PORT(x) GPIO##x#define GPIO_MACRO_PORT(x) _GPIO##x#define EXP_MACRO(x,y) x(y)
void LED_Blink_Task(void *argument);
#define LED_BLINK_GPIO_PORT GPIO_FUNC_PORT(LED_BLINK_PORT)#define HAL_GPIO_CLK_ENABLE(c) __HAL_RCC##c##_CLK_ENABLE();#define BLINK_LED_GPIO_CLK_ENABLE() EXP_MACRO(HAL_GPIO_CLK_ENABLE, EXP_MACRO(GPIO_MACRO_PORT, LED_BLINK_PORT_GROUP));#define LED_BLINK_PORT EXP_MACRO(GPIO_FUNC_PORT, LED_BLINK_PORT_GROUP)
#endif#include "main.h"#include "led_blink.h"#include "cmsis_os.h"
void LED_Blink_Task(void *argument){ GPIO_InitTypeDef GPIO_InitStruct = {0};
BLINK_LED_GPIO_CLK_ENABLE(); GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pin = LED_BLINK_PIN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(LED_BLINK_PORT, &GPIO_InitStruct); /* USER CODE BEGIN LED_Blink_Task */ LOGI("LED_Blink_Task Start");
/* Infinite loop */ for (;;) { HAL_GPIO_TogglePin(LED_BLINK_PORT, LED_BLINK_PIN); osDelay(100); } /* USER CODE END LED_Blink_Task */}