//*****************************************************   
//Copyright (c) 2022, 苏州华芯微电子股份有限公司
//All rights reserved                                 
//文件名称: main.c
//摘    要: 使用T2定时器配置 互补输出3路PWM ;
//			频率3.9K T2PWM0与T2PWM1互补 T2PWM2与T2PWM3互补 T2PWM4与T2PWM5互补 
//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2022.02.10
//*****************************************************  
#include 	<hs16f3612.h>  	
#include 	<main.h>		
//*********************************************************************** 
unsigned char BSREG_Buf;	//System Use
/*-------------------------------------------------
 *  函数名称：Interrupt
 *  功能：   中断处理函数
 *  输入参数：无
 * 	返回参数：无 
 -------------------------------------------------*/
void interrupt myIsr(void)    
{
//BSREG_SAVE
	BSREG_Buf = BSREG;

//--------------------------------------------	
	GOTO_BANK0;
	
	
	//----------------------------------------------------
	//FTC1IF=0;//清TC1的中断标志
	//INTFLAG=0B00000000;	
	
	GOTO_BANK0	//中断特别注意bank切换保护
	if(FT2IF)
	{
		FT2IF = 0; //清TC1的中断标志
		PORTB = PORTB^0x01;
			
	}
	
	
//-----------------------------------------------	
//BANK_RECOVER
	BSREG = BSREG_Buf;
}

/*-------------------------------------------------
 *  函数名称：SLEEP_SET
 *  功能：    进入睡眠模式
 *  输入参数：无
 * 	返回参数：无 
 -------------------------------------------------*/
void SLEEP_SET(void)
{
    SLEEP();          //进入睡眠
}

/*-------------------------------------------------
 *  函数名称：T2_INIT
 *  功能：    T2定时器初始化，配置为12位 互补带死区输出 模式
 			  PWM周期为 Fosc=16M; PWM分频选择为 不分频；
			  所以计数一次为 1/16us; 定时器为12位,所以PWM周期为  (1/16)*装载值=(1/16)*4096=256US
			  即PWM输出频率为： 1/256us≈3.9kHZ
			  ！！！ 注意要想输出PWM，设置的输出的占空比必须大于周期才能输出
 *  输入参数：无
 * 	返回参数：无 
 -------------------------------------------------*/
void T2_INIT(void)
{

	T2PWM0PH=0X00;		//
	T2PWM0PL=0X00;		//PWM3的周期为(0XFFF-(T2PWM0PH:T2PWM0PL))*时钟周期	

	T2PWM0DH=0X08;	    //
	T2PWM0DL=0X00;		//T2PWM0占空比 50%
	
	
	T2PWM1DL=0X30;		//互补模式下配置死区
	
	
	T2PWM2DH=0X04;	    //
	T2PWM2DL=0X00;		//T2PWM2占空比 25% 	
	
	
	T2PWM3DL=0X30;		//互补模式下配置死区
	
	T2PWM4DH=0X02;	    //
	T2PWM4DL=0X01;		//T2PWM4占空比	12.5%	
	
	
	T2PWM5DL=0X30;		//互补模式下配置死区
	
	
	//T2PWM0TH=0x00;		//改变定时器值，改变中断时间 12位模式可用
	//T2PWM0TL=0x00;		//改变定时器值，改变中断时间
	
	//pb1 pb2 pb4
	T2PWMPSC=0X00;	//T2PWM 输出端口选择寄存器
					//Bit7 空
					//Bit6 空
					//Bit5 0-PC0输出T2PWM0 1-PB1输出T2PWM0
					//Bit4 0-PA5输出T2PWM0 1-PB2输出T2PWM0
					//Bit3 0-PA4输出T2PWM0 1-PB3输出T2PWM0
					//Bit2 0-PA3输出T2PWM0 1-PB4输出T2PWM0
					//Bit1 0-PA2输出T2PWM0 1-PB5输出T2PWM0
					//Bit0 0-PA1输出T2PWM0 1-PB6输出T2PWM0
	
	T2PWM0C1=0b00000000;
					//Bit7 空
					//Bit6 空
					//Bit5 T2PWM5E T2PWM5输出有效电平控制位  0-高有效 1-低有效
					//Bit4 T2PWM4E T2PWM4输出有效电平控制位  0-高有效 1-低有效
					//Bit3 T2PWM3E T2PWM3输出有效电平控制位  0-高有效 1-低有效
					//Bit2 T2PWM2E T2PWM2输出有效电平控制位  0-高有效 1-低有效
					//Bit1 T2PWM1E T2PWM1输出有效电平控制位  0-高有效 1-低有效
					//Bit0 T2PWM1E T2PWM0输出有效电平控制位  0-高有效 1-低有效
	
	T2PWM0C=0b11000011;
					//Bit7 T3CK3<3>T3定时器时钟选择   1-时钟选择FOSC        0-时钟选择FCPU 	
					//Bit6 T3CK3<2:0>  000-FCPU/256	
					//Bit5 空
					//Bit4 空	
					//Bit3 空
					//Bit1 T3CK1   T3分频选择
					//Bit0 T3CK0   T3分频选择
	
	T2PWM0EN1=0b00111111;
					//Bit7 空
					//Bit6 空
					//Bit5 T2PWM5E T2PWM5输出控制位  0-禁止 1-允许
					//Bit4 T2PWM4E T2PWM4输出控制位  0-禁止 1-允许
					//Bit3 T2PWM3E T2PWM3输出控制位  0-禁止 1-允许
					//Bit2 T2PWM2E T2PWM2输出控制位  0-禁止 1-允许
					//Bit1 T2PWM1E T2PWM1输出控制位  0-禁止 1-允许
					//Bit0 T2PWM1E T2PWM0输出控制位  0-禁止 1-允许
	
	T2PWM0EN=0b10100001;
					//Bit7 T2REN T2定时器总使能	
					//Bit6 空  
					//Bit5 T2SEL8 8/12定时器选择位   1-配置为12位 0-配置为8位    
					//Bit4 空	
					//Bit3 PWM3M 	第三组T2PWM工作模式选择位 	
								//0-T2PWM4&T2PWM5工作于互补输出模式
								//1-T2PWM5&T2PWM5工作于独立输出模式
					//Bit2 PWM3M 	第二组T2PWM工作模式选择位 	
								//0-T2PWM2&T2PWM3工作于互补输出模式
								//1-T2PWM2&T2PWM3工作于独立输出模式
					//Bit1 PWM3M 	第一组T2PWM工作模式选择位 	
								//0-T2PWM0&T2PWM1工作于互补输出模式
								//1-T2PWM0&T2PWM1工作于独立输出模式
					//Bit0 T2PWMEN      T2定时器PWM输出总使能	1-使能 0-失能
}

/*-------------------------------------------------
 *  函数名称：main
 *  功能：   main函数
 *  输入参数：无
 * 	返回参数：无 
 -------------------------------------------------*/
//****main function****//
void main(void) 
{
	GPIO_Init();  //IO初始化
	System_Init();//系统初始化
	T2_INIT();//T3定时器初始化
	
	while(1) 
	{
		CLRWDT(); //清看门狗
	}
} 
/*-------------------------------------------------
 *  函数名称：IO_Init
 *  功能：   io 初始化函数
 *  输入参数：无
 * 	返回参数：无
 -------------------------------------------------*/
void GPIO_Init(void) 
{
	PORTA = 0b00000000;	    //PA输出赋值
	TRISA = 0b00000000;	    //PA输入输出配置 :0-输出  ;1=输入  
	PAODCON = 0b00000000;	//PA漏极开路配置 :1-使能  ;0-禁止 
	PAHCON = 0b11111111;	//PA内部上拉配置 :1-禁止  ;0-使能 
	PADCON = 0b11111111;	//PA内部下拉配置 :1-禁止  ;0-使能 
	WUACON = 0b00000000;	//PA端口唤醒配置 :1-使能  ;0-禁止 
	PAIC0 = 0b00000000;	    //启动加强驱动   :1-加强驱动;0-默认驱动 
	PORTA = 0b00000000;	    //PA输出赋值
//----------------------------------------------------------------------
	PORTB = 0b00000000;	    //PB输出赋值
	TRISB = 0b00000110;	    //PA输入输出配置 :0-输出  ;1=输入 	
	PBODCON = 0b00000000;	//PA漏极开路配置 :1-使能  ;0-禁止 
	PBHCON = 0b11111111;	//PA内部上拉配置 :1-禁止  ;0-使能 	
	PBDCON = 0b11111111;	//PA内部下拉配置 :1-禁止  ;0-使能 
	WUBCON = 0b00000000;	//PA端口唤醒配置 :1-使能  ;0-禁止 
	PBIC0 = 0b00000000;	    //启动加强       :1-加强驱动;0-默认驱动 
	PORTB = 0b00000000;	    //PA输出赋值
//----------------------------------------------------------------------
	PORTC = 0b00000000;	    //PA输出赋值
	TRISC = 0b00000000;	    //PA输入输出配置 :0-输出  ;1=输入 
	PCDCON = 0b11111111;	//PA内部下拉配置 :1-禁止  ;0-使能 
	PCHCON = 0b11111111;	//PA内部上拉配置 :1-禁止  ;0-使能 	
} 

