STM32F4 如何輕鬆的自訂 LED 任意腳位初始化 與 點亮
有鑑於官方預設語言是C,想要點亮LED要做的工作也是有點多行,寫個一兩個還不是什麼大事,寫個幾10個然後發現有錯要修改,就難過了。
前一陣子在PTT看到有人用 macro 在 C 上面弄出 STL ,仿物件實在很牛QuQ
雖然看不董細節怎麼做的,不過至少原理是解了的,依樣畫葫蘆刻了一個做練習
雖然看不董細節怎麼做的,不過至少原理是解了的,依樣畫葫蘆刻了一個做練習
/**
* @brief LED initial Obj
* @author None
* @site https://charlottehong.blogspot.tw/
*/
#define STATEMENT_(...) do {__VA_ARGS__} while (0)
#define LED \
struct HAL_LED{ \
GPIO_TypeDef* port; \
uint16_t pin; \
GPIO_InitTypeDef GPIO_InitStruct; \
}
#define GPIO_ENABLE(GPIO) \
STATEMENT_( \
__HAL_RCC_##GPIO##_CLK_ENABLE(); \
)
#define LED_init(self, GPIO, GPIO_PIN, state) \
STATEMENT_( \
self.port=(GPIO); \
self.pin=(GPIO_PIN); \
__HAL_RCC_##GPIO##_CLK_ENABLE(); \
\
self.GPIO_InitStruct.Pin = self.pin; \
self.GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \
self.GPIO_InitStruct.Pull = GPIO_PULLUP; \
self.GPIO_InitStruct.Speed = GPIO_SPEED_FAST; \
\
HAL_GPIO_Init(self.port, &self.GPIO_InitStruct); \
HAL_GPIO_WritePin(self.port, self.pin, state); \
)
#define LED_WritePin(self, state) \
STATEMENT_( \
HAL_GPIO_WritePin(self.port, self.pin, state); \
)
#define LED_TogglePin(self) \
STATEMENT_( \
HAL_GPIO_TogglePin(self.port, self.pin); \
)
使用範例
你可以在主程式新增一個仿物件
LED led1;
LED led1;
然後對著他初始化,就是設定角位(下面是設置成 PC4)
LED_init(led1, GPIOG, GPIO_PIN_2, GPIO_PIN_RESET );
LED_init(led1, GPIOG, GPIO_PIN_2, GPIO_PIN_RESET );
GPIO_PIN_RESET 起始狀態是0
GPIO_PIN_SET 起始狀態是1
然後我們點亮他吧
LED_TogglePin(led1);
LED_TogglePin(led1);
嗯就這麼簡單,要加函式在自己加~應該很容易能看懂