完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在折腾这个 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("rnRTC 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("rnRTC 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("rnRTC 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("rnRTC 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; } } } |
|
相关推荐
12个回答
|
|
能不能进中断
|
|
|
|
|
|
|
|
我也是同样的问题,根本不进中断,至今无法解决,只能暂时用的定时器实现秒中断。
|
|
|
|
请问楼主:下面的代码是自动生成的吗?
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); } |
|
|
|
纠结 我现在也是使用定时器定时一秒后置标志位, 主循环里面判断标志位读取一次 还有他这个外线 22 也不知道在哪里设置,或者是开启外线 22 中断功能, 看hal 库提供的函数,里面就只有一个 HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, 0, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); 这个,也没有找到相应的 Start的函数,记得其他的中断貌似都有个 Start的函数来开启的,这个wakeup貌似木有发现哦 》! |
|
|
|
请手动开启RTC中断 HAL_RTCEx_SetSecond_IT(&hrtc); 这个代码不会自动生成,需要你调用。回调是这一个void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc)
|
|
|
|
脑洞大赛20 发表于 2019-2-19 11:15 你好,这个问题早已经搞定了,需要在启动前清除rtc中断标志 |
|
1 条评论
|
|
|
|
|
|
|
|
|
|
|
|
|
|
你程序里希望进哪个中断?
我的理解是进: 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 */ } |
|
|
|
好帖子顶一顶!感谢楼主
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
1063 浏览 0 评论
2395 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2190 浏览 3 评论
4824 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2333 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 04:21 , Processed in 0.853059 second(s), Total 99, Slave 83 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号