/******************************************************************************
; * @File Name : mc32F7343_main.c
; * @Copyright : 2018 SINOMCU Corporation,All Rights Reserved.
; * @Module Name : Standard Demo
; * @MCU : MC32F7343
; * @Create Date : 2018.06.30
; * @Author/Corporation : Martin/SinoMCU
; * @Abstract Description:
; *
; *---------------------------Revision History---------------------------------
; * No Version Date Revised By Item Description
; * 1 V1.0 2018.06.30 Timer,ADC,UART,ADC_offset,EEPROM,IIC
P16 1ms翻转 5s进入休眠 P17唤醒
******************************************************************************/
#include "User_Def.h"
#define IIC_Addr_Define 0x50
#define I2C_Write_CMD 0
#define I2C_Read_CMD 1
uchar IIC_Test_buff[10];
u8 UART_Buff;
u8 UART_Test;
u16 ADH_temp=0,ADL_temp=0,Data_OSADJCR=0;
u16 ADC_CH0_Value;
u8 EEPROM_Num;
u8 Timer0_Num1;
u16 Timer0_Num2;
u16 Temp_ADC_Value;
u16 Temp_EE;
/************************************************
; * @Function Name : main
; * @Description : main function
; * @IN_Parameter :
; * @Return parameter :
; ***********************************************/
void main(void)
{
InitSys();
EEPROM_Num=0x55;
EEPROM_Write_Byte(0x01,EEPROM_Num);
EEPROM_Num=0;
EEPROM_Num=EEPROM_Read_Byte(0x01);
KBCR7=1; //P17键盘中断
while(1)
{
if(Fre_Mode_Flag)
{
Fre_Mode_Flag=0;
SendString("Sinomcu_Test_code\r\n");
}
if(Sleep_Flag)
{
Sleep_Flag=0;
ADEN=0; //关闭ADC
ADIOS0=0;
ADIOS1=0; //切换为数字口
P16D=0;
//休眠关闭外设
GIE = 0;
KBIF=0;
KBIE = 1;
Nop();
Nop();
Stop();
Nop();
Nop();
KBIE = 0;
KBIF = 0;
GIE = 1;
//唤醒还原外设
IO_ADC_Config(0); //切换模拟口
ADEN=1;
}
}
}
/************************************************
; * @Function Name : C_RAM
; * @Description : 清RAM
; * @IN_Parameter :
; * @Return parameter :
; ***********************************************/
void C_RAM(void)
{
for(FSR0=0;FSR0<0xff;FSR0++)
{
INDF0=0;
}
FSR0=0xFF;
INDF0=0;
for(FSR1=0;FSR1<0x7f;FSR1++)
{
INDF1=0;
}
FSR1=0x7f;
INDF1=0;
}
/************************************************
; * @Function Name : ADC_Init_ADJ
; * @Description : 每次上电时候调用此函数,可解决AD零点漂移问题
; * @IN_Parameter :
; * @Return parameter :
; ***********************************************/
void ADC_Init_ADJ(void)
{
ADCR0=0xe0;//2V参考电压 通道GND
OSADJEN=1;//使能 ADC 零点偏移修调模式
ADCR1=0x33;//FHIRC/64,15个ADCLK
OSADJCR&=0xc0;//修调值从零开始
ADEN=1;
ADEOC=0;
while(!ADEOC);
ADH_temp=ADRH;
ADL_temp=ADRL;
if((ADH_temp==0)&&(ADL_temp==0))
{
OSADJCR|=0x3f;
Data_OSADJCR=OSADJCR&0x1f;
while(1)
{
if(Data_OSADJCR==0x00) return;
else
{
ADEOC=0;
while(!ADEOC);
ADH_temp=ADRH;
ADL_temp=ADRL;
if((ADH_temp==0)&&(ADL_temp==0)) return;
else;
}
OSADJCR--;
Data_OSADJCR=OSADJCR&0x1f;
}
}
else
{
Data_OSADJCR=OSADJCR&0x1f;
while(1)
{
if(Data_OSADJCR==0x1f) return;
else
{
ADEOC=0;
while(!ADEOC);
ADH_temp=ADRH;
ADL_temp=ADRL;
if((ADH_temp==0)&&(ADL_temp==0)) return;
else;
}
OSADJCR++;
Data_OSADJCR=OSADJCR&0x1f;
}
}
}
/************************************************
; * @Function Name : ADC_Repeat_ADJ
; * @Description : ADC 校准后 重复几次
; * @IN_Parameter :
; * @Return parameter :
; ***********************************************/
void ADC_Repeat_ADJ(void)
{
u8 i,j,R_Zero,R_Zero_max;
R_Zero_max=0;
R_Zero=0;
Data_OSADJCR=OSADJCR&0x3f;
OSADJCR--;
for(j=0;j<3;j++)
{
for(i=0;i<6;i++)
{
ADEOC=0;
while(!ADEOC);
ADH_temp=ADRH;
ADL_temp=ADRL;
i++;
if((ADH_temp==0)&&(ADL_temp==0))
{
R_Zero++;
}
}
if(R_Zero>R_Zero_max)
{
R_Zero_max=R_Zero;
Data_OSADJCR=OSADJCR&0x3f;
}
OSADJCR++;
R_Zero=0;
}
OSADJCR=Data_OSADJCR&0x3f;
}
/************************************************
; * @Function Name : IO_Config
; * @Description : 普通IO配置
; * @IN_Parameter :
; * @Return parameter :
; ***********************************************/
void IO_Config(void)
{
IOP0=0;
IOP1=0;
IOP2=0;
OEP0=0xff; //P0 out
OEP1=0x7f; //P17 in
OEP2=0xfD; //P21 in
ADIOS0=0;
ADIOS1=0;
PUP0=0;
PUP1=0x80; //P17 up
PUP2=0;
PDP0=0;
PDP1=0;
PDP2=0;
}
/************************************************
; * @Function Name : IO_ADC_Config
; * @Description : ADC IO配置
; * @IN_Parameter : CHX ADC IO通道
; * @Return parameter :
; ***********************************************/
void IO_ADC_Config(u8 CHX)
{
uchar CHX_Temp=0;
CHX_Temp=CHX;
if(CHX<8)
{
ADIOS0=1<<CHX_Temp;
}else
{
CHX_Temp=CHX_Temp-8;
ADIOS1=1<<CHX_Temp;
}
}
/************************************************
; * @Function Name : ADC_Config
; * @Description : ADC配置
; * @IN_Parameter :
ADC_CLK ADC转换时钟选择位
ADC_Ampling_Time ADC采样时间选择位
ADC_VRS ADC参考电压选择位 00 内部2v 11 VDD
; * @Return parameter :
; ***********************************************/
void ADC_Config(u8 ADC_CLK,u8 ADC_Ampling_Time,u8 ADC_VRS)
{
ADCR1&=0xCC;
ADCR1|=ADC_CLK<<4;
ADCR1|=ADC_Ampling_Time;
ADCR0&=0xF3;
ADCR0|=ADC_VRS<<2;
ADRSEL=1; //高4位存入ADRH[3:0]、低8位存入ADRL[7:0]
OSADJCR=0x00;//关闭修调
ADEN=1; //使能ADC
//ADIE=1;
}
/************************************************
; * @Function Name : Get_ADC_Value
; * @Description : 获得ADC值 启动一次转换 查询方式
; * @IN_Parameter : 通道
; * @Return parameter : 返回ADC的值
; ***********************************************/
u16 Get_ADC_Value(u16 CHX)
{
ADCR0&=0x0F;
ADCR0|=CHX<<4;
ADEOC=0; //使能转换
while(!ADEOC); //等待转换完成
Temp_ADC_Value=(ADRH<<8)+ADRL;
return Temp_ADC_Value;
}
/************************************************
; * @Function Name : ADC_Get_Value_Average
; * @Description : 连续转换
; * @IN_Parameter : 通道
; * @Return parameter : 返回ADC的值
; *************************