f103 hal RTC_alarm使用方法

2023-05-16

1.初始化RTC

RTC_handle.Instance = RTC;
RTC_handle.Lock = HAL_UNLOCKED;
RTC_handle.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
RTC_handle.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
	
if(HAL_RTC_Init(&RTC_handle) != HAL_OK)
{
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}

2.重写HAL_RTC_MspInit()函数

void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{
  RCC_OscInitTypeDef        RCC_OscInitStruct;
  RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;
  
  /*##-1- Enables the PWR Clock and Enables access to the backup domain ###################################*/
  /* To change the source clock of the RTC feature (LSE, LSI), You have to:
     - Enable the power clock using __HAL_RCC_PWR_CLK_ENABLE()
     - Enable write access using HAL_PWR_EnableBkUpAccess() function before to 
       configure the RTC clock source (to be done once after reset).
     - Reset the Back up Domain using __HAL_RCC_BACKUPRESET_FORCE() and 
       __HAL_RCC_BACKUPRESET_RELEASE().
     - Configure the needed RTC clock source */
  __HAL_RCC_PWR_CLK_ENABLE();
  HAL_PWR_EnableBkUpAccess();

  /*##-2- Configue LSE/LSI as RTC clock soucre ###############################*/
#ifdef RTC_CLOCK_SOURCE_LSE  
  RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
  if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  { 
  }
  
  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
  if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  { 
  }
#elif defined (RTC_CLOCK_SOURCE_LSI)  
  RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
  if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  { 
  }

  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
  if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  { 
  }
#else
#error Please select the RTC Clock source inside the main.h file
#endif /*RTC_CLOCK_SOURCE_LSE*/
  
  /*##-2- Enable RTC peripheral Clocks #######################################*/ 
  /* Enable RTC Clock */ 
  __HAL_RCC_RTC_ENABLE(); 
  
  /*##-4- Configure the NVIC for RTC Alarm ###################################*/
  HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0x0F, 0);
  HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);

}

3.定义用哪一个时钟源

可以定义在main.h文件中

//#define RTC_CLOCK_SOURCE_LSI
#define RTC_CLOCK_SOURCE_LSE

4.配置时间和闹钟

date.Year 		= 0x20;
date.Month 		= RTC_MONTH_JUNE;
date.Date  		= 0x30;
date.WeekDay	= RTC_WEEKDAY_TUESDAY;
	
if(HAL_RTC_SetDate(&RTC_handle,&date,RTC_FORMAT_BCD)!= HAL_OK)
{
	//HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}
	
time.Hours 		= 0x15;
time.Minutes 	= 0x10;
ime.Seconds  = 0x00;
	
if(HAL_RTC_SetTime(&RTC_handle,&time,RTC_FORMAT_BCD)!= HAL_OK)
{
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}
	
alarm.Alarm 	= RTC_ALARM_A;   //配置闹钟的时间
alarm.AlarmTime.Hours = 0x15;
alarm.AlarmTime.Minutes = 0x10;
alarm.AlarmTime.Seconds = 0x05;
HAL_RTC_SetAlarm_IT(&RTC_handle,&alarm,RTC_FORMAT_BCD);

5.重写RTC_Alarm_IRQHandler

让其进去HAL_RTC_AlarmIRQHandler()

void RTC_Alarm_IRQHandler(void)
{
  HAL_RTC_AlarmIRQHandler(&RTC_handle);
}

6.重写HAL_RTC_AlarmAEventCallback()函数

进入闹钟中断执行里面的代码段。

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
	HAL_RTC_GetTime(&RTC_handle,&time,RTC_FORMAT_BCD);
	/*if(date.Year == 0x20)
	{*/
		HAL_UART_Transmit(&UART_initStruct, (uint8_t*)&time.Seconds, 1,1000);
}

7.整份代码

#include "rtc.h"

RTC_HandleTypeDef RTC_handle;

RTC_DateTypeDef date;
RTC_TimeTypeDef time;
RTC_AlarmTypeDef alarm;

void RTC_Init(void)
{
	RTC_handle.Instance = RTC;
	RTC_handle.Lock = HAL_UNLOCKED;
	RTC_handle.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
	RTC_handle.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
	
	if(HAL_RTC_Init(&RTC_handle) != HAL_OK)
	{
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
	}
	
	
	
}

