打印

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

[复制链接]
249|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
第8号打板工|  楼主 | 2018-7-30 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前的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("
  *********************** RTC Time Stamp Example ***********************
");   
    if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x5566)
    {
        /* RTC configuration  */
        RTC_Config();
        /* Check on RTC init */
        if (RTC_Init(&RTC_InitStructure) == ERROR)
        {
            printf("
        /!\***** RTC Prescaler Config failed ********/!\
");
        }      
        /* 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("
Power On Reset occurred....
");
        }
        /* Check if the Pin Reset flag is set */
        else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
        {
          printf("
External Reset occurred....
");
        }      
        printf("
No need to configure RTC....
");        
        /* Enable the PWR clock */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);      
        /* Allow access to RTC */
       &nbspWR_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后备后备寄存器读写权限//
&nbspWR_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
        // 使能低电压时使用后备电池//
&nbspWR_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);
        }
}

使用特权

评论回复

相关帖子

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

本版积分规则

393

主题

393

帖子

0

粉丝