Files
Simba-OmniInfantry/云台/modules/LED/led.c
T
LSMushui a4da5ad17c chore: 导入 Simba-OmniInfantry 基线(云台/底盘双工程)
- 云台(ROBOT_TYPE_GIMBAL)与底盘(ROBOT_TYPE_CHASSIS)完整固件源码
- 新增根级 .gitignore,排除 Keil MDK-ARM 构建产物(.o/.d/.crf/.axf/.lnp/.map/.htm/.sct/.dep/.iex/.lst 等)
  与 *.uvguix.* / DebugConfig/(与机器绑定的 UI 布局)
- core.autocrlf=false,避免固件源码在检出时被改动换行符
2026-09-12 10:28:21 +08:00

66 lines
2.0 KiB
C

/* =============================================================================
* 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);
}