void RTC_alarmconfig(void)
{

	
	date.Year 		= 0x20;
	date.Month 		= RTC_MONTH_JUNE;
	date.Date  		= 0x30;
	date.WeekDay	= RTC_WEEKDAY_TUESDAY;
	
	if(HAL_RTC_SetDate(&RTC_handle,&date,RTC_FORMAT_BCD)!= HAL_OK)
	{
		//HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
	}
	
	time.Hours 		= 0x15;
	time.Minutes 	= 0x10;
	time.Seconds  = 0x00;
	
	if(HAL_RTC_SetTime(&RTC_handle,&time,RTC_FORMAT_BCD)!= HAL_OK)
	{
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
	}
	
	alarm.Alarm 	= RTC_ALARM_A;
	alarm.AlarmTime.Hours = 0x15;
	alarm.AlarmTime.Minutes = 0x10;
	alarm.AlarmTime.Seconds = 0x05;
	HAL_RTC_SetAlarm_IT(&RTC_handle,&alarm,RTC_FORMAT_BCD);
	
	
	
}

void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{
  RCC_OscInitTypeDef        RCC_OscInitStruct;
  RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;
  
  /*##-1- Enables the PWR Clock and Enables access to the backup domain ###################################*/
  /* To change the source clock of the RTC feature (LSE, LSI), You have to:
     - Enable the power clock using __HAL_RCC_PWR_CLK_ENABLE()
     - Enable write access using HAL_PWR_EnableBkUpAccess() function before to 
       configure the RTC clock source (to be done once after reset).
     - Reset the Back up Domain using __HAL_RCC_BACKUPRESET_FORCE() and 
       __HAL_RCC_BACKUPRESET_RELEASE().
     - Configure the needed RTC clock source */
  __HAL_RCC_PWR_CLK_ENABLE();
  HAL_PWR_EnableBkUpAccess();

  /*##-2- Configue LSE/LSI as RTC clock soucre ###############################*/
#ifdef RTC_CLOCK_SOURCE_LSE  
  RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
  if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  { 
  }
  
  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
  if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  { 
  }
#elif defined (RTC_CLOCK_SOURCE_LSI)  
  RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
  if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  { 
  }

  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
  if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  { 
  }
#else
#error Please select the RTC Clock source inside the main.h file
#endif /*RTC_CLOCK_SOURCE_LSE*/
  
  /*##-2- Enable RTC peripheral Clocks #######################################*/ 
  /* Enable RTC Clock */ 
  __HAL_RCC_RTC_ENABLE(); 
  
  /*##-4- Configure the NVIC for RTC Alarm ###################################*/
  HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0x0F, 0);
  HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);

}

void RTC_Alarm_IRQHandler(void)
{
  HAL_RTC_AlarmIRQHandler(&RTC_handle);
}

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
	HAL_RTC_GetTime(&RTC_handle,&time,RTC_FORMAT_BCD);
	/*if(date.Year == 0x20)
	{*/
		HAL_UART_Transmit(&UART_initStruct, (uint8_t*)&time.Seconds, 1,1000);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

