• 工程准备,在以下链接工程的基础上添加的RTC功能

https://blog.csdn.net/mygod2008ok/article/details/106750657

  • 在工程中添加stm32f0xx_hal_rtc.c

  • 在stm32f0xx_hal_conf.h中打开HAL_RTC_MODULE_ENABLED宏

  • 新建BSP_rtc.c和BSP_rtc.h文件并加入工程

  • 初时化RTC,由于使用内部40KHz LSI时钟源,如果AsynchPrediv的分频值为128分频,则SynchPrediv的理论分频值

为40000Hz/128 = 312.5,本例程中暂时使用311分频,等会进行实

际测量进行校准

/* RTC init function */
void MX_RTC_Init(void)
{RTC_TimeTypeDef sTime;RTC_DateTypeDef sDate;RTC_AlarmTypeDef sAlarm;/**Initialize RTC Only */hrtc.Instance = RTC;hrtc.Init.HourFormat = RTC_HOURFORMAT_24;hrtc.Init.AsynchPrediv = 127;hrtc.Init.SynchPrediv = 310;hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;HAL_StatusTypeDef err_code = HAL_RTC_Init(&hrtc);APP_ERROR_CHECK(err_code);/**Initialize RTC and set the Time and Date */sTime.Hours = 0x0;sTime.Minutes = 0x0;sTime.Seconds = 0x0;sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;sTime.StoreOperation = RTC_STOREOPERATION_RESET;err_code = HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);APP_ERROR_CHECK(err_code);sDate.WeekDay = RTC_WEEKDAY_MONDAY;sDate.Month = RTC_MONTH_JUNE;sDate.Date = 0x1;sDate.Year = 0x0;err_code = HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);APP_ERROR_CHECK(err_code);/**Enable the Alarm A */sAlarm.AlarmTime.Hours = 0;sAlarm.AlarmTime.Minutes = 0;sAlarm.AlarmTime.Seconds = 1;sAlarm.AlarmTime.SubSeconds = 0;sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY|RTC_ALARMMASK_HOURS|RTC_ALARMMASK_MINUTES;sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;sAlarm.AlarmDateWeekDay = 1;sAlarm.Alarm = RTC_ALARM_A;err_code = HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);APP_ERROR_CHECK(err_code);}
  • RTC重置函数,保证秒钟到达1产生一次中断

/* USER CODE BEGIN 1 */
void TimeRsset(void)
{RTC_TimeTypeDef sTime;sTime.Hours = 0x0;sTime.Minutes = 0x0;sTime.Seconds = 0x0;sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;sTime.StoreOperation = RTC_STOREOPERATION_RESET;HAL_StatusTypeDef err_code = HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD);APP_ERROR_CHECK(err_code);}
  • 重写HAL_RTC_MspInit和HAL_RTC_MspDeInit两个函数


void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
{if(rtcHandle->Instance==RTC){/* USER CODE BEGIN RTC_MspInit 0 *//* USER CODE END RTC_MspInit 0 *//* RTC clock enable */__HAL_RCC_RTC_ENABLE();/* USER CODE BEGIN RTC_MspInit 1 */HAL_NVIC_SetPriority(RTC_IRQn, 2, 0);HAL_NVIC_EnableIRQ(RTC_IRQn);/* USER CODE END RTC_MspInit 1 */}
}void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)
{if(rtcHandle->Instance==RTC){/* USER CODE BEGIN RTC_MspDeInit 0 *//* USER CODE END RTC_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_RTC_DISABLE();/* RTC interrupt Deinit */HAL_NVIC_DisableIRQ(RTC_IRQn);/* USER CODE BEGIN RTC_MspDeInit 1 *//* USER CODE END RTC_MspDeInit 1 */}
}
  • 重写HAL_RTC_AlarmAEventCallback回调函数,并在函数内调用重置RTC函数

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{TimeRsset();
}
  • RTC校准函数,校准参数由实际硬件测量出

/**
* @brief 校验1HZ RTC频率
*/
void cali_rtc(uint32_t ms)
{uint32_t t = hrtc.Init.SynchPrediv+1;t = t * 1000000/ms;hrtc.Init.SynchPrediv = t;NRF_LOG_INFO("cali=%d\n",hrtc.Init.SynchPrediv );HAL_StatusTypeDef err_code = HAL_RTC_Init(&hrtc);APP_ERROR_CHECK(err_code);
}
  • 在stm32f0xx_it.h中,自定义一个校准状态的枚举变量类型

typedef enum
{CALI_RTC_BEGING_TIME,CALI_RTC_END_TIME,CALI_RTC_FINISH,
}E_CALI_RTC_PROGRESS;
  • 在RTC_IRQHandler中进行时间测量,每秒中断进入后计算实际的时间,得出的时间进行RTC校准

