/* PWM 的假实现:只记住配置与占空比。宿主机专用。 */ #include #include "sim_hal.h" typedef struct { bool configured; int pin; uint32_t freq_hz; uint16_t permille; } ch_t; static ch_t s_ch[HAL_PWM_CH_MAX]; void sim_pwm_reset_internal(void); /* 只给 sim_hal_reset() 用 */ void sim_pwm_reset_internal(void) { memset(s_ch, 0, sizeof(s_ch)); } static bool valid(int ch) { return ch >= 0 && ch < HAL_PWM_CH_MAX; } hal_err_t hal_pwm_config(int ch, int pin, uint32_t freq_hz) { if (!valid(ch) || pin < 0 || pin >= SIM_GPIO_PINS || freq_hz == 0) { return HAL_ERR_ARG; } s_ch[ch] = (ch_t){ .configured = true, .pin = pin, .freq_hz = freq_hz, .permille = 0 }; return HAL_OK; } hal_err_t hal_pwm_set_permille(int ch, uint16_t permille) { if (!valid(ch) || !s_ch[ch].configured || permille > 1000) { return HAL_ERR_ARG; } s_ch[ch].permille = permille; return HAL_OK; } hal_err_t hal_pwm_get_permille(int ch, uint16_t *permille) { if (!valid(ch) || !s_ch[ch].configured || permille == NULL) { return HAL_ERR_ARG; } *permille = s_ch[ch].permille; return HAL_OK; } int sim_pwm_pin(int ch) { return valid(ch) && s_ch[ch].configured ? s_ch[ch].pin : -1; } uint32_t sim_pwm_freq(int ch) { return valid(ch) && s_ch[ch].configured ? s_ch[ch].freq_hz : 0; } int sim_pwm_permille(int ch) { return valid(ch) && s_ch[ch].configured ? (int)s_ch[ch].permille : -1; }