1. 近期弄了下F4152, 开始是弄个串口打印,还算顺利,遇到个现象就是串口接收中断和发送中断(作为一个),以及总中断(作为另一个),二者只能有一个使能,若都使能,串口功能异常,尝试了几次,都一样,有小伙伴解释下吗
2. 弄通了Basic Timer以及片内的RTC,BT要设置成16位计数器模式,即让BTCNT1和BTCNT2级联,再设置RTC为日历模式,写入时间后,可读出日历在走了。
3. 也玩了下430的睡眠
理解的睡眠机制为,在BT_ISR中给一个固定时间唤醒,比如用BT设定的溢出时间,我这里检查任务,若没有任务了,就睡眠因为是定时(比如1s)唤醒,又因为睡的时间不确定,所以可能出现刚睡就醒的情况,即睡的时间可能满1s,给人感觉是睡了,
可能睡了100ms,此时BT溢出了,就唤醒,即刚睡就醒,给人感觉是没睡
附上BT的初始化和ISR,以及RTC的初始化和获取时间
#pragma vector = BASICTIMER_VECTOR
__interrupt void BT_ISR(void)
{
P7OUT ^= (1<<4);
//for bt test.
bt_counter++;
if(bt_counter >= 6)
//6s 醒一次
{
bt_counter = 0;
Task = 1; //注意Task定义时需要volatile !!
LPM3_EXIT;
}
}
void BT_Init(void)
{
BTCTL |= (1<<5);
//BTCNT2 Clock source is ACLK/256.
//configured to be 16-bit counter mode.
BTCTL = BT_ADLY_1000; //1000ms
IE2 |= (1<<7); //bt enable interrupt
//Basic Timer进入ISR条件是自身中断使能以及打开总中断。
//实际测试所得。--2015.11.12 12:38
}
void RTC_Init(void)
{
RTCCTL &= ~(1<<7); //hex format
RTCCTL &= ~(1<<6); //RTC is operational
RTCCTL |= (1<<5)|(1<<4); //Calender mode
//RTCCTL |= (1<<1); //enable RTC interrupt
//若打开RTC中断,则无法进入BT_ISR了
//所以这里禁止RTC中断
}
void GetTime(void)
{
union sv_16 temp_union_16;
TRACE("\r\n****** Enter into GetTime() *******\r\n");
temp_union_16.c[1] = RTCYEARH;
temp_union_16.c[0] = RTCYEARL;
dth[YEAR] = temp_union_16.Val % 2000;
dth[MONTH] = RTCMON;
dth[DATE] = RTCDAY;
dth[HOUR] = RTCHOUR;
dth[MIN] = RTCMIN;
dth[SEC] = RTCSEC;
if(debug)
{
TRACE("dth[YEAR] = %d\r\n", dth[YEAR]);
TRACE("dth[MONTH] = %d\r\n", dth[MONTH]);
TRACE("dth[DATE] = %d\r\n", dth[DATE]);
TRACE("dth[HOUR] = %d\r\n", dth[HOUR]);
TRACE("dth[MIN] = %d\r\n", dth[MIN]);
TRACE("dth[SEC] = %d\r\n", dth[SEC]);
}
}
|