2018年3月7日 星期三

STM32F4 如何輕鬆的自訂 LED 任意腳位初始化 與 點亮

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;
然後對著他初始化,就是設定角位(下面是設置成 PC4)
LED_init(led1, GPIOG, GPIO_PIN_2, GPIO_PIN_RESET );
GPIO_PIN_RESET 起始狀態是0
GPIO_PIN_SET 起始狀態是1
然後我們點亮他吧
LED_TogglePin(led1);
嗯就這麼簡單,要加函式在自己加~應該很容易能看懂

沒有留言:

張貼留言