/*-------------------------------------------------
 *  函数名称：System_Init
 *  功能：   中断初始化配置
 *  输入参数：无
 * 	返回参数：无 
 -------------------------------------------------*/
void System_Init(void)
{
	OPTION = 0b00000010;
						//Bit7 INT1EDG, 外部中断1触发方式  1-上升沿触发中断1  0-下降沿触发中断1
                        //Bit6 INTEDG, 外部中断 触发方式   1-上升沿触发中断1  0-下降沿触发中断1
                        //Bit5 T0CS, TMR0时钟源选择位      1-PB2作为TIME0的外部时钟输入脚     0-选择内部指令时钟
                        //Bit4 T0SE, TMR0时钟源边沿选择位  1-T0CKI引脚上升沿触发计数     0-T0CKI引脚下降沿触发计数
                        //Bit1 PSA, 预分频分配位           1-预分频器分配给WDT      0-预分频器分配给TMR0
                        //Bit2:0 PS[2:0], 预分频配置 010 '8分频
	PCON  = 0b10110000;	
	                  //Bit7 WDTE,看门狗定时器控制  1-使能WDT   0-禁止WDT
					  //Bit6 EIS,PB0管脚复用控制位  1-使能为外部中断输入脚  0-屏蔽中断功能	
					  //Bit5 LVDTE,LVDT低压复位使能,电压点由配置字决定  	
	                  //Bit4 SMTS,施密特使能位 1-施密特有效，0-施密特禁止
					  //Bit3 空	
					  //Bit2 空
					  //Bit1 空
					  //Bit0 空				
	INTEN = 0B10000000;	//使能TC1定时器
					  //Bit7 GIE 使能全局中断     1-使能 0-禁止	
					  //Bit6 T3IE 使能T3溢出中断  1-使能 0-禁止
					  //Bit5 INT1IE 使能外部中断1 1-使能 0-禁止
					  //Bit4 T2IE 使能T2溢出中断  1-使能 0-禁止
					  //Bit3 TC1IE 使能T1溢出中断 1-使能 0-禁止
					  //Bit2 INTIE 使能外部中断0  1-使能 0-禁止
					  //Bit1 PBIE 使能端口变化中断1-使能 0-禁止 
					  //Bit0 T0IE TIME0溢出中断   1-使能 0-禁止
	INTFLAG=0B00000000;	
					  //Bit7 空	
					  //Bit6 T3IF T3溢出中断标志位
					  //Bit5 INT1IF 外部中断1标志位
					  //Bit4 T2IF T2溢出中断标志位	
					  //Bit3 TC1IF TC1溢出中断标志位		
					  //Bit2 INTIF 外部中断0标志位		
					  //Bit1 PBIF PA/PB输入状态变化中断标志位	
					  //Bit0 T0IF TIME0溢出中断标志位		
	INTEN1 = 0B00000000;	
			          //Bit7 空	
					  //Bit6 空
					  //Bit5 空
					  //Bit4 空	
					  //Bit3 空	
					  //Bit2 ADCIE ADC中断使能位 1-使能 0-禁止
					  //Bit1 空
					  //Bit0 TKIE 触摸中断使能位 1-使能 0-禁止		
	INTFLAG1=0B00000000;	
					  //Bit7 空	
					  //Bit6 空
					  //Bit5 空
					  //Bit4 空	
					  //Bit3 空	
					  //Bit2 ADCIF ADC中断标志位
					  //Bit1 空
					  //Bit0 TKIF 触摸中断标志位	
}

/*-------------------------------------------------
 *  函数名称：DelayMs
 *  功能：   短延时函数 --8M-4T
 *  输入参数：x 延时时间长度 延时只是粗略计算;延时X毫秒；
 * 	返回参数：无 
 -------------------------------------------------*/
//;Fcpu=8MHz/4T;   
void DelayMs(unsigned char x)     
{
	unsigned int i,j;
	for(i=0;i<x;i++)
	for(j=0;j<141;j++)
	{
		CLRWDT();
	}
} 