/*** @brief  This function handles RTC Alarm interrupt request.* @param  None* @retval None*/
void RTC_IRQHandler(void)
{HAL_RTC_AlarmIRQHandler(&hrtc);s_wakeup_flag |= TICK_FOR_1HZ;
// NRF_LOG_INFO("RTC_IRQHandler");if(cali_rtc_flag == CALI_RTC_BEGING_TIME){cali_rtc_flag = CALI_RTC_END_TIME;BSP_tim14_init();}else if(cali_rtc_flag==CALI_RTC_END_TIME){cali_rtc_flag = CALI_RTC_FINISH;uint32_t t = BSP_tim14_deinit();cali_rtc(t);
//      NRF_LOG_INFO("RTC_IRQHandler %d\n",t);}

校准步骤:

首先第一次进入RTC中断启动TIM14,第二次中断进入后停止TIM14,2次中断所花的时间作为参数进行RTC 1秒校准参数

  • 如果要定时进行校准,则用如下函数进行定时校

#define CALI_RTC_INTERVAL   6   // 测试6秒钟校验一次,一般1小时以上检验一次
/**
* @brief 每天校验一次
* @note 此函数在1HZ中调用
*/
void start_cali_rtc(void)
{static uint32_t tick_cnt;if(++tick_cnt > CALI_RTC_INTERVAL){tick_cnt = 0;cali_rtc_flag = 0;}
}
  • 在1Hz中调用start_cali_rtc函数,这里每6秒会触发一次RTC校准

/**
* @brief 1Hz handler
*
*/
static void tick_1hz_handler(void)
{if((s_wakeup_flag & TICK_FOR_1HZ) == 0)return;s_wakeup_flag &= CLEAR_TICK_FOR_1HZ;//####################################################################################//---------TODO this to add 1hz event handler-----------start_cali_rtc();}
  • 在main函数中调用1Hz处理函数

/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */RTT_INIT();HAL_Init();SystemClock_Config();BSP_wdt_init(5000);delay_init();MX_RTC_Init();/* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */if(s_wakeup_flag)  //任务处理模式{BSP_wdt_feed();tick_25hz_handler();tick_1hz_handler();}else  // 省电模式{}/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
  • 运行结果,校准后的LSI实际频率为

128*(291+1)= 37376Hz

  • 例程下载链接

https://download.csdn.net/download/mygod2008ok/12522792

STM32F030R8Tx HAL库实现RTC 1秒中断相关推荐

  1. STM32F4 HAL库开发 -- RTC

    一.STM32F407 RTC时钟简介 STM32F407的RTC,是一个独立的BCD定时器/计数器.RTC提供了一个日历时钟(包含年月日时分秒信息).两个可编程闹钟(ALARM A和ALARM B) ...

  2. stm32cubeide外部中断_【STM32】HAL库 STM32CubeMX教程三----外部中断(HAL库GPIO讲解)

    前言 上一节我们讲解了STM32CubeMX的基本使用和工程的配置,那么这一节我们正式来学习CubeMX配置STM32的各个外设功能了 今天我们会详细的带你学习STM32CubeMX配置外部中断,并且 ...

  3. 【HAL库】STM32F407ZGT6实现串口中断发送和接收

    ** [HAL库]STM32F407ZGT6实现串口中断发送和接收 (保姆级教写代码1) ** 前言 根据近期所做的项目,想给大家分享一些有关STM32的各类通信方式的代码教程,都是基于STM32HA ...

  4. STM32CubeMX与HAL库学习--基本定时器定时中断

    STM32CubeMX与HAL库学习--基本定时器定时中断 背景 STM32CubeMX生成初始化代码 在MDK-ARM里编辑代码 其他 背景 本人小白,最近在学着使用STM32CubeMX与HAL库 ...

  5. STM32F103C8T6基于HAL库制作RTC时钟

    目录 一.RTC时钟原理 二.新建工程 三.修改代码 四.烧录运行 参考文献 了解实时时钟RTC的原理.STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块.请编程实现STM32的日历读取. ...

  6. 【STM32】HAL库 STM32CubeMX教程六----定时器中断

    前言: 今天我们来学习定时器,32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等.是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将 ...

  7. 清泉HAL库开发STM32之TIM中断

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.STM32常见定时器资源? 1.定时器和计数器的区别 2.定时器所关注的问题 3.定时器模式下的时钟概念 4.定时 ...

  8. hal库串口dma卡死_STM32 HAL库 串口DMA发送完成中断

    近期使用STM32驱动MAX3485进行485通信,发现STM32F103C8并不自带硬件485首发功能,需要软件上控制IO高低来驱动MAX3485进行485接收.485发送. 根据MAX3485手册 ...

  9. STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)

    STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例) 目录 STM32CubeMX | STM32 F1系列HAL库低功耗 ...

最新文章

  1. 笔记本vista改xp后机器蓝屏的解决办法
  2. 人工智能的挑战远未到来
  3. LCS最长公共子序列
  4. python决策树怎么选择_机器学习|决策树分类与python实现
  5. 一个95分位延迟要求5ms的场景,如何做性能优化
  6. 创建Java动态代理
  7. 手机相机里面的m_2020拍立得相机选购指南 富士乐魔徕卡推荐 总有一款适合你...
  8. 苹果编程套餐更新,新增创意课程,十一拿起吃灰的iPad学起来!
  9. 带动量的随机梯度下降法_梯度下降法(SGD)原理解析及其改进优化算法
  10. poj_3468 伸展树
  11. Ubuntu安装dos2unix命令
  12. 电脑软件单击打开切换为双击打开
  13. java网页制作会说话的汤姆猫_android 仿 会说话的汤姆猫 源码
  14. 解决图像目标检测两框重叠问题
  15. 从黑产情报角度看风控对抗的变化
  16. 代码注释如此沙雕,会玩还是你们程序员!
  17. leyou商城day7 构建商品索引库及查询
  18. 小程序开发--地区选择四级联动(选择省,市,县,镇)
  19. ffmpeg 之 RTSP 一
  20. 云和恩墨2022届春季校招正式启动!

热门文章

  1. python怎么放音乐_[宜配屋]听图阁
  2. 智能网联汽车——网联化
  3. 员工寄件管理流程设计
  4. Q Inventory System unity背包物品插件 使用笔记
  5. Windows服务器如何搭建网站,最全新手建站教程
  6. 风险投资成功案例分析_著名的风投成功案例
  7. 深入理解Render阶段Fiber树的初始化与更新
  8. android框架结构
  9. 蓝桥杯.第几个幸运数字(数学_因子)
  10. android 保存 parcelable对象,Android 使用序列化Serializable和Parcelable