在线时间0 小时
UID3065860
注册时间2016-8-29
NXP金币0
该用户从未签到
新手上路
- 积分
- 7
- 最后登录
- 2016-8-30
|
飞思卡尔kinetis系列芯片之k21 mcu的RTC模块,在闹钟时间到达的时候,进不了中断服务,程序直接奔溃是什么原因?
以下是文件内容:
void s_InitRTC(void)
{
uint i;
//开启rtc模块时钟
SIM_SCGC6 |= SIM_SCGC6_RTC_MASK;
//复位所有RTC寄存器(除了RTC_WAR与RTC_RAR寄存器)
RTC_CR = RTC_CR_SWR_MASK;
//清除RTC复位标志
RTC_CR &= ~RTC_CR_SWR_MASK;
//开启晶振,配置16pf电容,不向外界输出
RTC_CR |= (RTC_CR_OSCE_MASK | RTC_CR_SC16P_MASK | RTC_CR_CLKO_MASK );
//等待晶振起振
for(i=0; i<0x600000; i++);
//设置补偿寄存器
RTC_TCR = RTC_TCR_CIR(0) | RTC_TCR_TCR(0);
RTC_SR &= ~ RTC_SR_TCE_MASK;//关闭计数器,准备配置TAR
//初始化秒寄存器
RTC_TSR = 35 * 3600 + 11;//xx年xx月01日11时00分11秒
//配置闹钟
RTC_TAR = RTC_TSR + 20;/////////////////////////////////20秒中断
//开alarm中断
RTC_IER |= (RTC_IER_TIIE_MASK | RTC_IER_TOIE_MASK | RTC_IER_TAIE_MASK);
//使能RTC计数器开始计数
RTC_SR |= RTC_SR_TCE_MASK;
//使能闹钟、秒中断
enable_irq(RTC_ALARM_INT);
}
void RTCSetAlarm(uint uiAlarmVal)
{
RTC_SR &= ~RTC_SR_TCE_MASK;//关闭计数器
RTC_TAR += uiAlarmVal;
RTC_SR |= RTC_SR_TCE_MASK;//开启计数器
}
void rtc_isr(void)
{
if ((RTC_SR & RTC_SR_TIF_MASK) == 0x01)
{
//清中断标志位
RTC_SR |= RTC_SR_TIF_MASK;
//do
}
else if ((RTC_SR & RTC_SR_TOF_MASK) == 0x02)
{
//清中断标志位
RTC_SR |= RTC_SR_TOF_MASK;
//do
}
else if ((RTC_SR & RTC_SR_TAF_MASK) == 0x04)
{
printf("rtc_isr alram interrupt 66666666666666\n");
//alarm自增
RTCSetAlarm(10);
}
}
void main()
{
uint uiCnt = 1;
uchar aucTime[7];
s_SystemInit();
s_InitRTC();
while(uiCnt++)
{
printf("DSTR[%d]\n",uiCnt);
GetTime(aucTime);//不会错的
printf"time:%s",aucTime);
DelayMs(500);
if(uiCnt%30==0)
RTCSetAlarm(10);
}
}
|
|