STM32开发笔记76: 初始化RTC后死机的原因

发布者:雅致小筑最新更新时间:2019-07-13 来源: eefocus关键字:STM32  初始化RTC  死机 手机看文章 扫描二维码
随时随地手机看文章

项目开发中只要初始化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 ############################## */

[1] [2]
关键字:STM32  初始化RTC  死机 引用地址:STM32开发笔记76: 初始化RTC后死机的原因

上一篇:【stm32f0】stm32 总中断的打开与关闭
下一篇:STM32开发笔记75: 使用STM32CubeMX点亮一个LED

推荐阅读最新更新时间:2024-11-10 15:48

stm32 Ctext-M3内核最简单的多任务RTOS
RTOS 实时操作系统,我做的是一个多任务的操作系统,可以同时运行多个任务,我这里设置的最大任务数是32个, 估计跑30多个任务的嵌入式设备很少吧,32个任务够用了。 OS我把它叫做HesOS,主要功能如下,比较简单。 1--实现多任务调度 2--实现任务调度锁 3--实现临界区保护 4--实现读取cpu使用率(这个功能比较重要的) 5--实现us延时(用于模拟如IIC总线模拟) 对于一般的嵌入式应用有这些功能,差不多够用了。 移植HesOS也非常简单,不会像其它的OS一样比较庞大,修改的地方也比较多,使用起来也复杂。 HesOS不管是移植和使用都是非常简单的,类似于PC的线程使用。 主
[单片机]
<font color='red'>stm32</font> Ctext-M3内核最简单的多任务RTOS
STM32学习016_数据帧
在作通信工作时,我们常常会遇到“帧”这个概念,我迷惑的地方在于,一帧数据包含N个(1+8bit+1+1 起始位+8位数据+校验位+停止位),还是(1+N*8bit+1+1),今天仔细深究了一下,现将收获说一下,希望对读者有帮助。 首先要弄清楚一些概念: “1+8bit+1+1”是串行通讯一个字节的格式,属于串行通信中最小数据格式的单位,1个起始位+8个数据位+1个校验位+1个停止位(也有1+8+0+1等等),也就是要收发N个字节,就会有N个(1+8bit+1+1)这样的组合出现在TXD和RXD线路上,而不是1+nbit+1+1或者1+nx8bit+1+1。以上叙述中, 起始位和停止位:用于同步; 校验位:用来保证通讯的正确性; 8
[单片机]
STM32之Bit banding
【1】Bit banding即位带操作,STM32的寄存器大都为32位,想要修改某个特定位很困难,位带操作即可解决这个问题,它是将寄存器的特定位和bit-band区域的一个32位地址绑定,也就是一对32,你对这个位带区域的32地址赋值即可控制相应位,可赋值范围是0-2的32次方,但这里赋值0和1便足够。 【2】位带操作是硬件支持还是需要软件设置? 硬件支持,只要你能根据公式找到对应地址,你就可以轻松使用位带操作!这里推荐使用宏定义,可以看这里: https://blog.csdn.net/wofreeo/article/details/82255491 【3】位带操作支持所有寄存器吗? 可见包含了
[单片机]
stm32掉电前的数据存储到flash
FLASh 必须是先擦 后 写 下面的函数是分析案例 void FLASH_WriteByte(u32 addr ,u16 flashdata1) { FLASH_Status FLASHstatus = FLASH_COMPLETE; FLASH_Unlock();//解锁FLASH编程擦除控制器 // FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);//清除标志位 FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR)
[单片机]
STM32与FreeRTOS学习备忘,xSemaphoreGiveFromISR
在学习FreeRTOS的时候,使用中断释放信号量时,出现了问题。 中断函数卡在xSemaphoreGiveFromISR();函数里了,具体是卡在portASSERT_IF_INTERRUPT_PRIORITY_INVALID();里。 根据注释查看http://www.freertos.org/RTOS-Cortex-M3-M4.html,里面有两点点出关键。 1. Most systems default to the wanted configuration, with the noticeable exception of the STM32 driver library. If you are using
[单片机]
<font color='red'>STM32</font>与FreeRTOS学习备忘,xSemaphoreGiveFromISR
STM32中断流程处理
作为我的一个习惯,学习某一个平台的东西,总是先要摸清楚中断的处理流程,当然是从文件代码级的流程分析了。 下面就说下stm32的中断流程。我们知道,stm32的库中写好了很多的驱动程序,可以说包括了所有的。同时也提供很多数据处理方式,例如串口的读写,用户可以选择轮询、中断、DMA等3中方式来处理。 关于中断,stm32的库中做好了框架,用户只要填写好几个函数的实现就ok了,就像网上说的,这就是傻瓜式开发。 了解中断,首先要知道stm32f10x_it.c这个文件,一般情况下是和main文件在同一个目录下的。打开这个文件,我们可以看到xyz_IRQHandler函数的实现,虽然说是实现,但是几乎都是空的。对了,这些函数就是要用户填写
[单片机]
如何使用STM32实现systick的精确延时
SYSTICK寄存器初始化 void SysTick_Configuration(void) { if (SysTick_Config(SystemCoreClock / 100)) { while (1); } NVIC_SetPriority(SysTick_IRQn, 0x0); } SysTick_Config默认时钟为SysTick_CLKSource_HCLK,所以在这之前使用SysTick_CLKSourceConfig()选择系统时钟不会改变systick的时钟 static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks 》 Sys
[单片机]
关于stm32的USB和SPI疑似存在干扰的问题
情况是这样的,最近做一个项目,使用的是stm32f103RE单片机,使用到了单片机的usb口和SPI1。USB虚拟成串口向上位机发送数据,已经通过修改官网的例程调试通过,SPI1也能正常工作。但是当把两个功能做在同一个工程中时,发现出现了一些问题:USB想上位机发送一段时间后会停止发送(我的程序是在while中一直发送);USB发送会出现乱码。当我把SPI1的读写函数注释掉之后上述问题有消失了。这个问题纠结了我好几天了,不知道各位高手能不能帮我解答解答。 调试发现程序停在了while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);中,但是之前没有添加USB功能模块
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved