要去HAL库第一个任务,通过按键切换led 模式:模式-:led以1s的频率 进行闪烁(要求用两种代码展 现):模式二:0.5s的延时进行 流水灯(延时部分用hal_delay和 定时器两种方法实现);模式 三:呼吸灯。按键按下一次,模 式切换一次, 三种模式轮流切换
时间: 2024-11-20 07:34:58 浏览: 57
在使用HAL库进行LED控制时,首先你需要初始化相关的硬件资源,如按键和LED。以下是两种不同的代码示例,展示了如何通过按键切换LED模式:
**方法一:使用HAL_Delay函数实现延时**
```c
#include "stm32f1xx_hal.h"
#include "pinout.h"
// 初始化LED和按键
void initHardware() {
GPIO_InitTypeDef GPIO_InitStruct;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
HAL_GPIO_Init(KEY_PORT, &GPIO_InitStruct);
// ...其他必要的配置...
}
int main(void) {
initHardware();
while (1) {
if (HAL_GPIO_ReadPin(KEY_PIN) == GPIO_PIN_SET) { // 按键检测
switch (currentMode) {
case MODE_1:
currentMode = MODE_2; // 切换到模式2
break;
case MODE_2:
currentMode = MODE_3; // 切换到模式3
break;
case MODE_3:
currentMode = MODE_1; // 切换回模式1
break;
default:
break;
}
if (currentMode == MODE_1) {
toggleLED(1000); // LED闪烁,1s周期
} else if (currentMode == MODE_2) {
ledBlinking(500); // 流水灯,0.5s延时
} else { // 模式3: 呼吸灯
breatheLED();
}
}
// ...其他循环内的操作...
}
return 0;
}
void toggleLED(uint32_t delayMS) {
HAL_Delay(delayMS);
HAL_GPIO_TogglePin(LED_PIN); // 翻转LED状态
}
void ledBlinking(uint32_t delayMS) {
for (uint8_t i = 0; i < NUM_LEDS; i++) {
HAL_Delay(delayMS);
HAL_GPIO_SetPinState(LED_PORT_BASE + i, GPIO_PIN_SET);
HAL_Delay(delayMS);
HAL_GPIO_ResetPin(LED_PORT_BASE + i);
}
}
// 呼吸灯实现略,这里假设有一个函数breatheLED()负责模拟呼吸效果
```
**方法二:使用定时器实现延时**
```c
#include "stm32f1xx_hal.h"
#include "tim.h"
// ...以及其他初始化...
void timLedBlinking(uint32_t periodMS) {
TIM_HandleTypeDef htim;
TIM_BDTRTypeDef sConfig;
TIM_ClockDivisionConfig(TIMx, TIM_CLOCKDIVISION_DIV1);
TIM_PrescalerConfig(TIMx, TIM_PRESCALER_DIV1); // 配置计数器预分频
htim.Instance = TIMx;
htim.Init.Prescaler = ... // 根据需要设置计数周期
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = periodMS / 1000;
HAL_TIM_Base_Init(&htim);
sConfig.BitSelection = TIM_BITSELECT_COM6;
sConfig.Oversize = TIM_OVERSIZING_NONE;
sConfig.ClockDivision = TIM_CLOCKDIVISION_DIV1;
sConfig.RepetitionCounter = 0;
HAL_TIM_Base_MspInit(&htim);
HAL_TIM_Base_Start_IT(&htim);
while (!HAL_TIM_Base_GetFlagStatus(&htim, TIM_FLAG_UPDATE)) {}
// 结束时清零标志并停止定时器
HAL_TIM_Base_Stop_IT(&htim);
HAL_TIM_Base_ClearFlag(&htim, TIM_FLAG_UPDATE);
HAL_TIM_Base_MspDeinit(&htim);
}
// 其他模式和主函数同上
```
阅读全文