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

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 所以中断标志一次 就可以了
12下一页

所属标签

相似问题

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