zoukankan      html  css  js  c++  java
  • STM32L053基于LL库、HAL库两种库RTC闹钟唤醒

    STM32L053闹钟唤醒:
    设置实现原理,当闹钟时间==日历时间时,闹钟中断产生,但是闹钟中断与外部中断线17相连,所以如果不初始化外部中断线17,则无法进入RTC中断服务函数。
    目的:实现毫米级闹钟中断唤醒睡眠模式
    设置日历时间=闹钟时间,启用闹钟的亚秒寄存器,用亚秒寄存器产生毫秒级的计时
    进入中断之后,再重新设置日历时间=闹钟时间。
    注意:中断之中也要清除外部中断标志

    1. HAL库
    RTC_HandleTypeDef hrtc;
    RTC_TimeTypeDef sTime = {0};
    RTC_AlarmTypeDef sAlarm = {0};
    
    
    /**
      * @brief  RTC中断初始化,用于睡眠定时唤醒
      * @param  
      * @retval 
      */
    void rtc_INT_init(uint16_t ms)
    {
      hrtc.Instance = RTC;
      hrtc.Init.HourFormat = RTC_HOURFORMAT_24;						//LL_RTC_SetHourFormat(RTC_TypeDef *RTCx, uint32_t HourFormat);
      hrtc.Init.AsynchPrediv = 36;												//LL_RTC_SetAsynchPrescaler(RTC_TypeDef *RTCx, uint32_t AsynchPrescaler);
      hrtc.Init.SynchPrediv = ms;													//LL_RTC_SetSynchPrescaler(RTC_TypeDef *RTCx, uint32_t SynchPrescaler);
      hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;							//
      hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;			//LL_RTC_DisableOutRemap(RTC_TypeDef *RTCx);
      hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;//LL_RTC_SetOutputPolarity(RTC_TypeDef *RTCx, uint32_t Polarity);
      hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;		//LL_RTC_SetAlarmOutputType(RTC_TypeDef *RTCx, uint32_t Output);
      HAL_RTC_Init(&hrtc);	
    
    
      /** Initialize RTC and set the Time
      */
      sTime.Hours = 0x08;																	//LL_RTC_TIME_SetHour(RTC_TypeDef *RTCx, uint32_t Hours)
      sTime.Minutes = 0x30;																//LL_RTC_TIME_SetMinute(RTC_TypeDef *RTCx, uint32_t Minutes)
      sTime.Seconds = 0x10;																//LL_RTC_TIME_SetSecond(RTC_TypeDef *RTCx, uint32_t Seconds)
      sTime.TimeFormat = RTC_HOURFORMAT12_AM;							//LL_RTC_TIME_SetFormat(RTC_TypeDef *RTCx, uint32_t TimeFormat);
      sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE ;		//LL_RTC_TIME_DisableDayLightStore(RTC_TypeDef *RTCx)
      sTime.StoreOperation = RTC_STOREOPERATION_RESET;		//
      HAL_RTC_SetTime(&hrtc,&sTime,RTC_FORMAT_BCD);
    	
      /** Enable the Alarm A 
      */
      sAlarm.Alarm = RTC_ALARM_A;													//LL_RTC_ALMA_Enable(RTC_TypeDef *RTCx)
      sAlarm.AlarmDateWeekDay = RTC_WEEKDAY_MONDAY;				//LL_RTC_ALMA_SetWeekDay(RTC_TypeDef *RTCx, uint32_t WeekDay)
      sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY;
      sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY;				//LL_RTC_ALMA_SetMask(RTC_TypeDef *RTCx, uint32_t Mask)	
      sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;//LL_RTC_ALMA_SetSubSecondMask(RTC_TypeDef *RTCx, uint32_t Mask)
      sAlarm.AlarmTime.TimeFormat = RTC_HOURFORMAT12_AM;	//LL_RTC_ALMA_SetTimeFormat(RTC_TypeDef *RTCx, uint32_t TimeFormat);
      sAlarm.AlarmTime.Hours = 0x08;											//LL_RTC_ALMA_SetHour(RTC_TypeDef *RTCx, uint32_t Hours)
      sAlarm.AlarmTime.Minutes = 0x30;										//LL_RTC_ALMA_SetMinute(RTC_TypeDef *RTCx, uint32_t Minutes)
      sAlarm.AlarmTime.Seconds = 0x10;										//LL_RTC_ALMA_SetSecond(RTC_TypeDef *RTCx, uint32_t Seconds)
      sAlarm.AlarmTime.SubSeconds = 1;										//LL_RTC_ALMA_SetSubSecond(RTC_TypeDef *RTCx, uint32_t Subsecond)
      HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,RTC_FORMAT_BCD);
    	
    	HAL_NVIC_SetPriority(RTC_IRQn, 0, 0);
      HAL_NVIC_EnableIRQ(RTC_IRQn);
    	
    	__HAL_RCC_RTC_ENABLE();															//LL_RTC_EnableIT_ALRA(RTC_TypeDef *RTCx)
    }
    
    
    void RTC_IRQHandler(void)
    {
      /* USER CODE BEGIN RTC_IRQn 0 */
    	
      /* USER CODE END RTC_IRQn 0 */
      HAL_RTC_AlarmIRQHandler(&hrtc);
      /* USER CODE BEGIN RTC_IRQn 1 */
    
      /* USER CODE END RTC_IRQn 1 */
    }
    
    uint32_t count=0;
    /* USER CODE BEGIN 1 */
    void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
    {
    	count++;
    	debug_print(0, "Enter Count%d
    ",count);
    	HAL_RTC_SetTime(hrtc, &sTime, RTC_FORMAT_BCD);
    }
    
    1. LL库
    void rtc_INT_init(uint16_t ms)
    {
    	LL_RTC_InitTypeDef RTC_InitStruct = {0};
      LL_RTC_TimeTypeDef RTC_TimeStruct = {0};
      LL_RTC_AlarmTypeDef RTC_AlarmStruct = {0};
    	LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
    	LL_RTC_TimeTypeDef RTC_ALMA_InitStruct = {0};
    	
    	LL_RCC_EnableRTC();
    	
    	NVIC_SetPriority(RTC_IRQn, 2);
      NVIC_EnableIRQ(RTC_IRQn);
    	
    	
      /**/
    	EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_17;
      EXTI_InitStruct.LineCommand = ENABLE;
      EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
      EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
      LL_EXTI_Init(&EXTI_InitStruct);
    	
    	RTC_InitStruct.HourFormat=LL_RTC_HOURFORMAT_24HOUR;
    	RTC_InitStruct.AsynchPrescaler=36;
    	RTC_InitStruct.SynchPrescaler=ms;
    	LL_RTC_Init(RTC, &RTC_InitStruct);
    	
    	RTC_TimeStruct.TimeFormat=LL_RTC_TIME_FORMAT_AM_OR_24;
    	RTC_TimeStruct.Hours=0x8;
    	RTC_TimeStruct.Minutes=0x30;
    	RTC_TimeStruct.Seconds=0x10;
    	LL_RTC_TIME_Init(RTC, LL_RTC_FORMAT_BCD, &RTC_TimeStruct);
    	
    	RTC_ALMA_InitStruct.TimeFormat=LL_RTC_TIME_FORMAT_AM_OR_24;
    	RTC_ALMA_InitStruct.Hours=0x8;
    	RTC_ALMA_InitStruct.Minutes=0x30;
    	RTC_ALMA_InitStruct.Seconds=0x10;
    	LL_RTC_TIME_Init(RTC, LL_RTC_FORMAT_BCD, &RTC_ALMA_InitStruct);
    	
    	RTC_AlarmStruct.AlarmDateWeekDay=RTC_WEEKDAY_MONDAY;
    	RTC_AlarmStruct.AlarmDateWeekDaySel=LL_RTC_ALMA_DATEWEEKDAYSEL_WEEKDAY;
    	RTC_AlarmStruct.AlarmMask=LL_RTC_ALMA_MASK_DATEWEEKDAY;
    	RTC_AlarmStruct.AlarmTime=RTC_ALMA_InitStruct;
    	LL_RTC_ALMA_Init(RTC, LL_RTC_FORMAT_BCD, &RTC_AlarmStruct);
    
    	
    	LL_RTC_DisableWriteProtection(RTC);
    	LL_RTC_ALMA_SetSubSecond(RTC, 1);
    	LL_RTC_ALMA_SetMask(RTC, LL_RTC_ALMA_MASK_DATEWEEKDAY);
    	LL_RTC_ALMA_SetSubSecondMask(RTC, 0xF);
    	
    	LL_RTC_ALMA_Enable(RTC);
    	LL_RTC_EnableIT_ALRA(RTC);
    	LL_RTC_EnableWriteProtection(RTC);
    }
    
    
    void RTC_IRQHandler(void)
    {
    	LL_RTC_TimeTypeDef RTC_RstTimeStruct = {0};
    	if(LL_RTC_IsActiveFlag_ALRA(RTC))
    	{
    		printf("IRQn WKUP Timer Enter...
    ");
    		LL_RTC_ClearFlag_ALRA(RTC);
    		LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_17);
    	}
    	RTC_RstTimeStruct.TimeFormat=LL_RTC_TIME_FORMAT_AM_OR_24;
    	RTC_RstTimeStruct.Hours=0x8;
    	RTC_RstTimeStruct.Minutes=0x30;
    	RTC_RstTimeStruct.Seconds=0x10;
    	LL_RTC_TIME_Init(RTC, LL_RTC_FORMAT_BCD, &RTC_RstTimeStruct);
    }
    

    学习资料链接

  • 相关阅读:
    mysql-5.7(centos-6.9环境)源码安装
    Oracle 11g 体系结构思维导图
    my.cnf 配置文件参数优化
    职业生涯规划
    技能栈规划图
    操作文档 Oracle 11g (CentOS7.2环境) 静默安装
    oracle 静默安装响应文件 参数说明
    oracle em企业管理器的安装、配置及相关问题
    大数据第51天—Mysql练习题12道之六-今年10月份第一次购买商品的金额-杨大伟
    大数据第50天—Mysql练习题12道之五-活跃用户的总数-杨大伟
  • 原文地址:https://www.cnblogs.com/hhsxy/p/14018377.html
Copyright © 2011-2022 走看看