注意!开发时没有调过时钟,直接用官方提供的demo进行修改开发。在此开发条件下,将所遇问题进行归纳。默认时钟主频是16Mhz。
定时器
定时器精度
由于项目需要用到433MHz遥控信号检测,需要在中断里读取IO电平变化并执行相应逻辑函数,我设置的是TIMER_DIV12_VALUE_10us 函数 ,10us产生中断一次。
精度有误差,在定时器中断计数调试,计数50000次,理论为500ms,但是实际是600ms左右。能选用低频率中断尽量选择低频率中断,精度会高一些。
定时器中断
中断里面尽量不要增加处理函数,增加一条常规语句 都有可能导致时间不准。我在中断里 添加了一个变量的++,就会导致遥控无法识别。
低功耗
进入低功耗时主要语句三句
clr_BODEN;
clr_ADCEN;
set_PD;
特别注意
进入低功耗之前,一定要确认输入引脚的电平要确认,不要悬空!用自带的弱上拉也不行。
输出电平要与外部保持一致,尽量降低功耗。
特别强调一点输入引脚,如果想检测低电平,默认高电平时,使用内部弱上拉进入低功耗会产生100uA左右的电流。外部加一个上拉电阻则该电流消失。
GPIO中断
在电路设计时,所有中断要在同一个组(P0x,P1x,P2x,P3x)。
例如中断为P15、P16、P17,不能P15、P16、P2x。
因为在配置时需要配置PIPS0 、PIPS1寄存器,只能一个值。
例如P15的配置
set_EPI; // 开启GPIO中断
set_EA; //总中断
P15_Input_Mode;//输入模式
clr_PIPS1; // 配置端口 BIT1
set_PIPS0; // 配置端口 BIT0
Enable_BIT5_FallEdge_Trig;//下降沿触发
P15 = 1;// 开启特弱上拉 其实作用不大!
串口中断
这里只讲使用2个串口在9600波特率下的接收发送配置。其余用途项目未使用到 ,也就没有了解。具体详情看手册,我这里直接贴配置。
同时使用的话USART0的库函数配置要修改一下,在Common.C里,改了两个串口才能同时正常的收发
void Send_Data_To_UART0 (UINT8 c)
{
TI = 0;
SBUF = c;
while(TI==0);
TI = 0;
TI_1 = 0;
}
然后是初始化配置
void UART0_Init(void)
{
set_P06;
set_P07;
set_ES; //串口0中断 使能
set_EA; //全局中断使能
InitialUART0_Timer1(9600); // 波特率
TI = 0; //数据发送中断置1
}
void UART1_Init(void)
{
set_P02;
set_P16;
set_ES_1; //For interrupt enable
set_EA;
InitialUART1_Timer3(9600);
TI_1 = 0;
}
中断服务函数配置。数据在SBUF_1 和 SBUF 寄存器里
void SerialPort0_ISR(void) interrupt 4
{
if (RI==1)
{ /* if reception occur */
clr_RI; /* clear reception flag for next reception */
}
}
void SerialPort1_ISR(void) interrupt 15
{
if (RI_1==1)
{ /* if reception occur */
clr_RI_1; /* clear reception flag for next reception */
clr_TI_1; //不要漏掉了
}
}
ADC采集
这里有个名词,带隙电压
参考电压一般都是3.3 V,只是上下有细微的浮动,如果使用场景不是那么严苛,就不用管带隙电压,实际带隙电压是用来校准的。
配置的话参考demo或其他文章即可,没什么需要特别注意的。