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 */
}