//*****************************************************   
//Copyright (c) 2022, 苏州华芯微电子股份有限公司
//All rights reserved                                 
//文件名称: main.c
//摘    要: UART0中断方式收发数据实验: 接收到串口数据时会触发接收中断；发送串口数据时会触发发送中断;
//		    1、串口接收到数据时触发RX接收中断，则PA0电平反转一次。
//          2、在主函数中每200MS发送一次串口数据0XAA。 在发送串口数据时触发串口发送中断，PA1电平反转一次。 
//			注：串口数据格式为 96-N-8-1格式    9600波特率，无校验，8位数据位，一位停止位
//				管脚映射: TX=PB3;   RX=PB4;
//              RX管脚要配置为输入状态
//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2022.02.23
//*****************************************************  
#include 	<hs16f3612.h>  	
#include 	<main.h>		
//*********************************************************************** 
unsigned char BSREG_Buf;	//System Use
unsigned char TX_Data = 0;  //临时变量
/*-------------------------------------------------
 *  函数名称：Interrupt
 *  功能：   中断处理函数
 *  输入参数：无
 * 	返回参数：无 
 -------------------------------------------------*/
void interrupt myIsr(void)    
{
//BSREG_SAVE
	BSREG_Buf = BSREG;

//--------------------------------------------	
	GOTO_BANK0;
	
	
	//----------------------------------------------------
	if(IFRX==1) //判断是否触发串口接收中断
	{
		IFRX = 0;//清接收中断标识
		TX_Data = RXREG;//把接收到的数据给TX_Data;
		if(TX_Data==0x55)//判断接收到的数据是否是0X55
		{
			PORTA = PORTA^0x01;  //接收到的数据是0X55，PA0管脚电平反转一次；
		}
	}
	if(IFTX==1)//判断是否触发串口发送中断
	{
		IFTX = 0;//清发送数据中断标识
		PORTA = PORTA^0x02;	//PA1管脚电平反转一次；
	}
	//----------------------------------------------------
//-----------------------------------------------	
//BANK_RECOVER
	BSREG = BSREG_Buf;
} 

/*-------------------------------------------------
 *  函数名称：UART0_Init
 *  功能：   初始化UART0，配置为96-N-8-1格式：9600波特率，无校验，8位数据位，一位停止位
 *  9600波特率计算：		
 			 1.当波特率发生器选择是16位 即BRG16=0，BRGH=0时， FOSC=8M=8000000  求9600波特率时，SPBRG和SPBRGH的值?
 *             波特率计算：  X=[FOSC/(目标波特率*16)-1];
 *             即X=[8000000/(9600*16)-1]   //得 X= 51
 *             所以 X=SPBRG=51; SPBRGH = 0;
 *  19200波特率计算：
 *           2.求19200波特率时，SPBRG和SPBRGH的值?
 *             波特率计算：  X=[FOSC/(目标波特率*16)-1];
 *             即X=[8000000/(19200*16)-1]   //得 X= 25
 *             所以 X=SPBRG=25; SPBRGH = 0;        
 *  输入参数： 无
 * 	返回参数： 无             
 -------------------------------------------------*/
