优雅的利用define来进行STM32外设初始化

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