你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

cube hal rtc 每秒中断一次 ??

[复制链接]
hpdell 提问时间:2015-12-29 09:48 /
本帖最后由 hpdell 于 2015-12-30 09:54 编辑

最近在折腾这个 cube rtc 每秒中断一次功能,始终不行,
如果不使用每秒中断功能进行读取rtc时间,完全正确,代码如下?

有谁帮忙看看是哪里出问题了啊 ???
唤醒中断 没有进入到 RTC_WKUP_IRQHandler(void) 这个中断函数里面来 ????????????
两个闹钟的中断完全正常。

#define RTC_SET_INIT_TIME   (0x32F2)
u8 RTC_ReadFlag=0;    //一秒读一次时间  =1读取数据, =0不读

RTC_HandleTypeDef RtcHandle;
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
RTC_AlarmTypeDef sAlarm;


void MX_RTC_Init(void)
{
  RtcHandle.Instance = RTC;
  RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24;
  RtcHandle.Init.AsynchPrediv = 127;
  RtcHandle.Init.SynchPrediv = 255;
  RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
  RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  HAL_RTC_Init(&RtcHandle);


  if(HAL_RTCEx_BKUPRead(&RtcHandle, RTC_BKP_DR0) != RTC_SET_INIT_TIME)
  {
    RTC_SetDate(15, 12, 28, 1);   // 设置日期 2015-12-28 星期1
    RTC_SetTime(22, 25, 45);      //  22:25:45

    /*##-3- Writes a data in a RTC Backup data Register0 #######################*/
    HAL_RTCEx_BKUPWrite(&RtcHandle,RTC_BKP_DR0, RTC_SET_INIT_TIME);  
  }

  else
  {
    /* Check if the Power On Reset flag is set */  
    if(__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET)
    {
      #if  RTC_DEBUG_SWITCH > 0u
          /* Initialization Error */
          printf("\r\nRTC Initialization Error 1 ...");
      #endif
    }
    /* Check if Pin Reset flag is set */
    if(__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
    {
      #if  RTC_DEBUG_SWITCH > 0u
          /* Initialization Error */
          printf("\r\nRTC Initialization Error 2 ...");
      #endif
    }

    /* Clear Reset Flag */
    __HAL_RCC_CLEAR_RESET_FLAGS();  
  }

  /**Enable the WakeUp
  */  
HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, 0, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);

}


void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
{
  if(hrtc->Instance==RTC)
  {
    __HAL_RCC_RTC_ENABLE();

    /* Peripheral interrupt init*/
    HAL_NVIC_SetPriority(RTC_WKUP_IRQn, 0x0E, 0);
    HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn);
    HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0x0F, 0);
    HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
  }
}

void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
{
  if(hrtc->Instance==RTC)
  {
    __HAL_RCC_RTC_DISABLE();

    /* Peripheral interrupt Deinit*/
    HAL_NVIC_DisableIRQ(RTC_WKUP_IRQn);

    HAL_NVIC_DisableIRQ(RTC_Alarm_IRQn);

  }
}



//设置时间后,保存时调用
void RTC_SetDate(u8 year, u8 month, u8 date, u8 week)
{
  /*##-1- Configure the Date #################################################*/

  sDate.Year = year;
  sDate.Month = month;
  sDate.Date = date;
  sDate.WeekDay = week;

  if(HAL_RTC_SetDate(&RtcHandle,&sDate,RTC_FORMAT_BIN) != HAL_OK)
  {
    #if  RTC_DEBUG_SWITCH > 0u
    /* Initialization Error */
    printf("\r\nRTC Initialization Error 3 ...");
    #endif
  }
}

void RTC_SetTime(u8 hour, u8 minute, u8 second)
{
  /*##-2- Configure the Time #################################################*/
  sTime.Hours = hour;
  sTime.Minutes = minute;
  sTime.Seconds = second;
  sTime.TimeFormat = RTC_HOURFORMAT12_AM;
  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  sTime.StoreOperation = RTC_STOREOPERATION_RESET;

  if(HAL_RTC_SetTime(&RtcHandle,&sTime,RTC_FORMAT_BIN) != HAL_OK)
  {
    #if  RTC_DEBUG_SWITCH > 0u
        /* Initialization Error */
        printf("\r\nRTC Initialization Error 4 ...");
    #endif
  }
}



// rtc 时间 显示,使用lcd
void RTC_Display(void)
{
        char  datdat[10];

//  /* Get the RTC current Time */
  HAL_RTC_GetTime(&RtcHandle, &sTime, RTC_FORMAT_BIN);   // 时间与日期需要同时获取,切记切记
//  /* Get the RTC current Date */
  HAL_RTC_GetDate(&RtcHandle, &sDate, RTC_FORMAT_BIN);  

        tFont.FontCode = FC_ST_16;        // 字体代码 16点阵
        tFont.FrontColor = CL_WHITE;        // 字体颜色
        tFont.BackColor = CL_GREY;
        tFont.Space = 0;               
        
        sprintf((char *)&datdat[0],
              "20%02d/%02d/%02d",
              sDate.Year,
              sDate.Month,
              sDate.Date);  
        LCD_DispStr( 136, 2, ( uint8_t *)&datdat[0],  &tFont);  

        sprintf((char *)&datdat[0],
          "%02d:%02d:%02d",
          sTime.Hours,
          sTime.Minutes,
          sTime.Seconds);
  LCD_DispStr( 224, 2, ( uint8_t *)&datdat[0],  &tFont);  


        switch(sDate.WeekDay)
        {
                case 1: LCD_DispStr( 296, 2, (uint8_t *)("一"),  &tFont);          break;
                case 2: LCD_DispStr( 296, 2, (uint8_t *)("二"),  &tFont);          break;
                case 3: LCD_DispStr( 296, 2, (uint8_t *)("三"),  &tFont);          break;
                case 4: LCD_DispStr( 296, 2, (uint8_t *)("四"),  &tFont);          break;
                case 5: LCD_DispStr( 296, 2, (uint8_t *)("五"),  &tFont);          break;
                case 6: LCD_DispStr( 296, 2, (uint8_t *)("六"),  &tFont);          break;
                case 7: LCD_DispStr( 296, 2, (uint8_t *)("日"),  &tFont);          break;
        }         
}



