#include    "SYSCFG.h";
/*-------------------------------------------------
 * 函数名:POWER_INITIAL
 * 功能:  上电系统初始化
 * 输入:  无
 * 输出:  无
 --------------------------------------------------*/
 void POWER_INITIAL(void)
 {
    OSCCON=0B01110001;			//系统时钟选择为内部振荡器16MHz,分频比为1:1
    
    INTCON=0;					//禁止所有中断
    
    PORTA=0B00000000;
    PORTB=0B00000000;
    PORTC=0B00000000;
    
    WPUA=0B00000000;			//弱上拉的开关,0-关,1-开		
    WPUB=0B00000000;
    WPUC=0B00000000;	

    WPDA=0B00000000;			//弱下拉的开关,0-关,1-开
    WPDB=0B00000000;
    WPDC=0B00000000;
    
    TRISA=0B00000000;			//输入输出设置,0-输出,1-输入,TIM1_CH1,PA0-输出
    TRISB=0B00000000;				
    TRISC=0B00000000;			//TIM1_CH1N,PC0-输出

    PSRC0=0B11111111;			//源电流设置最大
    PSRC1=0B11111111;
    PSRC2=0B00001111;

    PSINK0=0B11111111;			//灌电流设置最大
    PSINK1=0B11111111;
    PSINK2=0B00000011;

    ANSELA=0B00000000;			//设置对应的IO为数字IO	
 }
 /*-------------------------------------------------
 * 函数名:TIM1_INITIAL
 * 功能:  初始化TIM1
 * 输入:  无
 * 输出:  无
 --------------------------------------------------*/
 void TIM1_INITIAL(void)
 {
    PCKEN|=0B00000010;            //使能TIMER1模块时钟
    CKOCON=0B00100000;            //Timer1倍频时钟占空比调节位4ns延迟
    TCKSRC=0B00000001;            //Timer1时钟源为HIRC
    
    TIM1CR1=0B10000101;            //允许自动装载,使能计数器
    TIM1CR2=0B00000000;
    
    TIM1SMCR=0B00000000;
    TIM1ETR=0B00000000;
    TIM1IER=0B00000000;            //禁止所有中断
    
    TIM1SR1=0B00000000;
    TIM1SR2=0B00000000;
    
    TIM1EGR=0B00000000;
    
    TIM1CCMR1=0B01101000;        //将通道1配置为输出,PWM模式1,开启TIM1CCR1H/L预装载功能
    TIM1CCMR2=0B00000000;
    TIM1CCMR3=0B00000000;
    TIM1CCMR4=0B00000000;
    
    TIM1CCER1=0B00001111;
    TIM1CCER2=0B00000000;
    
    TIM1CNTRH=0B00000000;
    TIM1CNTRL=0B00000000;
    
    TIM1ARRH=0x0A;                //自动装载高8位03H
    TIM1ARRL=0x6A;                //自动装载低8位e8H
    
    TIM1PSCRH=0B00000000;        //分频
    TIM1PSCRL=0B00000001;
    
    TIM1RCR=0B00001111;            //Bit[7:0]:重复计数器的值T1REP[7:0],(T1REP+1)对应着PWM周期的数目(边沿对齐模式下)
    
    TIM1CCR1H=0X03;                //PWM脉宽
    TIM1CCR1L=0X1F;        
    
    AFP0 = 0B00000100;
    
    TIM1BKR=0B11000000;            //使能输出和互补输出,禁止刹车输入
    
    TIM1DTR=0B00000111;            //死区发生器设置,定义插入互补输出之间的死区持续时间为218.75ns
    
    TIM1OISR=0B00000000;        //空闲状态输出设置
    
    LEBCON=0B00000000;            //禁止前沿消隐
 }
 
 /*
    PWM调节
    周期:frequency
    占空比:duty
 */
 void CHANGE_PWM(unsigned int frequency, unsigned char duty) {
    // 系统时钟16MHz / 预分频(2) = 8MHz
    const unsigned long base_clock = 8000000; // 8MHz
    
    unsigned int arr = (base_clock / frequency) - 1;
    
    if (arr > 0xFFFF) arr = 0xFFFF;
    if (arr < 0x01) arr = 0x01;

    // 设置自动重装载寄存器
    TIM1ARRH = arr >> 8;
    TIM1ARRL = arr & 0xFF;

    // 计算占空比
    unsigned int ccr = (unsigned long)(arr + 1) * duty / 100;

    // 设置比较寄存器
    TIM1CCR1H = ccr >> 8;
    TIM1CCR1L = ccr & 0xFF;
}
/*-------------------------------------------------
 * 函数名:main
 * 功能:  主函数 
 * 输入:  无
 * 输出:  无
 --------------------------------------------------*/
void main(void)
{
    POWER_INITIAL();            //系统初始化
    TIM1_INITIAL();
    //CHANGE_PWM(2000, 50);		// 频率调节
    while(1)
    {
        NOP();
    }
}