/* ============================================================================= * led.c - C 板 RGB LED(TIM5 CH1/2/3 -> PH10 蓝/PH11 绿/PH12 红,高电平亮) * 说明: CubeMX 配置 TIM5 PSC=0/ARR=65535,此处改为 legacy 的 PSC=83/ARR=999 * (1kHz PWM 千分位);所有接口带懒初始化,任何任务/初始化阶段都能安全 * 调用用于报警(引脚处于复用模式时直接写 GPIO 寄存器是无效的) * ========================================================================== */ #include "led.h" #include "tim.h" extern TIM_HandleTypeDef htim5; static uint8_t led_inited = 0; void led_ensure_init(void) { if (!led_inited) led_init(); } void led_init(void) { led_inited = 1; /* CubeMX 生成的 PSC=0/ARR=65535 改为 legacy 的 PSC=83/ARR=999(1kHz PWM,千分位) */ __HAL_TIM_SET_PRESCALER(&htim5, 84 - 1); __HAL_TIM_SET_AUTORELOAD(&htim5, 1000 - 1); __HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_1, 0); __HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_2, 0); __HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_3, 0); HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_3); } /* 通道与颜色的对应关系同 legacy:CCR1=蓝,CCR2=绿,CCR3=红 */ void led_set_color(uint8_t r, uint8_t g, uint8_t b) { led_ensure_init(); __HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_1, (uint32_t)b * 1000 / 255); __HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_2, (uint32_t)g * 1000 / 255); __HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_3, (uint32_t)r * 1000 / 255); } void led_set_all_off(void) { led_ensure_init(); led_set_color(0, 0, 0); } void led_set_red(uint8_t on) { led_ensure_init(); __HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_3, on ? 1000 : 0); } void led_set_green(uint8_t on) { led_ensure_init(); __HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_2, on ? 1000 : 0); } void led_set_blue(uint8_t on) { led_ensure_init(); __HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_1, on ? 1000 : 0); }