打印

求助:STM32F407的RTC没有秒钟中断的问题

[复制链接]
7381|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Lin-811|  楼主 | 2013-11-4 17:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Lin-811 于 2013-11-4 17:11 编辑

之前的STM32F1系列都有秒钟中断,我现在这STM32F407发现没有秒中断,在参考手册里面有看到配置异步分频设置为:0x7F 同步分频:0xFF,就是产生1HZ。可是配置完后,发现,秒跳的非常快,不是一秒跳一次。而且设置了24小时格式的,根本上不了13之后的,如果是设置13之后的小时格式,就会超出24,移植到四十几小时,再跳回1小时。以下下是我RTC的配置 和读取:
void RTCTime_Test(void)
{
                RTC_InitTypeDef RTC_InitStructure;
    /* Output a message on Hyperterminal using printf function */
    printf("\n\r  *********************** RTC Time Stamp Example ***********************\n\r");   
    if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x5566)
    {
        /* RTC configuration  */
        RTC_Config();
        /* Check on RTC init */
        if (RTC_Init(&RTC_InitStructure) == ERROR)
        {
            printf("\n\r        /!\\***** RTC Prescaler Config failed ********/!\\ \n\r");
        }      
        /* Configure the time register */
        RTC_TimeRegulate();
//                                RTC_WriteProtectionCmd(DISABLE);
//                                RCC_RTCCLKCmd(ENABLE);
    }
    else
    {
        /* Check if the Power On Reset flag is set */
        if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
        {
          printf("\r\n Power On Reset occurred....\n\r");
        }
        /* Check if the Pin Reset flag is set */
        else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
        {
          printf("\r\n External Reset occurred....\n\r");
        }      
        printf("\r\n No need to configure RTC....\n\r");        
        /* Enable the PWR clock */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);      
        /* Allow access to RTC */
        PWR_BackupAccessCmd(ENABLE);      
        /* Wait for RTC APB registers synchronisation */
        RTC_WaitForSynchro();        
        /* Clear the RTC Alarm Flag */
//        RTC_ClearFlag(RTC_FLAG_ALRAF);        
        /* Clear the EXTI Line 17 Pending bit (Connected internally to RTC Alarm) */
//        EXTI_ClearITPendingBit(EXTI_Line17);      
        /* Display the RTC Time/Date and TimeStamp Time/Date */
        RTC_TimeShow();
        RTC_DateShow();
        RTC_TimeStampShow();
    }
}


void RTC_Config(void)
{
        RTC_InitTypeDef RTC_InitStructure;
  //使能电源时钟//
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
        //使能后备区域时钟//
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
        RTC_DeInit();
  //允许RTC后备后备寄存器读写权限//
  PWR_BackupAccessCmd(ENABLE);
  //复位后备域//
//  RCC_BackupResetCmd(ENABLE);
//  RCC_BackupResetCmd(DISABLE);
  // 使能外部低速时钟/
  RCC_LSEConfig(RCC_LSE_ON);
  //等待低速时钟准备就绪/  
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {
  }
  //选择外部低速时钟(LSE)作为RTC时钟源//
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
        //使能RTC//
        RCC_RTCCLKCmd(ENABLE);
        //等待RTC APB 寄存器同步//
  RTC_WaitForSynchro();
        //Enable The TimeStamp
        RTC_TimeStampCmd(RTC_TimeStampEdge_Falling, ENABLE);
        RTC_WriteProtectionCmd(ENABLE);
        //配置RTC分频值        设置1Hz//
//        RTC->CR |= 0x0010;                                                                                                                                                                                                //基准时钟
  RTC_InitStructure.RTC_AsynchPrediv = 0x7F;                          //设置异步分频值
  RTC_InitStructure.RTC_SynchPrediv  = 0xFF;                         //设置同步分频值
  RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;             //设置时间格式为24小时制
  RTC_Init(&RTC_InitStructure);                                        //初始化RTC
        // 使能低电压时使用后备电池//
  PWR_BackupRegulatorCmd(ENABLE);
//        RCC_BackupResetCmd(ENABLE);
        RCC_RTCCLKCmd(ENABLE);
  // 等待后备域低电压稳定器就绪 //
  while(PWR_GetFlagStatus(PWR_FLAG_BRR) == RESET)
  {
  }
   //向后备寄存器0写入0x5566用于标记已经配置过RTC//
//   RTC_WriteBackupRegister(RTC_BKP_DR0, 0X5566);               
}


