/****************************************************************************************
 * KF8A系列单片机	KF8A100GQT_DEMO	开发板演示程序
 * 标    题: 无符号16bit硬件乘法器实验
 * 项目名: 13- MUL_Test
 * 开发环境：ChipON IDE
 * 版          本     ：V1.0 (2019/07/23)
 * 作 者: 上海芯旺微电子有限公司
 * 功能简述:	PC端输入两个16位数,以0x0D,0x0A结尾，进行硬件乘法运算，并发送回PC端，从串口助手显示
 * 硬件说明：
 * 跳线接法： 单片机供电选择为3.3V或5V
 ****************************************************************************************/
#include<KF8A100GQT.h>
#include "includes.h"

unsigned char Rev_Flag,Rev_StopFlag;
unsigned char Rev_count;

void delay_ms(uint16 num)
{
	uint16 i,j;
	for(i=0;i<num;i++)
	{
		j=1000;
		while(j--);
	}
}

void SYS_Init(void)
{
	//使用外部晶振时，引脚配置输入，配置字选择外部时钟且允许切换
	SCLKCTL = SYSYCLK_SEL_SCKS|SYSCLK_SCLK_SEL_INTHF|SYSCLK_FREQ_DIV1;	//INTHF作为主时钟
	_NOP();_NOP();	//高速时钟稳定
	PLLEN=0;
	PLLCTL = PLL_SEL_DIV1|PLL_SEL_INTHF|PLLBIAS_CUR_MIN|PLLPMUL_2;
	PLLEN=1;
	delay_ms(200);
	SCLKCTL|=SYSYCLK_SEL_SCKS|SYSCLK_SCLK_SEL_UPCK;		//UPCK作为主时钟	32M
	SCLKOE = 0;		//机器周期禁能输出,输出波形与IO翻转速率相关
	CLKOUTSEL = 0;
	HFCKCTL = 0xCE;	//外设时钟开启,选择INTHF为HFCLK时钟信号

	TR0 = 0;	TR1	= 0;	TR2	= 0;	TR3 = 0;
	TR4 = 0;	TR5 = 0;	TR6 = 0;	TR7 = 0;
	TR9 = 0;	TRA = 0;	TRB = 0;
	P0LR = 0;	P1LR = 0;	P2LR = 0;	P3LR = 0;
	P4LR = 0;	P5LR = 0;	P6LR = 0;	P7LR = 0;
	P9LR = 0;	PALR = 0;	PBLR = 0;
}

//主函数
void main()
{
	SYS_Init();
	UART2_Init();

	AIE=1;			//开启中断
	PUIE=1;
	while(1)
	{
		if(Rev_Flag == 1)
		{
			Rev_Flag=0;
			if(Rev_count == 6)
			{
				LED_R=0;
				MULAH = UART2_BUF[0];	//转载数据
				MULAL = UART2_BUF[1];
				MULBH = UART2_BUF[2];
				MULBL = UART2_BUF[3];
				MULEN=1;				//开始运算
				while(!	MULIF);			//等待运算
//				MULEN=0;				//关闭运算
				UART2_SendBuf(MULRES3);
				UART2_SendBuf(MULRES2);
				UART2_SendBuf(MULRES1);
				UART2_SendBuf(MULRES0);
			}
			Rev_count=0;
		}
	}
}
//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{
	if(RC2IF)
	{
		LED_R=1;
		UART2_BUF[Rev_count]=RXSDR2;  	//清零 RXIF
		if(UART2_BUF[Rev_count] == 0x0D)
		{
			Rev_StopFlag=1;
		}
		else
		{
			if(Rev_StopFlag)
			{
				if(UART2_BUF[Rev_count] == 0x0A)
					Rev_Flag=1;
				else Rev_StopFlag=0;
			}
			else
			{
				Rev_StopFlag=0;
			}
		}
		Rev_count++;
	}
}


//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{

}
