智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1754|回复: 5
打印 上一主题 下一主题

[单片机] K60 RTC进不了中断

[复制链接]

5

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1562
威望
699
贡献
619
兑换币
463
注册时间
2014-7-13
在线时间
122 小时
毕业学校
江苏科技大学
跳转到指定楼层
1#
发表于 2014-7-30 18:05:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
8贡献
K60 RTC进不了中断
void main(void)
{
    //1 主程序使用的变量定义
//    uint32 runcount;                // 运行计数器

    //2 关中断
    DisableInterrupts;          //禁止总中断

    SIM_SCGC5 = SIM_SCGC5_PORTA_MASK;

    //3 模块初始化
    light_init(Light_Run_PORT,Light_Run1,Light_OFF); //指示灯初始化
    light_init(Light_Run_PORT,Light_Run2,Light_OFF); //指示灯初始化
    light_init(Light_Run_PORT,Light_Run3,Light_ON); //指示灯初始化
    light_init(Light_Run_PORT,Light_Run4,Light_ON); //指示灯初始化
    rtc_init(1);

    //4 开中断

    //主循环
    while(1)
    {

    }
}

void rtc_init(uint32 alarm)
{
    uint32 i;

    SIM_SCGC6 |= SIM_SCGC6_RTC_MASK;    //打开RTC时钟

    RTC_CR = RTC_CR_SWR_MASK;           //复位所有RTC寄存器值(除了SWR位)
    RTC_CR &= ~RTC_CR_SWR_MASK;         //将SWR位清零(清除复位标志)


    RTC_CR |= RTC_CR_OSCE_MASK;         //开启振荡器

    for(i = 0;i < 0x600000;i++);        //延时让晶振稳定振动

    //设置补偿时间间隔为0
    //设置溢出时钟周期 32768 clock cycles
    RTC_TCR = RTC_TCR_CIR(0) | RTC_TCR_TCR(0);   

    //当时间计数器开启时,每当TAR[TAR]等于TSR[TSR]
    //并且TSR[TSR]增加时,SR[TAF]设置。写TAR清除SR[TAF]。
    RTC_TSR = 0;                        //TSR初始值,即清空RTC时间秒寄存器
    RTC_TAR = alarm;                    //设置TAR初始值

    RTC_SR |= RTC_SR_TCE_MASK;          //开秒计数器

    enable_irq(66);                     //使能RTC中断
}


void rtc_isr(void)
{
//    #define VECTOR_082                0x0000_0148
    if((RTC_SR & RTC_SR_TIF_MASK) == 0x01) //无效
    {
//        RTC_SR &= 0x07;  
//        RTC_TSR = 0x00;
        light_change(Light_Run_PORT,Light_Run1);//指示灯的亮、暗状态切换
        light_change(Light_Run_PORT,Light_Run2);//指示灯的亮、暗状态切换
        RTC_SR |= RTC_SR_TIF_MASK;              //清除中断标志位

    }  
    else if((RTC_SR & RTC_SR_TOF_MASK) == 0x02) //溢出
    {
//        RTC_SR &= 0x07;
//        RTC_TSR = 0x00;  //计数器关闭 可以读取或写入
        light_change(Light_Run_PORT,Light_Run3);//指示灯的亮、暗状态切换
        light_change(Light_Run_PORT,Light_Run4);//指示灯的亮、暗状态切换
        RTC_SR |= RTC_SR_TOF_MASK;              //清除中断标志位
    }         
    else if((RTC_SR & RTC_SR_TAF_MASK) == 0x04) //报警
    {
        light_change(Light_Run_PORT,Light_Run1);//指示灯的亮、暗状态切换
        light_change(Light_Run_PORT,Light_Run2);//指示灯的亮、暗状态切换
        light_change(Light_Run_PORT,Light_Run3);//指示灯的亮、暗状态切换
        light_change(Light_Run_PORT,Light_Run4);//指示灯的亮、暗状态切换

//        RTC_TAR = RTC_TSR;  //TAR == TSR TSR增加触发
        RTC_SR |= RTC_SR_TAF_MASK;              //清除中断标志位
    }

//    RTC_TAR += 2;
}

求解决

回复

使用道具 举报

5

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1562
威望
699
贡献
619
兑换币
463
注册时间
2014-7-13
在线时间
122 小时
毕业学校
江苏科技大学
2#
 楼主| 发表于 2014-7-30 18:06:34 | 只看该作者
谁有K60 的RTC的例程的???
回复

使用道具 举报

5

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1562
威望
699
贡献
619
兑换币
463
注册时间
2014-7-13
在线时间
122 小时
毕业学校
江苏科技大学
3#
 楼主| 发表于 2014-7-31 09:54:29 | 只看该作者
我自己搞定了
但是由于最小系统上的VBAT未上电,所以只能进时间无效中断,32768的晶振就没有起振,龙邱的板子有点坑爹,看原理图上明明是接上了的,可是用外用表测一下却发现,VBAT没有电!


附上我修改后的程序

主要区别是将开启中断的位置提前了

——————————华丽的分割线————————————————————————————————
void rtc_init(uint32 alarm);
//全局变量声明

//uint8 aa = 1;