void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
  RTC_ReadFlag = 1;   // 时钟读取标志位 置 1
        HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, 1, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);
}



/**
* @brief This function handles RTC wake-up interrupt through EXTI line 22.
*/
void RTC_WKUP_IRQHandler(void)
{
  HAL_RTCEx_WakeUpTimerIRQHandler(&RtcHandle);
}


/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;

  __PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 25;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
                              |RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);

  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}



int main(void)
{

SystemClock_Config();
MX_RTC_Init();

  while(1)
{

//                HAL_RTC_GetTime(&RtcHandle, &sTime, RTC_FORMAT_BIN);
//                HAL_RTC_GetDate(&RtcHandle, &sDate, RTC_FORMAT_BIN);
//                if(RtcSecondBak != sTime.Seconds)    // 采用这个查询法是完全可以的
   if(RTC_ReadFlag)
    {
      RTC_Display();
                        RtcSecondBak = sTime.Seconds;
      RTC_ReadFlag = 0;
    }


}


}














收藏 2 评论12 发布时间:2015-12-29 09:48

举报

12个回答
mark0668 回答时间:2015-12-29 13:37:02
能不能进中断
hpdell 回答时间:2015-12-29 13:56:47

貌似进不了,不知道还有什么中断没有开启 ??
光环 回答时间:2015-12-30 15:42:31
我也是同样的问题,根本不进中断,至今无法解决,只能暂时用的定时器实现秒中断。
光环 回答时间:2015-12-30 15:44:09
请问楼主:下面的代码是自动生成的吗?
  if(HAL_RTCEx_BKUPRead(&RtcHandle, RTC_BKP_DR0) != RTC_SET_INIT_TIME)
  {
    RTC_SetDate(15, 12, 28, 1);   // 设置日期 2015-12-28 星期1
    RTC_SetTime(22, 25, 45);      //  22:25:45

    /*##-3- Writes a data in a RTC Backup data Register0 #######################*/
    HAL_RTCEx_BKUPWrite(&RtcHandle,RTC_BKP_DR0, RTC_SET_INIT_TIME);  
  }
hpdell 回答时间:2015-12-30 15:46:35
光环 发表于 2015-12-30 15:42
我也是同样的问题,根本不进中断,至今无法解决,只能暂时用的定时器实现秒中断。 ...

纠结
我现在也是使用定时器定时一秒后置标志位,
主循环里面判断标志位读取一次

还有他这个外线 22 也不知道在哪里设置,或者是开启外线 22 中断功能,

看hal 库提供的函数,里面就只有一个 HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, 0, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);   这个,也没有找到相应的 Start的函数,记得其他的中断貌似都有个 Start的函数来开启的,这个wakeup貌似木有发现哦 》!
yukaigogogo 回答时间:2016-8-4 14:18:09
请手动开启RTC中断   HAL_RTCEx_SetSecond_IT(&hrtc); 这个代码不会自动生成,需要你调用。回调是这一个void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc)
hpdell 回答时间:2016-8-4 14:31:17
yukaigogogo 发表于 2016-8-4 14:18
请手动开启RTC中断   HAL_RTCEx_SetSecond_IT(&hrtc); 这个代码不会自动生成,需要你调用。回调是这一个voi ...

你好,这个问题早已经搞定了,需要在启动前清除rtc中断标志
yukaigogogo 回答时间:2016-8-4 15:43:07
hpdell 发表于 2016-8-4 14:31
你好,这个问题早已经搞定了,需要在启动前清除rtc中断标志

这个工作应该是库帮你完成了
hpdell 回答时间:2016-8-5 09:02:23
yukaigogogo 发表于 2016-8-4 15:43
这个工作应该是库帮你完成了

木有,配置完成后,必须得人为的清除 rtc 所以中断标志一次 就可以了
yukaigogogo 回答时间:2016-8-5 09:50:02
hpdell 发表于 2016-8-5 09:02
木有,配置完成后,必须得人为的清除 rtc 所以中断标志一次 就可以了

那你得更新一下HAL库了
zhang_mike2000 回答时间:2016-10-25 16:17:52
你程序里希望进哪个中断?

我的理解是进: RTC global interrupt 中断号是19
* @brief This function handles RTC global interrupt.
*/
void RTC_IRQHandler(void)
{
  /* USER CODE BEGIN RTC_IRQn 0 */

  /* USER CODE END RTC_IRQn 0 */
  HAL_RTCEx_RTCIRQHandler(&hrtc);
  /* USER CODE BEGIN RTC_IRQn 1 */

  /* USER CODE END RTC_IRQn 1 */
}
zbber 回答时间:2016-10-25 19:54:16
好帖子顶一顶!感谢楼主

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版