[其他ST产品] STM32F103VET6基于STM32CubeMX RTC时钟报警中断

[复制链接]
1204|21
 楼主| 自动化陈稳 发表于 2022-12-27 16:37 | 显示全部楼层 |阅读模式
本帖最后由 自动化陈稳 于 2022-12-27 16:40 编辑

STM32F103VET6基于STM32CubeMX RTC时钟报警中断使用示例

2602263aaaeb144d09.png
 楼主| 自动化陈稳 发表于 2022-12-27 16:40 | 显示全部楼层
RTC报警中断流程
2984963aaaf7c56c6f.png
 楼主| 自动化陈稳 发表于 2022-12-27 16:41 | 显示全部楼层
业务代码完善

 楼主| 自动化陈稳 发表于 2022-12-27 16:42 | 显示全部楼层
设置报警时间。
 楼主| 自动化陈稳 发表于 2022-12-27 16:45 | 显示全部楼层
此内容为必须项,具体的报警时间可以根据个人需求设置。可以放置在设置RTC初始化函数MX_RTC_Init()中,因为设置时间的时候,同时将报警时间也一同设置进去。
 楼主| 自动化陈稳 发表于 2022-12-27 16:46 | 显示全部楼层
  1. /* USER CODE BEGIN 0 */
  2. extern RTC_AlarmTypeDef alarm;
  3. /* USER CODE END 0 */

  4. RTC_HandleTypeDef hrtc;

  5. /* RTC init function */
  6. void MX_RTC_Init(void)
  7. {

  8.   /* USER CODE BEGIN RTC_Init 0 */
  9. //__HAL_RCC_PWR_CLK_ENABLE();//使能电源时钟 PWR
  10. //HAL_PWR_EnableBkUpAccess();//取消备份区域写保护
  11.   /* USER CODE END RTC_Init 0 */

  12.   RTC_TimeTypeDef sTime = {0};
  13.   RTC_DateTypeDef DateToUpdate = {0};

  14.   /* USER CODE BEGIN RTC_Init 1 */

  15.   /* USER CODE END RTC_Init 1 */

  16.   /** Initialize RTC Only
  17.   */
  18.   hrtc.Instance = RTC;
  19.   hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
  20.   hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
  21.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
  22.   {
  23.                
  24.     Error_Handler();
  25.   }

  26.   /* USER CODE BEGIN Check_RTC_BKUP */

  27.   /* USER CODE END Check_RTC_BKUP */

  28.   /** Initialize RTC and set the Time and Date
  29.   */
  30.   sTime.Hours = 0x10;
  31.   sTime.Minutes = 0x20;
  32.   sTime.Seconds = 0x35;

  33.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  34.   {
  35.     Error_Handler();
  36.   }
  37.   DateToUpdate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
  38.   DateToUpdate.Month = RTC_MONTH_DECEMBER;
  39.   DateToUpdate.Date = 0x22;
  40.   DateToUpdate.Year = 0x22;

  41.   if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
  42.   {
  43.     Error_Handler();
  44.   }
  45.   /* USER CODE BEGIN RTC_Init 2 */
  46.         alarm.Alarm         = RTC_ALARM_A;   //配置闹钟的时间
  47.         alarm.AlarmTime.Hours = 0x10;
  48.         alarm.AlarmTime.Minutes = 0x20;
  49.         alarm.AlarmTime.Seconds = 0x40;
  50.         HAL_RTC_SetAlarm_IT(&hrtc,&alarm,RTC_FORMAT_BCD);
  51.   /* USER CODE END RTC_Init 2 */

  52. }
 楼主| 自动化陈稳 发表于 2022-12-27 16:46 | 显示全部楼层
间隔5秒钟触发一次报警中断。
 楼主| 自动化陈稳 发表于 2022-12-28 10:39 | 显示全部楼层
