#include "main.h"
#include "Led.h"
// LED对象声明
Led led1(GPIOA, GPIO_PIN_5);
int main(void)
{
// HAL库初始化
HAL_Init();
// System时钟配置
SystemClock_Config();
// GPIO时钟使能
__HAL_RCC_GPIOA_CLK_ENABLE();
// LED初始化
led1.Init();
while (1)
{
// LED闪烁
led1.Toggle();
HAL_Delay(500);
}
}
其中,Led.h头文件中包含了Led类的定义和声明:
#ifndef LED_H
#define LED_H
#include "stm32f4xx_hal.h"
class Led
{
public:
Led(GPIO_TypeDef* port, uint16_t pin);
void Init(void);
void On(void);
void Off(void);
void Toggle(void);
private:
GPIO_TypeDef* mPort;
uint16_t mPin;
};
#endif
在Led.cpp文件中,实现了Led类中定义的函数:
#include "Led.h"
Led::Led(GPIO_TypeDef* port, uint16_t pin)
: mPort(port), mPin(pin)
{
}
void Led::Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = mPin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(mPort, &GPIO_InitStruct);
}
void Led::On(void)
{
HAL_GPIO_WritePin(mPort, mPin, GPIO_PIN_SET);
}
void Led::Off(void)
{
HAL_GPIO_WritePin(mPort, mPin, GPIO_PIN_RESET);
}
void Led::Toggle(void)
{
HAL_GPIO_TogglePin(mPort, mPin);
}
这里的Led类封装了一个LED的控制,使用GPIO_TypeDef* port和uint16_t pin作为参数传入构造函数,然后实现了Init、On、Off和Toggle等函数来控制LED的开关和闪烁。在主函数中,我们创建了一个Led对象led1,并在while循环中不断调用Toggle函数使LED闪烁。
这个示例代码中,我们既使用了STM32 HAL库来控制GPIO口,又使用了C++的面向对象编程风格,通过封装一个Led类来简化代码,提高可读性和可维护性。
|