#include <STC8H.H>      // STC8H系列头文件 
#include <intrins.h>    // 延时函数支持 
#include	"STC8H_PWM.h"
#define FOSC 24000000UL // 系统时钟24MHz
#define INIT_FREQ 184   // 初始频率184Hz
#define BOOST_FREQ 2208 // 10周期后频率2208Hz (184*12)
#define INIT_DUTY 0.55  // 占空比55%
#define INIT_DEADTIME 50   // 初始死区0.2ms(200us)
#define BOOST_DEADTIME 0x50  // 切换后死区0.21ms(210us)
 
volatile unsigned int cycleCount = 0; // 周期计数器 
 
void PWM_Init(void) {
	unsigned long periodInit;
	unsigned int dutyInit;
	

    // 1. 配置PWM时钟源
    PWMA_PSCRH = 0;     // 预分频器=2 (24MHz时钟)
	  PWMA_PSCRL = 1;     // 预分频器=2 (24MHz时钟)
    PWMA_DTR = INIT_DEADTIME; // 死区时间200us
 
    // 2. 计算初始周期参数 (184Hz)
     periodInit = (FOSC /(PWMA_PSCR+1)/ INIT_FREQ) - 1;
     dutyInit = (unsigned int)(periodInit * INIT_DUTY);
    
    // 3. 配置通道1参数（主输出）
    PWMA_ARRH = (unsigned char)(periodInit >> 8);  // 周期高8位 
    PWMA_ARRL = (unsigned char)periodInit;         // 周期低8位
    PWMA_CCR1H = (unsigned char)(dutyInit >> 8); // 占空比高8位
    PWMA_CCR1L = (unsigned char)dutyInit;        // 占空比低8位 
 
	
	
	//3.输入输出的引脚配置
	PWMA_ENO = 0X00;			
	PWMA_ENO |= 0X01;			//使能PWM1p通道输出
	PWMA_ENO |= 0X02;			//使能PWM1N通道输出
	
	PWMA_PS =0x00;				//选择PWM1从P10引脚输出
	PWMA_PS |= (0<<0);	
	
    // 4. 配置互补输出模式 
		 PWMA_CCER1 = 0x00;  //
    
    PWMA_CCMR1 = 0x68;  // PWM模式1 + 预装载使能
		PWMA_CCER1 = 0x05;  // 开启CH1和CH1N输出 (CC1E=1, CC1NE=1)
    PWMA_BKR = 0x80;    // 主输出使能 (MOEN=1)
 
    // 5. 使能周期中断
    PWMA_IER = 0x01;    // 使能更新中断
//		P_SW2 &= 0x7f;

    EA = 1;             // 开总中断 
    PWMA_CR1 |= 0x01;   // 启动计数器
}
 
// PWM中断服务函数 
void PWM_ISR() interrupt 26 {
	   

    if (PWMA_SR1 & 0x01) {        // 检测更新中断 
        PWMA_SR1 &= ~0x01;        // 清除中断标志 
        cycleCount++;
        
        if (cycleCount == 1000) {  // 10个周期后切换参数 
            // 计算升频后参数 (2208Hz)
            unsigned long periodBoost = (FOSC / BOOST_FREQ) - 1;
            unsigned int dutyBoost = (unsigned int)(periodBoost * INIT_DUTY);
            
            // 更新周期和占空比 
             PWMA_PSCRH = 0;     // 预分频器=1 (24MHz时钟)
	           PWMA_PSCRL = 0;     // 预分频器=1 (24MHz时钟)
					
					  PWMA_ARRH = (unsigned char)(periodBoost >> 8);
            PWMA_ARRL = (unsigned char)periodBoost;
            PWMA_CCR1H = (unsigned char)(dutyBoost >> 8);
            PWMA_CCR1L = (unsigned char)dutyBoost;
            
            // 更新死区时间
            PWMA_DTR = BOOST_DEADTIME;  // 210us死区 
        }
    }
//		 P_SW2 &= 0x7f;

}
 
void main() {
	P_SW2 |= 0x80;
	    P0M1 = 0x00;
    P0M0 = 0xFF;
    P1M1 = 0x00;
    P1M0 = 0xFF;
	
    PWM_Init();
    while(1) {
        // 主循环可添加其他控制逻辑
    }
}