void UART0_Init(void)
{
	PFACES = 0b00001010;//UART端口选择;  TX=PB3;RX=PB4;
					//Bit7 空	
					//Bit6 空
					//Bit5 PFS5:PA2作为RX1发送脚    1-使能  0-禁止
					//Bit4 PFS4:PA3作为TX1发送脚    1-使能  0-禁止	
					//Bit3 PFS3:PB4作为RX接收脚     1-使能  0-禁止	
					//Bit2 PFS2:PB2作为RX接收脚     1-使能  0-禁止
					//Bit1 PFS1:PB3作为TX发送脚     1-使能  0-禁止
					//Bit0 PFS0:PB1作为TX发送脚     1-使能  0-禁止	
	//波特率9600[8MHz 4']     SPBRG = 51;   SPBRGH = 0x00;
	SPBRG = 51;
	SPBRGH = 0x00;	//
	FTXEN = 1;		//串口发送使能位		
	RCSTA = 0b10010000;//0x90;	//接收状态和控制寄存器
					//Bit7 SPEN:串口使能位	1-使能串行口(将RXD和TXD配置为串行口)  0-禁止串行口(保持为复位状态)
					//Bit6 TX9：9位接收使能位    1-选择9位接收    0-选择8位接收
					//Bit5 SREN:单字节接收使能位  (异步模式无关位)
					//Bit4 CREN:连续接收使能位   1-使能    0-禁止	
					//Bit3 ADDEN:地址检测位      1-使能地址检测       0-禁止地址检测  	
					//Bit2 FERR:帧错误位         1-帧错误     0-无帧错误 
					//Bit1 OERR:溢出错误位       1-溢出错误   0-无溢出错误 
					//Bit0 RX9D:接收数据的第9位，改位可以是地址/数据或者奇偶校验位，并且必须由用户固件计算得到

	TXSTA = 0x20;	//发送状态和控制控制寄存器
					//Bit7 CSRC 时钟源选择  1-主模式    0-从模式 (异步通信时1/0都可以)	
					//Bit6 TX9：9位发送使能位       1-选择9位发送  0-选择8位发送
					//Bit5 TXEN:发送使能            1-使能  0-禁止	
					//Bit4 SYNC:异步选择位          1-无效  0-异步	
					//Bit3 空
					//Bit2 BRGH:高波特率选择位      1-高速   0-低速 
					//Bit1 TRMT:发送移位寄存器状态位   1-TSR空  0-TSR满
					//Bit0 TX9D:发送数据的第9位	  可以是地址/数据位或者奇偶校验位
					
	BAUDCTL = 0x30;//UART中断寄存器	//开启接收串口中断，发送串口中断	   
					  //Bit7 空	
					  //Bit6 SCKP:同步时钟极性选择    1-上升沿同步  0-下降沿同步
					  //Bit5 RXIE:RX中断使能    1-有效   0-无效
					  //Bit4 TXIE:TX中断使能     1-有效  0-无效	
					  //Bit3 BRG16:16位波特率选择 1-8位   0-16位
					  //Bit2 空
					  //Bit1 IFRX:TX中断标识  1-有效     0-无效
					  //Bit0 IFTX:TX中断标识  1-有效     0-无效		
	TRISB4 = 1;	//(0-OUT;1-IN)//RX管脚配置为输入状态
	RXREG = 0x00;//串口接收的数据寄存器
	TXREG = 0x00;//串口要发送的数据寄存器
	FGIE  = 1;   //使能总中断
}

/*-------------------------------------------------
 *  函数名称：main
 *  功能：   main函数
 *  输入参数：无
 * 	返回参数：无 
 -------------------------------------------------*/
//****main function****//
void main(void) 
{
	System_Init();//系统初始化
	GPIO_Init();  //IO初始化
	UART0_Init();
	while(1) 
	{ 
		CLRWDT(); //清看门狗
		TXREG = 0XAA;//发送串口数据,直接对TXREG进行赋值，赋值后串口自动发送数据
		while(!TRMT);        //等待数据发送完成	
		DelayMs(200);//延时200MS	
	} 
} 
/*-------------------------------------------------
 *  函数名称：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 = 0b00010110;	    //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触发方式 0 INT1引脚下降沿触发
                        //Bit6 INTEDG, 外部中断 触发方式 0 INT引脚下降沿触发
                        //Bit5 T0CS, TMR0时钟源选择位 0 内部指令时钟
                        //Bit4 T0SE, TMR0时钟源边沿选择位 0 T0CKI引脚下降沿触发计数
                        //Bit1 PSA, 预分频分配位 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 = 0B00000000;	
					  //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();
	}
} 