f103 hal RTC_alarm使用方法 的相关文章

  • HAL_DMA_IRQHandler()代码详细分析

    这里使用ADC1联动DMA1 xff0c 开启半传输中断 传输中断 debug时 xff0c dma也一直在工作 xff0c 所以半传输中断 传输中断会同时生效 1 adc1使用了DMA1 Stream0 xff0c Instance表示如
  • STM32 HAL 串口收发(无DMA,中断接收)

    STM32CUBE配置 一 使用printf发送数据 xff0c 在usart c中添加代码串口重定向 USER CODE BEGIN 0 include lt stdio h gt ifdef GNUC define PUTCHAR PR
  • 【STM32】HAL库-串口USART

    USART简介 通用同步异步收发器 USART 提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换 USART利用分数波特率发生器提供宽范围的波特率选择 一个波特率寄存器 USART BRR xff0c
  • 使用HAL库开发STM32:系统时间基础及进阶使用

    文章目录 目的 基础使用 进阶使用 总结 目的 HAL库默认提供了系统时间 系统时间默认情况下由SysTick定时器计数产生 系统时间一方面用于HAL库自身调用 另一方面用户也可以使用 为开发带来便利 本文提到的相关使用主要应用于未使用OS
  • 深入理解 TCP 拥塞控制

    随着网络技术的飞速发展 越来越多的工作依赖网络完成 基于互联网的实时通信系统的质量和实时性也很大程度也依赖于网络质量 然而 在Internet的TCP IP体系结构中 拥塞的发生是其固有的属性 网络拥塞是指用户对网络资源 包括链路带宽 存储
  • 拥抱国产化,推动产业互联网,拍乐云做了什么?

    新一轮科学技术进步法的修订中提出要健全科技创新保障措施 完善创新体系 为促进实现高水平科技自立自强提供法治保障 随着国家对信息安全 科学自主的要求越来越高 音视频技术作为视频会议 应急指挥 办公协同 远程银行等行业场景的基础技术支撑 其独立
  • 翻斗式雨量计的组成与工作原理

    雨量计也叫雨量记录仪 量雨计 测雨计 是常规的气象检测仪器 气象部门通过它来监测计量降雨量和降雨强度 常见的有虹吸式雨量计 翻斗式雨量计和称重式雨量计等 因为翻斗式雨量计方便携带安装 数据相对精确 因此在农业气象监测中广泛应用 1 翻斗式雨
  • 深入解析QUIC协议

    QUIC Quick UDP Internet Connection 是Google提出的一个基于UDP的传输协议 因其高效的传输效率和多路并发的能力 已经成为下一代互联网协议HTTP 3的底层传输协议 除了应用于Web领域 它的优势同样适
  • 拍乐云首发音视频「分组讨论」开放能力,开启线上群聊互动新玩法

    苹果CEO库克近日宣布 因疫情反复 苹果将无限期推迟员工重返办公室计划 疫情常态化之下 在线工作 在线学习 在线娱乐也都变得常态化 我们似乎开始接受这种 All in在线 的模式 并对在线互动的体验提出了更高要求 当我们想要实现一个校招的网
  • 多普勒超声波流量计工作原理及优缺点

    多普勒超声波流量计是是利用声波在流体中传播的多普勒效应 通过测定流体中运动粒子散射声波的多普勒频移 即可得到流体的速度 结合内置压力式水位计 利用速度面积法 即可测量液体的流量 适合于明渠 河道及难以建造标准断面的流速流量测量以及于各种满管
  • 智能图像水位识别系统的工作原理

    系统组成 智能水位图像识别系统主要包括前端设备 传输网络 平台软件和显示终端 采用定时抓拍和自主抓拍图像两种形式 定时或根据需要上传水尺图片 前端设备主要包括网络高速摄像机 水尺 4G流量卡 传输网络主要通过4G网络传输至信息中心 在信息中
  • 土壤含水量仪的监测方法

    土壤含水量监测仪对土壤内部水分含量情况进行监测 可实现对灾害隐患点土壤含水量的长期实时监测 仪器主机采用低功耗设计 工作功耗可达毫瓦级 根据滑坡隐患点的特点 仪器主机采用多通道设计 可根据实际情况接驳1 4路土壤含水量传感器对监测点不同深度
  • 使用 RTC 源代码管理获取已更改文件的文件名、位置和作者

    我正在尝试访问给定流的已更改文件的文件名 位置和作者 下面的代码是我到目前为止所拥有的 看看api文档 这似乎不可能 这可以使用 java api 或其他方法来实现吗 IChangeSetSearchCriteria c IChangeSe
  • 我想设置每天不同时间触发的重复闹钟

    我需要每天日出时触发闹钟 我得到的日出时间是这样的 06 55 Location location new Location latitude longitude SunriseSunsetCalculator calculator new
  • 从挂起的 Intent 启动的 Intent getExtra

    我试图在用户从列表中选择带有时间的内容后发出一些警报 并在给定时间为其创建通知 我的问题是广播接收器无法接收我的 Intent 上的 putExtra 的 showname 它总是得到空值 这是我大多数意图的做法 但我认为这次可能是因为pe
  • 如何使用纯 java api 更改 RTC 流和组件所有权?

    我需要更改组件和流的所有权 我正在尝试查找任何用于此目的的 API 请帮忙 这里我有一个代码片段 但我不知道它是如何工作的 IScmService scmService null IRepositoryItemService itemSer
  • 安卓。警报管理器在奇怪的时间触发

    我使用以下代码设置重复闹钟 每 5 分钟一次 public void SetAlarm Context context AlarmManager am AlarmManager context getSystemService Contex
  • 当 Perl 中发生警报时,我应该如何清理挂起的孙进程?

    我有一个并行自动化脚本 需要调用许多其他脚本 其中一些脚本挂起 因为它们 错误地 等待标准输入或等待各种其他不会发生的事情 这没什么大不了的 因为我抓住那些alarm http perldoc perl org functions alar
  • 如何用 swift 创建一个闹钟应用程序?

    我正在尝试用 swift 创建一种闹钟应用程序 但我不知道如何设置闹钟模型 我试过了UILocalnotification但我不希望我的用户除了设置闹钟之外参与闹钟应用程序的流程 然后尝试了NSTimer and NSRunloop等等 但
  • 重新安装应用程序后 UILocalNotification 触发

    我的应用程序有一个使用 UILocalNotification 的闹钟功能 并且效果很好 但是 如果用户卸载该应用程序 然后重新安装它 他将立即收到所有 中间 通知 我曾尝试致电 UIApplication sharedApplicatio

随机推荐