void RTC_TimeStampRead(void)
{
//                RTC_Time RTC_Read;
       
                RTC_TimeTypeDef RTC_TimeStructure;
                RTC_DateTypeDef RTC_DateStructure;
       
                RTC_GetTime(RTC_Format_BIN,&RTC_TimeStructure);                                                //获取时间BCD码
                RTC_GetDate(RTC_Format_BIN,&RTC_DateStructure);                                                //获取日期BCD码
                BACK_COLOR = WHITE;
                POINT_COLOR = RED;

                LCD_ShowNum(56,100,RTC_DateStructure.RTC_Year,2,RED);
                LCD_ShowNum(104,100,RTC_DateStructure.RTC_Month,2,RED);
                LCD_ShowNum(160,100,RTC_DateStructure.RTC_Date,2,RED);
                LCD_ShowNum(72,120,RTC_DateStructure.RTC_WeekDay,2,RED);
                LCD_ShowNum(40,140,RTC_TimeStructure.RTC_Hours,2,RED);
                LCD_ShowNum(96,140,RTC_TimeStructure.RTC_Minutes,2,RED);
                LCD_ShowNum(136,140,RTC_TimeStructure.RTC_Seconds,2,RED);
}
int main(void)
{                 
        Clock_Config();                        //系统时钟设置 168M 此后可以设置超频输出到432MHz
        Delay_Init();
        LCD_Init();
        LED_Init();                                  //初始化与LED连接的硬件接口
        COM1Init(115200);
        DMA_Conf(USART_REC_LEN);
        DMA_NVIC_Init();
        USART_NVIC_Init();
       
//        RTC_AlarmConfig();
        Address_set(0,0,800,480);
        LCD_Clear(WHITE);
        LCD_ShowString(40,100,"20  year  month  data",1,BLUE);
        LCD_ShowString(40,120,"week  ",1,BLUE);
        LCD_ShowString(40,140,"  hours  min  sec",1,BLUE);
        if (SysTick_Config(SystemCoreClock / 1000))  //延时1毫秒
        {
         /* Capture error */
                while (1);
        }
        while(1)
        {
                RTCTime_Test();
                RTC_TimeStampRead();
                Delay_ms(500);
//                LCD_Clear(WHITE);
        }
}
沙发
zeluo| | 2013-11-4 20:57 | 只看该作者
不是很了解这一块  楼主   帮你顶一个   看看别人的意见如何  应该有高手能够解决这个问题  顶你一个    很不错资料   确实很给力   顶一个

使用特权

评论回复
板凳
Lin-811|  楼主 | 2013-11-5 17:05 | 只看该作者
24小时的格式用寄存器写就可以了。。但是秒钟还是跳的非常快,我加入了WakeUp中断还是一样

使用特权

评论回复
地板
SLHSu37| | 2013-11-5 17:34 | 只看该作者
没有秒中断?不能吧?

使用特权

评论回复
5
Lin-811|  楼主 | 2013-11-6 09:56 | 只看该作者
SLHSu37 发表于 2013-11-5 17:34
没有秒中断?不能吧?

STM32F4没有秒中断,我上面已经写的很清楚了。。

使用特权

评论回复
6
SLHSu37| | 2013-11-6 10:29 | 只看该作者
Lin-811 发表于 2013-11-6 09:56
STM32F4没有秒中断,我上面已经写的很清楚了。。

使用特权

评论回复
7
香水城| | 2013-11-6 11:56 | 只看该作者
F4的RTC和F1的RTC是不同的IP,功能有了进一步提升。虽然从功能框图上看不到F1上的explicit的“秒中断”,但是可以通过配置F4的“唤醒中断”即其输入源,来输出“每秒产生一次的中断”。下图分别是F1和F4的RTC框图:



至于LZ说的秒信息跳得很快,那需要确认你的时钟输入和分频确实能产生1s的信号。顶楼贴的一大段代码,没有细看,参照F4的标准外设固件库中RTC的例程设置即可。

RTC-F2.png (72.12 KB )

RTC-F2.png

使用特权

评论回复
8
Lin-811|  楼主 | 2013-11-6 17:40 | 只看该作者
香水城 发表于 2013-11-6 11:56
F4的RTC和F1的RTC是不同的IP,功能有了进一步提升。虽然从功能框图上看不到F1上的explicit的“秒中断”,但 ...

已经配置好了。但是不知道为什么根据手册来写竟然不行。还有一点很奇怪
RTC_InitStructure.RTC_SynchPrediv  = 0xFF;                               
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;                        
RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;     
我用这样直接赋值竟然不行,非得这样设置赋值如下:
__IO uint32_t AsynchPrediv = 0, SynchPrediv = 0;
RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv;
        RTC_InitStructure.RTC_SynchPrediv = SynchPrediv;
        RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
就是这样奇怪麻烦。

使用特权

评论回复
9
kmani| | 2013-11-6 20:00 | 只看该作者
Lin-811 发表于 2013-11-6 17:40
已经配置好了。但是不知道为什么根据手册来写竟然不行。还有一点很奇怪
RTC_InitStructure.RTC_SynchPred ...

最郁闷的就是这种问题了

使用特权

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

本版积分规则

3

主题

15

帖子

0

粉丝