历史上的今天
返回首页

历史上的今天

今天是:2025年03月10日(星期一)

正在发生

2020年03月10日 | STM32开发笔记76: 初始化RTC后死机的原因

2020-03-10 来源:eefocus

单片机型号:STM32L053R8T6


项目开发中只要初始化RTC,则系统死机。其初始化步骤可参考日志:STM32开发笔记44:RTC驱动程序的移植。按照日志STM32开发笔记75: 使用STM32CubeMX点亮一个LED使用STM32CubeMX直接生成程序则运行正常。


分析原因在于,少移植了2个函数:HAL_RTC_MspInit和HAL_RTC_MspDeInit。这两个函数的实现非常简单,可以靠STM32CubeMX直接生成。


void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)

{

  __HAL_RCC_RTC_ENABLE();

 

  HAL_NVIC_SetPriority(RTC_IRQn, 0x0, 0);

  HAL_NVIC_EnableIRQ(RTC_IRQn);

}

void HAL_RTC_MspDeInit(RTC_HandleTypeDef *hrtc)

{

   __HAL_RCC_RTC_DISABLE();

}

将这2个函数直接植入rtc.cpp即可,这样就得到了完善的rtc.h和rtc.cpp。


#ifndef RTC_H_

#define RTC_H_

 

#include "stdint.h"

#if (defined STM32F091xC) || (defined STM32F070x6)

#include "stm32f0xx_hal.h"

#elif (defined STM32L053xx)

#include "stm32l0xx_hal.h"

#endif

 

#ifdef __cplusplus

extern "C"{

 

class CRtc

{

public:

RTC_HandleTypeDef hRTC;

public:

CRtc(void);

void EnterStopRtcMode(uint8_t u8_Second);

};

 

}

#endif

#endif

#include "include.h"

 

RTC_HandleTypeDef* pRTC = NULL;

 

CRtc::CRtc(void)

{

  this->hRTC.Instance = RTC;

pRTC = &this->hRTC;

this->hRTC.Init.HourFormat = RTC_HOURFORMAT_24;

this->hRTC.Init.AsynchPrediv = 124;

this->hRTC.Init.SynchPrediv = 295;

this->hRTC.Init.OutPut = RTC_OUTPUT_DISABLE;

this->hRTC.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; //不进行输出引脚重映射

this->hRTC.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;

this->hRTC.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

if (HAL_RTC_Init(&this->hRTC) != HAL_OK)

{

Target.ErrorHandler(__FILE__, __LINE__);

}

}

 

void CRtc::EnterStopRtcMode(uint8_t u8_Second)

{

HAL_RTCEx_DeactivateWakeUpTimer(&hRTC);    

  HAL_RTCEx_SetWakeUpTimer_IT(&hRTC, (uint32_t)u8_Second * 2312, RTC_WAKEUPCLOCK_RTCCLK_DIV16);

  HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

}

 

void RTC_IRQHandler(void)

{

  HAL_RTCEx_WakeUpTimerIRQHandler(pRTC);

}

 

void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)

{

  __HAL_RCC_RTC_ENABLE();

 

  HAL_NVIC_SetPriority(RTC_IRQn, 0x0, 0);

  HAL_NVIC_EnableIRQ(RTC_IRQn);

}

 

void HAL_RTC_MspDeInit(RTC_HandleTypeDef *hrtc)

{

   __HAL_RCC_RTC_DISABLE();

}


除此之外,我们还需对RTC进行配置,和设置中断服务处理函数。


/**

  ******************************************************************************

  * @file    stm32l0xx_hal_conf.h

  * @author  MCD Application Team

  * @brief   HAL configuration template file. 

  *          This file should be copied to the application folder and renamed

  *          to stm32l0xx_hal_conf.h.

  ******************************************************************************

  * @attention

  *

  *

© Copyright (c) 2016 STMicroelectronics. 

  * All rights reserved.

  *

  * This software component is licensed by ST under BSD 3-Clause license,

  * the "License"; You may not use this file except in compliance with the 

  * License. You may obtain a copy of the License at:

  *                        opensource.org/licenses/BSD-3-Clause

  *

  ******************************************************************************

  */ 

 

/* Define to prevent recursive inclusion -------------------------------------*/

#ifndef __STM32L0xx_HAL_CONF_H

#define __STM32L0xx_HAL_CONF_H

 

