查看: 4758|回复: 13

[求助] KL05的RTC秒中断,怎么进不了中断

[复制链接]

该用户从未签到

10

主题

42

帖子

0

注册会员

Rank: 2

积分
147
最后登录
2021-10-25
发表于 2015-9-2 11:50:38 | 显示全部楼层 |阅读模式
我想用KL05的RTC秒中断实现部分功能。1、不调用RTC_INT函数,程序运行正常。
2、调用RTC_INT函数,程序会一直停留在sysint.c中调用 mcg_clk_hz =  fei_fee(CLK0_FREQ_HZ,HIGH_GAIN,CLK0_TYPE);时停留在MCG.C  中的红色部分。if (erefs_val)
  {
        for (i = 0 ; i < 20000000 ; i++)
        {
          if (MCG_S & MCG_S_OSCINIT0_MASK) break; // jump out early if OSCINIT sets before loop finishes
        }
        if (!(MCG_S & MCG_S_OSCINIT0_MASK)) return 0x23; // check bit is really set and return with error if not set
  }
程序运行不起来,请帮忙看看怎么回事?谢谢!
3、下面是RTC_INT函数:
uint8 RTC_Init(uint32 seconds, uint32 alarm, uint8 c_interval, uint8 c_value,uint8 rtc_irqc, RTC_ISR_CALLBACK isr_func)
{
  int i;

  SIM_SCGC6 |= SIM_SCGC6_RTC_MASK;
  SIM_SOPT1 = SIM_SOPT1_OSC32KSEL(0);
  disable_irq(20);
  disable_irq(21);

  RTC_CR  = RTC_CR_SWR_MASK; //rtc 软件复位

  RTC_CR  &= ~RTC_CR_SWR_MASK;  

   if (RTC_SR & RTC_SR_TIF_MASK){
        RTC_TSR = 0x00000000;   //  this action clears the TIF
        printf("RTC Invalid flag was set - Write to TSR done to clears RTC_SR =  %#02X \n",  (RTC_SR) )  ;
    }
    /*Set time compensation parameters*/
  RTC_TCR = RTC_TCR_CIR(c_interval) | RTC_TCR_TCR(c_value);
   /*Enable the oscillator*/
  RTC_CR |= RTC_CR_OSCE_MASK;

  /*Wait to all the 32 kHz to stabilize, refer to the crystal startup time in the crystal datasheet*/
  for(i=0;i<0x600000;i++);

  RTC_SR &= ~RTC_SR_TCE_MASK;

  if(rtc_irqc)
  {
    RTC_IER = (rtc_irqc & 0x07);

    RTC_ISR[0]=isr_func;

    enable_irq(20);
  }

  RTC_TSR = seconds;

  RTC_TAR = alarm;

  RTC_SR |= RTC_SR_TCE_MASK;

  return 1;
}

4、下面是我在ISR.H中定义:
#undef  VECTOR_036
#define VECTOR_036      RTC_IRQHandler          /*!< Vector 36 points to RTC interrupt service routine */
5、在main()函数while()前调用

     SMC_PMPROT =  SMC_PMPROT_AVLLS_MASK |
                      SMC_PMPROT_ALLS_MASK  |   
                      SMC_PMPROT_AVLP_MASK;
      RTC_Init(0, 2, 0, 0, RTC_INT_ALARM,RTC_Handle);

6、中断相关函数:

void RTC_Handle(void)
{
//  RTC_TAR +=2; //Alarm register add 2
  LED1_TOGGLE;
}


/*
   RTC interrupt service function
*/
void RTC_IRQHandler(void)
{
  if((RTC_SR & RTC_SR_TIF_MASK)== 0x01)
  {

    RTC_ISR[0]();
    //clear flag
    RTC_SR |= RTC_SR_TIF_MASK;

  }       
  else if((RTC_SR & RTC_SR_TOF_MASK) == 0x02)
  {

    RTC_ISR[0]();  

    RTC_SR |= RTC_SR_TOF_MASK;
  }                
  else if((RTC_SR & RTC_SR_TAF_MASK) == 0x04)
  {

    RTC_ISR[0]();  

    RTC_SR |= RTC_SR_TAF_MASK;
    //LED_GREEN_TOGGLE;
    LED1_TOGGLE;
  }       
}

