//*****************************************************   
//Copyright (c) 2021, 苏州华芯微电子股份有限公司
//All rights reserved                                 
//
//文件名称: HS16F3211-TP0
//摘    要: HS16F3211-TP0功能演示
//  		PB0输出PWM0X PB1输出PWM01X 带死区互补的PWM 1.95Khz 
//
//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2021.08.31
//*****************************************************   

#include 	<hs16f3211.h> 

//***********************宏定义*****************************
#define  unchar     unsigned char 
#define  unint      unsigned int
#define  unlong     unsigned long

#define  DemoPortOut	FPB0

#define	CLRWDT()	asm("clrwdt")
/*-------------------------------------------------
 *  函数名：GPIO_Init
 *	功能：  GPIO设置
 *  输入：  无
 *  输出：  无
 --------------------------------------------------*/	
void GPIO_Init(void) 
{
	OPTION= 0b00000010; //Bit7 INT1EDG, 外部中断1触发方式 0 INT1引脚下降沿触发
                        //Bit6 INTEDG, 外部中断 触发方式 0 INT引脚下降沿触发
                        //Bit5 T0CS, TMR0时钟源选择位 0 内部指令时钟
                        //Bit4 T0SE, TMR0时钟源边沿选择位 0 T0CKI引脚下降沿触发计数
                        //Bit3 PSA, 预分频分配位 0 预分频器分配给TMR0
                        //Bit2:0 PS[2:0], 预分频配置 010 '8分频
                        
    PORTA = 0b00000000;	
    IOSTA = 0b00000000;	//PA输入输出 0-输出 1-输入
                        //PA口->全输出

    PORTB = 0b00000000;	
    IOSTB = 0b00000000;	//PB输入输出 0-输出 1-输入
                        //PB口->全输出
}


//**************中断处理**********************************
void interrupt ISR(void)			//
{
    //定时器TP0的中断处理**********************
	if(FTP0IF) 
	{
		FTP0IF = 0;
	}
}

/*-------------------------------------------------
 *  函数名：TP0_Init
 *	功能：  TP0设置3路独立PWM模式
 *  输入：  无
 *  输出：  无
 --------------------------------------------------*/	
void TP0_Init(void) 
{
    /*TP0 PWM 模式
    Config配置区域：4Mhz 2'
    */
	// PWM1DH = 0X0f;	//PWM1X占空比高4位   须先修改高位后修改低位
	// PWM1DL = 0X00;	//PWM1X占空比低8位   PB2输出PWM1X 25%占空比
	
	PWM0DTH= 0X00;	//死区寄存器高4位  须先修改高位后修改低位
	PWM0DTL= 0X20;	//死区寄存器低8位  
	
	PWM0DH = 0x08;	//PWM0X占空比高4位   须先修改高位后修改低位
	PWM0DL = 0x00;	//PWM0X占空比低8位   PB0输出PWM0X 50%占空比
	
	PWM0PH = 0X00;	//---- 0000  须先修改高位后修改低位
	PWM0PL = 0x00;	//0000 0000  周期寄存器
	
	PWMPSCON = 0X00;//Bit5:4 PWM1S[1:0] , PWM1X输出端口选择  00 PB2输出PWM1X
					//Bit3:2 PWM01S[1:0], PWM01X输出端口选择 00 PB1输出PWM01X
					//Bit1:0 PWM0S[1:0] , PWM0X 输出端口选择 00 PB0输出PWM0X
	
	PWM0C  = 0xC3;	//Bit7	CK0[3], PWMX0时钟源选择位 1 Fosc
					//Bit6 Bit1:0 CK0[2:0], PWMX0时钟源选择位分频选择位 111 Fosc
					//Bit3:2 PWM0S[1:0], PWM0X和PWM01X输出模式选择位 00 PWM0X和PWM01X均为低有效
	//使能寄存器	
	PWM0EN = 0x07;	//Bit7 TP0EN, TP0定时器总使能 0 失能
					//Bit5 TP0SEL8, 8/12位定时器选择位 0 8位 PWM0_EN使能时无效
					//Bit4 PWM1_OEN, PWM1X输出控制位 0 失能PWM1X输出
					//Bit3 PWM0M, PWMX0工作模式选择位 0 PWM0X&PWM01X工作于互补输出模式
					//Bit2 PWM01_OEN, PWM01X输出控制位 1 使能PWM01X输出
					//Bit1 PWM0_OEN, PWM0X输出控制位 1 使能PWM0X输出
					//Bit0 PWM0_EN, PWMX0模块使能控制位 1 使能PWMX0模块
					
    FTP0IF = 0;	//TP0溢出中断标志位，TP0溢出时被置位，软件清除
    
    FTP0IE = 0; //TP0溢出中断使能位(1=使能,0=失能)	
    
    FTP0EN = 1; //启动TP0定时器
    
    FGIE  = 0;	//关全局中断
}

//****主函数****//
void main(void) 
{
    GPIO_Init();
    TP0_Init();
    while(1)
    {
      	CLRWDT();
    }
}
