打印

求助,我的程序RTCALARM报警中断为啥进不去

[复制链接]
5032|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dmj2168|  楼主 | 2013-3-30 11:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dmj2168|  楼主 | 2013-3-30 11:35 | 只看该作者
int main()
{
        #ifdef DEBUG
        debug();
        #endif
        u32 tmp=0;

        Configuration();
        deletef("cmd.dat");                
        creatf("cmd.dat",0,0);
        //RTC_Configuration();
        RTC_ITConfig(RTC_IT_SEC, ENABLE);                                                        //使能中断   
        RTC_WaitForLastTask();
        RTC_ITConfig(RTC_IT_ALR,ENABLE);
        RTC_WaitForLastTask();
    tmp=RTC_GetCounter();
        RTC_WaitForLastTask();        
        RTC_SetAlarm(tmp + 60);                                                                   //60S 后RTC报警唤醒       
        RTC_WaitForLastTask();                    
        while(1)
        {       
           RCC_ClearFlag();
           if(count>4000)
           {
               writef("cmd.dat",GPS,count);                                                   //写入SD卡SRAM的数据
                   GPIO_SetBits(GPIOB, GPIO_Pin_12);                            //给GPS供电打开
               Delay1(1500);
                   count=0;
           }
           else
           {
               GPIO_SetBits(GPIOB, GPIO_Pin_12);                            //给GPS供电打开
               Delay1(1500);
           }
           USART_ITConfig(USART3,USART_IT_RXNE  , ENABLE);
           GPSdataformat();                                                                                         //用串口收到GPS数据,并且写入 SRAM
                 
           if (dingwei==0)
           {
                                                                   
                   //PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFE) ;         //系统进入STOP模式
                   //Configuration();
                          
           }
          }
}

使用特权

评论回复
板凳
dmj2168|  楼主 | 2013-3-30 11:36 | 只看该作者
我吧进入STOP模式关了,因为报警没好用,

使用特权

评论回复
地板
dmj2168|  楼主 | 2013-3-30 11:39 | 只看该作者
void Configuration(void)  
{            
        RCC_Configuration();                                           //时钟初始化
        NVIC_Configuration();                                           //中断初始化
        GPIO_Configuration();                                           //I/O口初始化
        USART3_Configuration();                                           //串口3初始化
        power_on1();                                                           // SPI初始化
          SysTick_SetReload(9000);                                   //重装系统街拍
    SysTick_ITConfig(ENABLE);                                   //使能体统中断
        RTC_SetAlarm_EXTI() ;                                           //RTC闹钟报警 设置
    RTC_ITConfig(RTC_IT_ALR, ENABLE);
    RTC_WaitForLastTask();

        RTC_Config() ;                                              //RTC设置
        Delay1(2000);
}

void RCC_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
        RCC_DeInit();
        RCC_HSEConfig(RCC_HSE_ON);
        HSEStartUpStatus = RCC_WaitForHSEStartUp();
        if(HSEStartUpStatus == SUCCESS)
        {
            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);           /* Enable Prefetch Buffer */         
            FLASH_SetLatency(FLASH_Latency_2);                                                             /* Flash 2 wait state */
            RCC_HCLKConfig(RCC_SYSCLK_Div1);                                                               /* HCLK = SYSCLK */
            RCC_PCLK2Config(RCC_HCLK_Div1);                                                             /* PCLK2 = HCLK */
            RCC_PCLK1Config(RCC_HCLK_Div2);                                                                    /* PCLK1 = HCLK/2 */
            RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);                    /* PLLCLK = 8MHz * 9 = 72 MHz */
            RCC_PLLCmd(ENABLE);                                                                                                /* Enable PLL */
            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)                            /* Wait till PLL is ready */
            {
            }       
            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                                                /* Select PLL as system clock source */
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                                         RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);               
            while(RCC_GetSYSCLKSource() != 0x08)                                    /* Wait till PLL is used as system clock source */
            {
            }
        }
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);       
}

void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);       
        NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

}

void RTC_SetAlarm_EXTI(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_ClearITPendingBit(EXTI_Line17);
    EXTI_InitStructure.EXTI_Line = EXTI_Line17;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_Init(&EXTI_InitStructure);

    RTC_NVIC_Config();
}

void RTC_NVIC_Config(void)

{
    NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);       
    NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
void RTC_Config(void)
{
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
        //后备域解锁
     PWR_BackupAccessCmd(ENABLE);
    //我们在BKP的后备寄存器1中,存了一个特殊字符0xA5A5
    //第一次上电或后备电源掉电后,该寄存器数据丢失,
    //表明RTC数据丢失,需要重新配置
    if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
    {
        //重新配置RTC
        RTC_Configuration();
        //配置完成后,向后备寄存器中写特殊字符0xA5A5
        BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
                settime=1;
    }
    else
    {
        //若后备寄存器没有掉电,则无需重新配置RTC
        //这里我们可以利用RCC_GetFlagStatus()函数查看本次复位类型
        if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
        {
            //这是上电复位
        }
        else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
        {
            //这是外部RST管脚复位
        }
        //清除RCC中复位标志
        RCC_ClearFlag();

        //虽然RTC模块不需要重新配置,且掉电后依靠后备电池依然运行
        //但是每次上电后,还是要使能RTCCLK???????
        //RCC_RTCCLKCmd(ENABLE);
        //等待RTC时钟与APB1时钟同步
        //RTC_WaitForSynchro();

        //使能秒中断
        //RTC_ITConfig(RTC_IT_SEC, ENABLE);
        //等待操作完成
        //        RTC_ITConfig(RTC_IT_SEC, ENABLE);

        RTC_WaitForLastTask();

    }

    #ifdef RTCClockOutput_Enable
    /* Enable PWR and BKP clocks */

    /* Disable the Tamper Pin */
    BKP_TamperPinCmd(DISABLE);

    /* Enable RTC Clock Output on Tamper Pin */
    BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
   #endif

    return;
}

使用特权

评论回复
5
dmj2168|  楼主 | 2013-3-30 11:40 | 只看该作者
void RTCAlarm_IRQHandler(void)

{
  if(RTC_GetITStatus(RTC_IT_ALR) != RESET)
  {
   
    EXTI_ClearITPendingBit(EXTI_Line17);
   
    /* Check if the Wake-Up flag is set */
    if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
    {
      /* Clear Wake Up flag */
      PWR_ClearFlag(PWR_FLAG_WU);
    }
   
    /* Clear the RTC Second interrupt */
    RTC_ClearITPendingBit(RTC_IT_ALR);
      
    /* Enable time update */
    TimeDisplay = 1;

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
    /* Reset RTC Counter when Time is 23:59:59 */
    if(RTC_GetCounter() == 0x00015180)
    {
      RTC_SetCounter(0x0);
      /* Wait until last write operation on RTC registers has finished */
      RTC_WaitForLastTask();
    }
  }  

}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

15

帖子

1

粉丝