查看: 1345|回复: 1

[原创] Kinetis M4 k21

[复制链接]

该用户从未签到

1

主题

1

帖子

0

新手上路

Rank: 1

积分
7
最后登录
2016-8-30
发表于 2016-8-30 14:56:16 | 显示全部楼层 |阅读模式
飞思卡尔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);
         }

}

回复

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20084
最后登录
2024-4-30
发表于 2016-8-30 16:53:34 | 显示全部楼层
看样子应该是中断向量表和中断服务函数没有建立有效的链接。
rtc_isr这个要定义为你中断向量表里面对应的中断向量号。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-30 15:12 , Processed in 0.106842 second(s), 19 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表