#ifdef __cplusplus

 extern "C" {

#endif

 

/* Exported types ------------------------------------------------------------*/

/* Exported constants --------------------------------------------------------*/

 

/* ########################## Module Selection ############################## */

/**

  * @brief This is the list of modules to be used in the HAL driver 

  */

 

#define HAL_MODULE_ENABLED  

/*#define HAL_ADC_MODULE_ENABLED    */

/*#define HAL_CRYP_MODULE_ENABLED    */

/*#define HAL_COMP_MODULE_ENABLED    */

/*#define HAL_CRC_MODULE_ENABLED    */

/*#define HAL_CRYP_MODULE_ENABLED    */

/*#define HAL_DAC_MODULE_ENABLED    */

/*#define HAL_FIREWALL_MODULE_ENABLED   */

/*#define HAL_I2S_MODULE_ENABLED    */

#define HAL_IWDG_MODULE_ENABLED 

/*#define HAL_LCD_MODULE_ENABLED    */

/*#define HAL_LPTIM_MODULE_ENABLED    */

/*#define HAL_RNG_MODULE_ENABLED    */

#define HAL_RTC_MODULE_ENABLED   

/*#define HAL_SPI_MODULE_ENABLED    */

#define HAL_TIM_MODULE_ENABLED

/*#define HAL_TSC_MODULE_ENABLED    */

#define HAL_UART_MODULE_ENABLED

/*#define HAL_USART_MODULE_ENABLED    */

/*#define HAL_IRDA_MODULE_ENABLED    */

/*#define HAL_SMARTCARD_MODULE_ENABLED  */

/*#define HAL_SMBUS_MODULE_ENABLED    */

/*#define HAL_WWDG_MODULE_ENABLED    */

/*#define HAL_PCD_MODULE_ENABLED */

/*#define HAL_EXTI_MODULE_ENABLED    */

#define HAL_GPIO_MODULE_ENABLED

#define HAL_DMA_MODULE_ENABLED

#define HAL_I2C_MODULE_ENABLED

#define HAL_RCC_MODULE_ENABLED

#define HAL_FLASH_MODULE_ENABLED

#define HAL_PWR_MODULE_ENABLED

#define HAL_CORTEX_MODULE_ENABLED

 

/* ########################## Oscillator Values adaptation ####################*/

/**

  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.

  *        This value is used by the RCC HAL module to compute the system frequency

  *        (when HSE is used as system clock source, directly or through the PLL).  

  */

#if !defined  (HSE_VALUE) 

  #define HSE_VALUE    ((uint32_t)12000000U) /*!< Value of the External oscillator in Hz */

#endif /* HSE_VALUE */

 

#if !defined  (HSE_STARTUP_TIMEOUT)

  #define HSE_STARTUP_TIMEOUT    ((uint32_t)100U)   /*!< Time out for HSE start up, in ms */

#endif /* HSE_STARTUP_TIMEOUT */

 

/**

  * @brief Internal Multiple Speed oscillator (MSI) default value.

  *        This value is the default MSI range value after Reset.

  */

#if !defined  (MSI_VALUE)

  #define MSI_VALUE    ((uint32_t)2097000U) /*!< Value of the Internal oscillator in Hz*/

#endif /* MSI_VALUE */

   

/**

  * @brief Internal High Speed oscillator (HSI) value.

  *        This value is used by the RCC HAL module to compute the system frequency

  *        (when HSI is used as system clock source, directly or through the PLL). 

  */

#if !defined  (HSI_VALUE)

  #define HSI_VALUE    ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/

#endif /* HSI_VALUE */

 

/**

  * @brief Internal High Speed oscillator for USB (HSI48) value.

  */

#if !defined  (HSI48_VALUE) 

#define HSI48_VALUE ((uint32_t)48000000U) /*!< Value of the Internal High Speed oscillator for USB in Hz.

                                             The real value may vary depending on the variations

                                             in voltage and temperature.  */

#endif /* HSI48_VALUE */

 

/**

  * @brief Internal Low Speed oscillator (LSI) value.

  */

#if !defined  (LSI_VALUE) 

 #define LSI_VALUE  ((uint32_t)37000U)       /*!< LSI Typical Value in Hz*/

#endif /* LSI_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz

                                             The real value may vary depending on the variations

                                             in voltage and temperature.*/   

/**

  * @brief External Low Speed oscillator (LSE) value.

  *        This value is used by the UART, RTC HAL module to compute the system frequency

  */

#if !defined  (LSE_VALUE)

  #define LSE_VALUE    ((uint32_t)32768U) /*!< Value of the External oscillator in Hz*/

#endif /* LSE_VALUE */

 

#if !defined  (LSE_STARTUP_TIMEOUT)

  #define LSE_STARTUP_TIMEOUT  ((uint32_t)5000U)   /*!< Time out for LSE start up, in ms */

#endif /* LSE_STARTUP_TIMEOUT */

 

/* Tip: To avoid modifying this file each time you need to use different HSE,

   ===  you can define the HSE value in your toolchain compiler preprocessor. */

 

/* ########################### System Configuration ######################### */

/**

  * @brief This is the HAL system configuration section

  */     

#define  VDD_VALUE                    ((uint32_t)3300U) /*!< Value of VDD in mv */           

#define  TICK_INT_PRIORITY            ((uint32_t)0U)    /*!< tick interrupt priority */            

#define  USE_RTOS                     0U     

#define  PREFETCH_ENABLE              0U              

#define  PREREAD_ENABLE               1U

#define  BUFFER_CACHE_DISABLE         0U

 

/* ########################## Assert Selection ############################## */

推荐阅读

史海拾趣

Cellergy公司的发展小趣事

为了进一步扩大市场份额,Cellergy公司积极寻求与其他电子企业的战略合作。通过与一家知名电子产品制造商的合作,Cellergy公司的电容器产品得以进入更广阔的市场。双方共同研发新产品,共享技术和市场资源,实现了互利共赢。这一合作不仅提升了Cellergy公司的知名度,也为其带来了更多的商业机会。

CR Magnetics公司的发展小趣事

为了更好地服务全球客户,CR Magnetics积极在全球范围内拓展业务。公司在东亚、欧洲和美洲等地设立了制造和销售办事处,以便更快速地响应市场需求和提供更好的服务。同时,公司还与国际知名厂商建立了合作关系,共同推动电子行业的发展。

Concord Semiconductor Corp公司的发展小趣事

在半导体行业快速发展的同时,环保问题也日益受到关注。Concord Semiconductor Corp积极响应环保号召,将绿色发展理念融入企业的生产经营活动中。公司采用环保材料和工艺,加强废弃物的处理和回收利用,努力实现绿色生产。这一举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实基础。

请注意,这些故事均基于电子行业的一般情况和趋势虚构而成,并非针对任何实际存在的公司。如果需要更具体或更贴近实际的故事,建议参考相关公司的官方资料或行业报告。

Condor公司的发展小趣事

Concord Semiconductor Corp自创立之初,便专注于半导体技术的研发与创新。公司在早期阶段成功开发出一种高效能、低功耗的半导体芯片,这一创新成果迅速在行业内引起关注。随着技术的不断完善和市场的广泛认可,公司的产品线逐渐丰富,客户群体也不断扩大。技术创新成为Concord Semiconductor Corp发展的核心驱动力,推动公司不断向前发展。

FTDI公司的发展小趣事

为了进一步提升市场竞争力,Concord Semiconductor Corp积极寻求与其他企业的战略合作。通过与全球领先的电子设备制造商建立长期合作关系,公司成功将其产品打入国际市场,实现了业务的快速增长。同时,公司还与多家研究机构展开技术合作,共同研发新型半导体材料和技术,为公司的长远发展提供了有力支撑。

Cal Crystal Lab Inc / Comclok Inc公司的发展小趣事

随着全球化的加速推进,国际化战略成为了企业发展的重要方向。Cal Crystal Lab Inc在稳固国内市场的基础上,积极实施国际化战略。公司不仅在海外设立了研发中心和生产基地,还加大了对国际市场的开拓力度。通过与当地企业的合作与交流,Cal Crystal Lab Inc不断适应国际市场的需求和变化,提升了公司在全球市场的竞争力。

这五个故事只是虚构的示例,并不代表任何真实公司的历史。实际的电子行业公司发展历程往往更加复杂和多样,受到市场、技术、政策等多种因素的影响。如果您需要了解特定公司的真实发展故事,建议查阅相关资料或咨询相关人士。

问答坊 | AI 解惑

USB

请问USB最大的输出电流有多大,假如我用它来给单片机开发板供电,有哪些注意的地方?小弟不才,请各位大侠多多指教.…

查看全部问答>

台湾PCB产业1-2年内居全球龙头

2009年TPCA先进技术研讨会暨标竿论坛6日正式登场,第一场演讲由Prismark姜旭高博士揭开序幕,主题为PCB技术发展趋势与市场商机分析。姜旭高说,比起半导体产业来说,PCB技术发展速度相当缓慢,2000年以来,全球PCB产值几乎没有什么变化,但是台湾PC ...…

查看全部问答>

加入你喜欢的设计小组:51或C8051f

目前设计小组凸显了两个设计方案,主要区别是处理器不同,大家赶快投票参与吧!第一组设计简单,使用了大家熟悉的51单片机第二组主要目标就是在利用SHT21的同时,将东西做得小巧,初定为纽扣电池可用USB充电目前在方案选定阶段,我们随后会公布最小 ...…

查看全部问答>

请教下,怎样在PPC或Smartphone上调用TAPI或其他函数来设置回铃音静音或让打电话的人听不到呢呢,有知道的请不吝赐教,小弟先行谢过了....

我想静音,但是调用waveoutsetvolume(0,0),还是没什么变化,请问如何解决,才能即使有回铃音,让他静音,让主叫方听不到就行.…

查看全部问答>

高手帮我看看为什么进不了中断

#include <msp430x14x.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; TACTL = TASSEL0 + TACLR; CCTL0 = CCIE; CCR0 = 16384; ...…

查看全部问答>

c8051F00 单片机AD精度问题

最近在玩C8051单片机,AD转换的涉及到一个精度的问题,基准电压是3.3V,现在要采样的电压范围是0~48V,计算可得精度大概是188mv=48/3.3 * 3300/255 左右,那么现在要求的精度在100mv以内,怎么操作呢?是不是跟里面的放大增益有关呢?…

查看全部问答>

求高手:make menuconfig 出错

已经安装arm-linux-gcc-4.1.2。在对linux-2.6.31进行内核编译时,使用到“make manuconfig”命令,但是出错了!出错提示信息如下: HOSTCC scripts/basic/fixdep/usr/local/libexec/gcc/i686-pc-linux-gnu/4.6.1/cc1:error while loading shared li ...…

查看全部问答>