file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\2250715919\QQ\WinTemp\RichOle\JV7B$VL6G4M0)L)K3$`QXNQ.png



我知道答案 目前已有13人回答

评分

参与人数 1NXP金币 +3 收起 理由
小七 + 3

查看全部评分

回复

使用道具 举报

  • TA的每日心情
    开心
    2024-7-31 10:09
  • 签到天数: 392 天

    连续签到: 1 天

    [LV.9]以坛为家II

    45

    主题

    1338

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3163
    最后登录
    2024-12-27
    发表于 2015-9-2 13:26:14 | 显示全部楼层
    SIM_SOPT1 = SIM_SOPT1_OSC32KSEL(0);这个相当于你用的外部无源晶振,通过EXTAL0,XTAL0输入,你的硬件上,是用的32k吗?
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2015-9-2 13:34:51 | 显示全部楼层
    楼主先检查一下外部晶振的是否启振。 2015-09-02_13-34-28.jpg
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    42

    帖子

    0

    注册会员

    Rank: 2

    积分
    147
    最后登录
    2021-10-25
     楼主| 发表于 2015-9-2 14:50:15 | 显示全部楼层
    是用的32.768K晶振.这是电路图。
    1、如果外部晶振不起振,我不调用RTC_INT程序为什么可以正常运行?
    2、调用RTC_INT程序就会停留在MGC.C的 if (MCG_S & MCG_S_OSCINIT0_MASK) break处,一直等待超时退出。

    原理图

    原理图
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    42

    帖子

    0

    注册会员

    Rank: 2

    积分
    147
    最后登录
    2021-10-25
     楼主| 发表于 2015-9-2 14:51:28 | 显示全部楼层
    测试晶振现在没有示波器,用万用表能否测试晶振是否起振?我意思通过测直流电压判断晶振起振。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2015-9-2 16:31:30 | 显示全部楼层
    FRDM-KL05有对应的例程包,里面就有RTC驱动文件,可以直接调用的
    例程包下载链接:
    https://www.freescale.co
    m/zh-H ... ab=Design_Tools_Tab
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    42

    帖子

    0

    注册会员

    Rank: 2

    积分
    147
    最后登录
    2021-10-25
     楼主| 发表于 2015-9-3 10:21:51 | 显示全部楼层
    调用例程包里的rtc_int();现象是一样的。我在程序能正常跑起来的前提下,也就是不调用RTC_INT函数将板子上的晶振拆掉,上电后程序跑不起来,焊上后程序能够运行,说明板子的晶振已经起振了。可就是调用RTC_INT函数,程序就会在MGC.C里一直等待oscint置位。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    45

    帖子

    0

    注册会员

    Rank: 2

    积分
    146
    最后登录
    1970-1-1
    发表于 2015-9-4 10:31:18 | 显示全部楼层
    如果外部晶振使用的32K,如原理图,系统会在启动时在sysint.c中调用 mcg_clk_hz =  fei_fee(CLK0_FREQ_HZ,HIGH_GAIN,CLK0_TYPE);去初始化时钟
    已经初始化过这个晶振到FEE模式
    、调用RTC_INT函数,不会重新再去初始化这个时钟。
    要看下之前没有调用rtc_init是否是真的能跑起来,调用rtc_init后如果跑到sysinit.c中去,八成是复位了,看看哪个语句导致的复位。、
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    42

    帖子

    0

    注册会员

    Rank: 2

    积分
    147
    最后登录
    2021-10-25
     楼主| 发表于 2015-9-6 08:50:08 | 显示全部楼层
    本帖最后由 wfjwhy 于 2015-9-6 08:51 编辑
    FSL_TICS_ZP 发表于 2015-9-2 16:31
    FRDM-KL05有对应的例程包,里面就有RTC驱动文件,可以直接调用的
    例程包下载链接:
    http://www.freescale.c ...

    刚看到,我用的RTC_INT就是版主在阿莫论坛的KL03例程移植过来的,这个论坛地址:https://www.nxpic.org.cn/module/forum/thread-599148-1-1.html
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2015-9-6 08:59:49 | 显示全部楼层
    wfjwhy 发表于 2015-9-6 08:50
    刚看到,我用的RTC_INT就是版主在阿莫论坛的KL03例程移植过来的,这个论坛地址:http://www.freescaleic.o ...

    好吧,我待会试试看
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-28 17:43 , Processed in 0.116670 second(s), 32 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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