这个是用于C++工程的LED对象,使用很方便,特记录于此。
#define _LED_H_
#ifdef _LED_H_
class LED {
private:
GPIO_TypeDef* GPIOx;//GPIO分组。
uint16_t GPIO_Pin;//GPIO引脚编号。
protected:
void init(void){
if(GPIOx == nullptr)return;
//打开时钟并配置引脚。
#ifdef GPIOA
if(GPIOx == GPIOA) __HAL_RCC_GPIOA_CLK_ENABLE();
#endif
#ifdef GPIOB
if(GPIOx == GPIOB) __HAL_RCC_GPIOB_CLK_ENABLE();
#endif
#ifdef GPIOC
if(GPIOx == GPIOC) __HAL_RCC_GPIOC_CLK_ENABLE();
#endif
#ifdef GPIOD
if(GPIOx == GPIOD) __HAL_RCC_GPIOD_CLK_ENABLE();
#endif
#ifdef GPIOE
if(GPIOx == GPIOE) __HAL_RCC_GPIOE_CLK_ENABLE();
#endif
#ifdef GPIOF
if(GPIOx == GPIOF) __HAL_RCC_GPIOF_CLK_ENABLE();
#endif
#ifdef GPIOG
if(GPIOx == GPIOG) __HAL_RCC_GPIOG_CLK_ENABLE();
#endif
#ifdef GPIOH
if(GPIOx == GPIOH) __HAL_RCC_GPIOH_CLK_ENABLE();
#endif
//设置引脚。
HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET);
GPIO_InitTypeDef GPIO_InitStruct={0};
GPIO_InitStruct.Pin = GPIO_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
}
public:
LED(GPIO_TypeDef* port=nullptr, uint16_t pin=0):GPIOx(port),GPIO_Pin(pin){init();}
~LED(){;}
void begin(GPIO_TypeDef* port=nullptr, uint16_t pin=0){GPIOx=port;GPIO_Pin=pin;init();}
void Toggle(void) {if(GPIOx == nullptr)return;HAL_GPIO_TogglePin(GPIOx,GPIO_Pin);}
void SetState(bool state){if(GPIOx == nullptr)return;state == true ? HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET);}
bool GetState(void){if(GPIOx == nullptr)return false;return (HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_SET) ? true : false;}
};
#endif
使用非常方便,只需要先申明对象实例,然后调用其相关函数。就像下面这样让LED闪烁起来:
LED led0(GPIOE,GPIO_PIN_10);
while(1){
led0.Toggle();HAL_Delay(500);
}
最重要的是可以一次性申明一个LED数组,操作一大串LED就非常方便:
LED led[2];
led[0].begin(GPIOE,GPIO_PIN_10);led[1].begin(GPIOG,GPIO_PIN_10);
bool ledState=false;
while(1){
led[0].SetState(ledState);ledStat = !ledState;led[1].SetState(!ledState);
HAL_Delay(500);
}
如果需要在FOR循环中处理一大串LED,使用LED对象数组就非常方便。