//*****************************************************   
//Copyright (c) 2021, 苏州华芯微电子股份有限公司
//All rights reserved                                 
//
//文件名称: HS16F3211-TC0
//摘    要: HS16F3211-TC0 BUZ 蜂鸣器功能演示
//  		PB2输出4KHz的PWM占空比为50%的波形-TC0实现
//
//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2021.09.01
//*****************************************************   

#include 	<hs16f3211.h> 

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

#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)			//
{
    //定时器TC0的中断处理**********************
	if(FTC0IF) 
	{
		FTC0IF = 0;
	}
}

/*-------------------------------------------------
 *  函数名：TC0_Init
 *	功能：  TC0设置1.024ms中断一次 8位模式 无自动装载
 *  输入：  无
 *  输出：  无
 --------------------------------------------------*/	
void TC0_Init(void) 
{
    /*8bit定时器中断：1.024ms 
    Config配置区域：4Mhz 2'
    */
    PWMCON = 0B00000000;//Bit7:6 PWM2XR1:0, PWM2运算输出 00 PWM2不变
                        //Bit5:4 PWM1XR1:0, PWM1运算输出 00 PWM1不变
                        //Bit3 PWM2S, PWM2端口选择位 0 选择FPB0作为PWM2输出口
                        //Bit2 PWM1S, PWM1端口选择位 0 选择FPB1作为PWM1输出口
                        //Bit1 PWM2EN, PWM2使能位 0 失能PWM2输出
                        //Bit0 PWM1EN, PWM1使能位 0 失能PWM1输出
    
    TC0M = 0B01110010; 	//Bit7 TC0TR, TC0启动控制位 0 禁止TC0定时器
                        //Bit6:4 TC0S[2:0], TC0分频选择位 111 2分频
                        //Bit3 TC0时钟信号选择位, 0 TC0时钟来自Fcpu
                        //BIT2 T16SEL, 8/16位溢出位选择 0 低8位为溢出位
                        //BIT1 BUZ, BUZ输出使能位 1 使能BUZ输出
                        //BIT0 PWM0, PWM0输出使能位 0 失能PWM0输出
    
    TC0L = 0x00;    //TC0初值为0
    
    TC0R = 131;     //控制BUZ的输出脚 4Khz PWM输出
    
    FTC0IF = 0;	//TC0溢出中断标志位，TC0溢出时被置位，软件清除
    
    FTC0IE = 0; //TC0溢出中断使能位(1=使能,0=失能)	
    
    FTC0TR = 1; //启动TC0定时器
    
    FGIE  = 0;	//关全局中断
}

/*-------------------------------------------------
 *  函数名：DelayMs
 *	功能：  软件延时函数
 *  输入：  延时时间 单位 MS 存在一定的误差
 *  输出：  无
 --------------------------------------------------*/	
void DelayMs(unsigned char delayMs)
{
	unsigned char delay_us;
	while(delayMs--)
	{
		delay_us=247;
		while(delay_us--);
        CLRWDT();
	}
}

//****主函数****//
void main(void) 
{
    GPIO_Init();
    TC0_Init();
    while(1)
    {
    	DelayMs(200);//200ms 开关一次蜂鸣器
    	FBUZ=1;
    	DelayMs(200);
      	FBUZ=0;
    }
}