重写报警中断回调函数。
在main.c文件中,重写报警回调函数。
 楼主| 自动化陈稳 发表于 2022-12-28 10:46 | 显示全部楼层
  1. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
  2. {
  3.     rtc_time_t tim = {0};
  4.         // 获取当前时间
  5.     RTC_GetTime(&tim);

  6.     alarm.AlarmTime.Hours = tim.Hours;
  7.     alarm.AlarmTime.Minutes =tim.Minutes;
  8.     alarm.AlarmTime.Seconds = tim.Seconds + 5;  /* 设置下次闹钟提醒时间是当前时间的5s之后 */
  9.     alarm.Alarm = RTC_ALARM_A;
  10.        
  11.         // 再次启动闹钟中断事件
  12.     if (HAL_RTC_SetAlarm_IT(hrtc, &alarm, RTC_FORMAT_BIN) != HAL_OK)
  13.     {
  14.         Error_Handler();
  15.     }
  16. printf("%02d/%02d/%02d %02d:%02d:%02d %d\r\n", tim.Year, tim.Month, tim.Day, tim.Hours, tim.Minutes, tim.Seconds, tim.WeekDay);
  17.        
  18.                 HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
  19.     printf("HAL_RTC_AlarmAEventCallback\r\n");
  20. //                printf("%02d:%02d:%02d \r\n",alarm.AlarmTime.Hours,alarm.AlarmTime.Minutes,alarm.AlarmTime.Seconds + 5);
  21. }

 楼主| 自动化陈稳 发表于 2022-12-28 10:47 | 显示全部楼层
main主函数代码
  1. #include "stdio.h"
  2. #pragma pack(1)
  3. typedef struct
  4. {
  5.     uint8_t Hours;
  6.     uint8_t Minutes;
  7.     uint8_t Seconds;
  8.     uint8_t WeekDay;
  9.     uint8_t Month;
  10.     uint8_t Day;
  11.     uint8_t Year;
  12. } rtc_time_t;
  13. #pragma pack()

  14. RTC_AlarmTypeDef alarm;


  15. void RTC_GetTime(rtc_time_t* time)
  16. {
  17.     HAL_RTC_GetTime(&hrtc, (RTC_TimeTypeDef *)&time->Hours,   RTC_FORMAT_BIN);
  18.     HAL_RTC_GetDate(&hrtc, (RTC_DateTypeDef *)&time->WeekDay, RTC_FORMAT_BIN);
  19. }
  20. int main(void)
  21. {
  22.   /* USER CODE BEGIN 1 */
  23.   /* USER CODE END 1 */

  24.   /* MCU Configuration--------------------------------------------------------*/

  25.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  26.   HAL_Init();

  27.   /* USER CODE BEGIN Init */

  28.   /* USER CODE END Init */

  29.   /* Configure the system clock */
  30.   SystemClock_Config();

  31.   /* USER CODE BEGIN SysInit */

  32.   /* USER CODE END SysInit */

  33.   /* Initialize all configured peripherals */
  34.   MX_GPIO_Init();

  35.   MX_USART1_UART_Init();
  36.         printf("HAL_RTC_Alarm  TEST\r\n");
  37.           MX_RTC_Init();

  38.   /* USER CODE BEGIN 2 */
  39.   /* USER CODE END 2 */

  40.   /* Infinite loop */
  41.   /* USER CODE BEGIN WHILE */
  42.   while (1)
  43.   {
  44.     /* USER CODE END WHILE */
  45.     /* USER CODE BEGIN 3 */

  46.   }
  47.   /* USER CODE END 3 */
  48. }
 楼主| 自动化陈稳 发表于 2022-12-28 10:50 | 显示全部楼层
串口打印信息
3962463abaeef757e4.png
 楼主| 自动化陈稳 发表于 2022-12-28 10:51 | 显示全部楼层
程序源码:
链接:https://pan.baidu.com/s/1C9V-sV9x9B51Quhsz8dLnw
提取码:oirm
jkl21 发表于 2023-1-5 13:01 | 显示全部楼层
设置的RTC不能保存,怎么回事?
mikewalpole 发表于 2023-1-6 13:46 | 显示全部楼层
网上有很多的资料可以参考和学习的。
wwppd 发表于 2023-1-6 18:32 | 显示全部楼层
STM32CubeMX开发简单多了。
sesefadou 发表于 2023-1-6 20:54 | 显示全部楼层
这个是可以设置秒中断的吗?              
macpherson 发表于 2023-1-7 17:30 | 显示全部楼层
这个RTC设置有时候错误的。              
pixhw 发表于 2023-1-12 11:15 | 显示全部楼层
时钟的闹钟设置。              
pl202 发表于 2023-1-14 16:37 | 显示全部楼层
STM32CubeMX的时间保存失败
uiint 发表于 2023-1-16 14:54 | 显示全部楼层
怎么设置多个闹钟呢?              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

106

主题

1380

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部