//主函数
void main(void)
{
    //1 主程序使用的变量定义
    uint32 runcount;                // 运行计数器
   
    //2 关中断
    DisableInterrupts;          //禁止总中断
   
    SIM_SCGC5 = SIM_SCGC5_PORTA_MASK;
   
    //3 模块初始化
    light_init(Light_Run_PORT,Light_Run1,Light_OFF); //指示灯初始化
    light_init(Light_Run_PORT,Light_Run2,Light_OFF); //指示灯初始化
    light_init(Light_Run_PORT,Light_Run3,Light_ON); //指示灯初始化
    light_init(Light_Run_PORT,Light_Run4,Light_ON); //指示灯初始化   
    rtc_init(0);
   
    //4 开中断
    EnableInterrupts;                                //开总中断
   
    //主循环
    while(1)
    {
        runcount++;
        if(runcount >= 5000000)
        {
            light_change(Light_Run_PORT,Light_Run1);//指示灯的亮、暗状态切换
            runcount = 0;
        }
    }
}

void rtc_init(uint32 alarm)
{
    uint32 i;
   
    SIM_SCGC6 |= SIM_SCGC6_RTC_MASK;    //打开RTC时钟
   
    RTC_CR = RTC_CR_SWR_MASK;           //复位所有RTC寄存器值(除了SWR位)
    RTC_CR &= ~RTC_CR_SWR_MASK;         //将SWR位清零(清除复位标志)
   
   
    RTC_CR |= RTC_CR_OSCE_MASK;         //开启振荡器
   
    for(i = 0;i < 0x600000;i++);        //延时让晶振稳定振动
   
    EnableInterrupts;                                //开总中断
    enable_irq(66);                     //使能RTC中断
   
    //设置补偿时间间隔为0
    //设置溢出时钟周期 32768 clock cycles
    RTC_TCR = RTC_TCR_CIR(0) | RTC_TCR_TCR(0);   
   
    //当时间计数器开启时,每当TAR[TAR]等于TSR[TSR]
    //并且TSR[TSR]增加时,SR[TAF]设置。写TAR清除SR[TAF]。
    RTC_TSR = 0;                        //TSR初始值,即清空RTC时间秒寄存器
    RTC_TAR = alarm;                    //设置TAR初始值
   
    RTC_SR |= RTC_SR_TCE_MASK;          //开秒计数器
   
    RTC_SR &= ~RTC_SR_TAF_MASK;
//    EnableInterrupts;                                //开总中断
}


void rtc_isr(void)
{
    DisableInterrupts;          //禁止总中断

    if((RTC_SR & RTC_SR_TIF_MASK) == 0x01) //无效
    {
//        RTC_SR &= 0x07;
//        RTC_TSR = 0x00;
        
//        light_change(Light_Run_PORT,Light_Run1);//指示灯的亮、暗状态切换
        light_change(Light_Run_PORT,Light_Run2);//指示灯的亮、暗状态切换
        RTC_SR |= RTC_SR_TIF_MASK;              //清除中断标志位

    }  
    else if((RTC_SR & RTC_SR_TOF_MASK) == 0x02) //溢出
    {
//        RTC_SR &= 0x07;
//        RTC_TSR = 0x00;  //计数器关闭 可以读取或写入
        light_change(Light_Run_PORT,Light_Run3);//指示灯的亮、暗状态切换
        light_change(Light_Run_PORT,Light_Run4);//指示灯的亮、暗状态切换
        RTC_SR |= RTC_SR_TOF_MASK;              //清除中断标志位
    }         
    else if((RTC_SR & RTC_SR_TAF_MASK) == 0x04) //报警
    {
//        light_change(Light_Run_PORT,Light_Run1);//指示灯的亮、暗状态切换
        light_change(Light_Run_PORT,Light_Run2);//指示灯的亮、暗状态切换
        light_change(Light_Run_PORT,Light_Run3);//指示灯的亮、暗状态切换
        light_change(Light_Run_PORT,Light_Run4);//指示灯的亮、暗状态切换

//        RTC_TAR = RTC_TSR;  //TAR == TSR TSR增加触发
        RTC_SR |= RTC_SR_TAF_MASK;              //清除中断标志位
    }
      
//    RTC_TAR += 1;
    EnableInterrupts;                                //开总中断
}
  
回复

使用道具 举报

5

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1562
威望
699
贡献
619
兑换币
463
注册时间
2014-7-13
在线时间
122 小时
毕业学校
江苏科技大学
4#
 楼主| 发表于 2014-7-31 09:55:16 | 只看该作者
如有问题,还望各位大神多多指教!
回复

使用道具 举报

68

主题

439

帖子

2

精华

版主

Rank: 9Rank: 9Rank: 9

积分
4618
QQ
威望
2342
贡献
1290
兑换币
1175
注册时间
2009-12-24
在线时间
493 小时
5#
发表于 2014-11-7 22:42:32 | 只看该作者
K60的RTC目前只有一个终端叫做 溢出错误终端,意思是TSR溢出(N万千年之后),所以你等不到了。 看看这个帖子 http://www.znczz.com/thread-202246-1-1.html
回复

使用道具 举报

5

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1562
威望
699
贡献
619
兑换币
463
注册时间
2014-7-13
在线时间
122 小时
毕业学校
江苏科技大学
6#
 楼主| 发表于 2014-11-9 00:51:38 | 只看该作者
yandld 发表于 2014-11-7 22:42
K60的RTC目前只有一个终端叫做 溢出错误终端,意思是TSR溢出(N万千年之后),所以你等不到了。 看看这个帖 ...


回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-10-2 12:37 , Processed in 0.083649 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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