简易挡位调节模块
1、初始化硬件
- 这里就不过多赘述了,去看我之前的帖子,我这篇帖子选择
TIM2
的1通道
PWM的简单应用
2、触发方式
(1)中断
I 初始化硬件
- 启用按钮的中断
- 在主函数外写入中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){uint16_t value;__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, value);
}
/* USER CODE END 0 */
(2)轮询
即在循环体内频繁判断按钮是否被按下
- 在主循环外侧定义全局变量
Value
uint16_t Value;
/* USER CODE END 0 */
- 在循环体内读取按钮处接口状态
HAL_Delay(99);if(HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == GPIO_PIN_RESET){/*-----------写入增加比较值的代码-----------------*/}
2、调节方式
I环状链表
代码部分
这里选择中断处理的方式来写
- 在主函数外侧声明结构体数组并重构中断回调函数
/* USER CODE BEGIN 0 */
struct Node{uint16_t CompareValue;
}Level[6];
uint16_t value;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){value = Level[value].CompareValue;__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, (value * 2000));
}
/* USER CODE END 0 */
- 在主函数内初始化数组
/* USER CODE BEGIN Init */Level[0].CompareValue = 1;Level[1].CompareValue = 2;Level[2].CompareValue = 3;Level[3].CompareValue = 4;Level[4].CompareValue = 5;Level[5].CompareValue = 0;/* USER CODE END Init */
原理
- 当按钮触发后,会产生中断回调,将PWM比较值变成环状链表的下一个键值
实验效果
- 可呈现6个挡位得亮度变化
II循环体
这里以"轮询的代码为例"
- 在主循环内写入以下内容
/* USER CODE BEGIN WHILE */while (1){//判断比较值是否装满if(Value > 19999)Value = 0;HAL_Delay(99);//延迟0.1秒//判断按钮是否按下if(HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == GPIO_PIN_RESET){//如果按下,则增加比较值Value += 500;__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, Value);}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}
实验原理、
- 每隔0.1秒,询问一次按钮处GPIO的状态,如果为按下状态,则增加500比较值
- 当比较值满了,则清空
实验效果
3、代码清单
stm32f4xx_hal.h
内
/*** @brief 读取指定的输入脚* @param GPIOx 指定的GPIO口* * @param GPIO_Pin 指定的GPIO引脚* This parameter can be GPIO_PIN_x where x can be (0..15).* @retval 输入引脚的状态*/
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
stm32f4xx_hal_gpio.h
内
/** * @brief GPIO 状态*/
typedef enum
{GPIO_PIN_RESET = 0,//置0GPIO_PIN_SET//置1
}GPIO_PinState;
4、总结
(1)触发方式
触发方式 | 特点 |
---|---|
轮询 | 占用资源,效率高 |
中断 | 效率高,但是占用资源 |
(2)调节方式
调节方式 | 特点 |
---|---|
环状链表 | 读写方便,但数据离散,占资源 |
循环体 | 可连续显示效果,但可读性不高 |