#include "stc32g.h" #include "intrins.h" #define MAIN_Fosc 24000000L // 主时钟24MHz typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32; /**************************** 固定参数 400Hz PWM ****************************/ //#define PWM_FREQ 400 // 目标频率 //#define PERIOD 59999 // 24MHz下 400Hz 对应周期值 //#define DUTY 18000 // 30%占空比 (PERIOD/2) /**************************** 正确参数:50Hz / 30%占空比 ****************************/ #define PWM_FREQ 50 #define PSC_VAL 239 // 预分频值(核心修复:解决16位溢出) #define PERIOD 1999 // 周期值(16位寄存器最大值65535,合规) #define DUTY 600 // 30%占空比 (1999*0.3=600) /**************************** 官方宏定义 保留 ****************************/ #define PWM1_0 0x00 //P:P1.0 N:P1.1 #define PWM1_1 0x01 //P:P2.0 N:P2.1 #define PWM1_2 0x02 //P:P6.0 N:P6.1 ? 最终输出引脚 #define ENO1P 0x01 /*****************************************************************************/ void UpdatePwm(void); /******************** 主函数 **************************/ void main(void) { WTST = 0; EAXFR = 1; // 扩展寄存器访问使能 CKCON = 0; // IO口初始化 P0M1 = 0x00; P0M0 = 0x00; P1M1 = 0x00; P1M0 = 0x00; P2M1 = 0x00; P2M0 = 0x00; P3M1 = 0x00; P3M0 = 0x00; P4M1 = 0x00; P4M0 = 0x00; P5M1 = 0x00; P5M0 = 0x00; P6M1 = 0x00; P6M0 = 0x00; P7M1 = 0x00; P7M0 = 0x00; // ===================== PWM 硬件配置 ===================== PWMA_ENO = 0x00; PWMA_ENO |= ENO1P; // 使能PWM1通道输出 PWMA_CCER1 = 0x00; PWMA_CCMR1 = 0x68; // PWM模式1输出 PWMA_CCER1 = 0x01; // 高电平有效(正常输出) PWMA_PS = 0x00; PWMA_PS |= PWM1_2; // ? 选择通道:P6.0 输出 // ========== 核心修复:配置预分频器(之前缺失!) ========== PWMA_PSCRH = (u8)(PSC_VAL >> 8); PWMA_PSCRL = (u8)PSC_VAL; UpdatePwm(); // 加载400Hz/50%占空比参数 PWMA_BKR = 0x80; // 使能主输出(必备) PWMA_CR1 = 0x81; // 关键:关闭单脉冲模式 → 连续输出PWM EA = 1; // 开总中断(保留框架) while (1) { // 无需任何操作,硬件连续输出400Hz PWM } } //======================================================================== // 函数: UpdatePwm(void) // 功能: 固定配置 400Hz + 50%占空比 //======================================================================== void UpdatePwm(void) { // 固定周期:59999 → 400Hz PWMA_ARRH = (u8)(PERIOD >> 8); PWMA_ARRL = (u8)PERIOD; // 固定占空比:29999 → 50% PWMA_CCR1H = (u8)(DUTY >> 8); PWMA_CCR1L = (u8)DUTY; }