C251 COMPILER V5.60.0, main 01/04/26 14:04:27 PAGE 1 C251 COMPILER V5.60.0, COMPILATION OF MODULE main OBJECT MODULE PLACED IN .\Objects\main.obj COMPILER INVOKED BY: C:\Keil_v5\C251\BIN\C251.EXE main.c INTR2 BROWSE DEBUG PRINT(.\Listings\main.lst) TABS(2) OBJECT(.\ -Objects\main.obj) stmt level source 1 #include "stc32g.h" 2 #include "intrins.h" 3 4 #define MAIN_Fosc 24000000L // 主时钟24MHz 5 typedef unsigned char u8; 6 typedef unsigned int u16; 7 typedef unsigned long u32; 8 9 /**************************** 固定参数 400Hz PWM ****************************/ 10 //#define PWM_FREQ 400 // 目标频率 11 //#define PERIOD 59999 // 24MHz下 400Hz 对应周期值 12 //#define DUTY 18000 // 30%占空比 (PERIOD/2) 13 14 /**************************** 正确参数:50Hz / 30%占空比 ****************************/ 15 #define PWM_FREQ 50 16 #define PSC_VAL 239 // 预分频值(核心修复:解决16位溢出) 17 #define PERIOD 1999 // 周期值(16位寄存器最大值65535,合规) 18 #define DUTY 600 // 30%占空比 (1999*0.3=600) 19 20 /**************************** 官方宏定义 保留 ****************************/ 21 #define PWM1_0 0x00 //P:P1.0 N:P1.1 22 #define PWM1_1 0x01 //P:P2.0 N:P2.1 23 #define PWM1_2 0x02 //P:P6.0 N:P6.1 ? 最终输出引脚 24 #define ENO1P 0x01 25 26 /*****************************************************************************/ 27 void UpdatePwm(void); 28 29 /******************** 主函数 **************************/ 30 void main(void) 31 { 32 1 WTST = 0; 33 1 EAXFR = 1; // 扩展寄存器访问使能 34 1 CKCON = 0; 35 1 36 1 // IO口初始化 37 1 P0M1 = 0x00; P0M0 = 0x00; 38 1 P1M1 = 0x00; P1M0 = 0x00; 39 1 P2M1 = 0x00; P2M0 = 0x00; 40 1 P3M1 = 0x00; P3M0 = 0x00; 41 1 P4M1 = 0x00; P4M0 = 0x00; 42 1 P5M1 = 0x00; P5M0 = 0x00; 43 1 P6M1 = 0x00; P6M0 = 0x00; 44 1 P7M1 = 0x00; P7M0 = 0x00; 45 1 46 1 // ===================== PWM 硬件配置 ===================== 47 1 PWMA_ENO = 0x00; 48 1 PWMA_ENO |= ENO1P; // 使能PWM1通道输出 49 1 50 1 PWMA_CCER1 = 0x00; 51 1 PWMA_CCMR1 = 0x68; // PWM模式1输出 52 1 PWMA_CCER1 = 0x01; // 高电平有效(正常输出) 53 1 54 1 PWMA_PS = 0x00; 55 1 PWMA_PS |= PWM1_2; // ? 选择通道:P6.0 输出 56 1 57 1 // ========== 核心修复:配置预分频器(之前缺失!) ========== 58 1 PWMA_PSCRH = (u8)(PSC_VAL >> 8); C251 COMPILER V5.60.0, main 01/04/26 14:04:27 PAGE 2 59 1 PWMA_PSCRL = (u8)PSC_VAL; 60 1 61 1 UpdatePwm(); // 加载400Hz/50%占空比参数 62 1 63 1 PWMA_BKR = 0x80; // 使能主输出(必备) 64 1 PWMA_CR1 = 0x81; // 关键:关闭单脉冲模式 → 连续输出PWM 65 1 66 1 EA = 1; // 开总中断(保留框架) 67 1 68 1 while (1) 69 1 { 70 2 // 无需任何操作,硬件连续输出400Hz PWM 71 2 } 72 1 } 73 74 //======================================================================== 75 // 函数: UpdatePwm(void) 76 // 功能: 固定配置 400Hz + 50%占空比 77 //======================================================================== 78 void UpdatePwm(void) 79 { 80 1 // 固定周期:59999 → 400Hz 81 1 PWMA_ARRH = (u8)(PERIOD >> 8); 82 1 PWMA_ARRL = (u8)PERIOD; 83 1 84 1 // 固定占空比:29999 → 50% 85 1 PWMA_CCR1H = (u8)(DUTY >> 8); 86 1 PWMA_CCR1L = (u8)DUTY; 87 1 } Module Information Static Overlayable ------------------------------------------------ code size = 225 ------ ecode size = ------ ------ data size = ------ ------ idata size = ------ ------ pdata size = ------ ------ xdata size = ------ ------ xdata-const size = ------ ------ edata size = ------ ------ bit size = ------ ------ ebit size = ------ ------ bitaddressable size = ------ ------ ebitaddressable size = ------ ------ far data size = ------ ------ huge data size = ------ ------ const size = 2 ------ hconst size = ------ ------ End of Module Information. C251 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)