stm32在rt-thread上的RTC(实时时钟)

2019-08-24来源: eefocus关键字:stm32  rt-thread  RTC  实时时钟

rt-thread中已经部分实现了rtc的内容 ---> rtc.c ,调用rt_hw_rtc_init()函数即可使用msh设置date和time等


rtc时钟来源有三个:


HSE, LSE, LSI, 实现如下: 在原RTC_Configuration(void)进行替换即可




    /* Enable LSE */

    #ifdef USE_LSE

        RCC_LSEConfig(RCC_LSE_ON);

        /* Wait till LSE is ready */

        while ( (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) && (--count) );

    #else

        #ifdef USE_HSE



        #else

            RCC_LSICmd(ENABLE);

            /* Wait till LSE is ready */

            while ( (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) && (--count) );

        #endif

    #endif

    if ( count == 0 )

    {

        return -1;

    }



    /* Select LSE as RTC Clock Source */

    #ifdef USE_LSE

        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

    #else

        #ifdef USE_HSE

            RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

        #else

            RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

        #endif

    #endif

    /* Enable RTC Clock */

    RCC_RTCCLKCmd(ENABLE);



    /* Wait for RTC registers synchronization */

    RTC_WaitForSynchro();



    /* Wait until last write operation on RTC registers has finished */

    RTC_WaitForLastTask();



    /* Set RTC prescaler: set RTC period to 1sec */

    #ifdef USE_LSE

        RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

    #else

        #ifdef USE_HSE

            RTC_SetPrescaler(93749); /* 72 MHz / 128 */

        #else

            RTC_SetPrescaler(40000); /* 40 KHz */

        #endif

    #endif




注意:/* Note:If the HSE divided by 128 is used as the RTC clock, this bit must remain set to 1. */




秒中断和ALARM中断实现:


        rt_hw_rtc_navi_init();

        RTC_WaitForLastTask();

        RTC_SetAlarm(RTC_GetCounter()+25);       //当前RTC值的基础上加时间

        RTC_WaitForLastTask();

        RTC_ITConfig(RTC_IT_SEC, ENABLE);      //使能秒中断

        RTC_WaitForLastTask();

        RTC_ITConfig(RTC_IT_ALR,ENABLE);       //使能arlarm中断


        RTC_WaitForLastTask();




void rt_hw_rtc_navi_init(void)

{

    NVIC_InitTypeDef NVIC_InitStructure; 

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  

    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; 

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

    NVIC_Init(&NVIC_InitStructure);

}




void RTC_IRQHandler(void)

{

    /* enter interrupt */

    rt_interrupt_enter();



    if(RTC_GetITStatus(RTC_IT_ALR) == SET)

    {

        rt_kprintf("RTCAlarm_IRQHandler1~~~rn");

        RTC_ClearITPendingBit(RTC_IT_ALR);

    }

    if(RTC_GetITStatus(RTC_IT_SEC) == SET)

    {

        RTC_ClearITPendingBit(RTC_IT_SEC);

        rt_kprintf("RTCAlarm_IRQHandler2~~~rn");

    }

    /* leave interrupt */

    rt_interrupt_leave();

}



ps:RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */  这个不是alarm的中断函数哟


关键字:stm32  rt-thread  RTC  实时时钟 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic472397.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32在rt-thread上的PWR(电源管理)
下一篇:stm32f103应用rt-thread 1.2.5搭建的Keil工程

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32 看门狗 BKP(HAL库)
(一)概述stm32有两个看门狗:硬件看门狗(LSI 40KHz,时间精度不高)和窗口看门狗(APB1)。(二)硬件看门狗实现代码IWDG_HandleTypeDef hiwdg; // 硬件看门狗初始化static void MX_IWDG_Init(IWDG_HandleTypeDef *pHiwdg){    pHiwdg->Instance = IWDG;    pHiwdg->Init.Prescaler = IWDG_PRESCALER_4;    pHiwdg->Init.Reload = 0xFFF; // Tout
发表于 2019-11-16
STM32 HAL库学习系列第11篇---定时器TIM---看门狗基本配置及使用
基本配置使用cube配置溢出时间记住准时喂狗独立看门狗: /* IWDG 1s 超时溢出 */  MX_IWDG_Init(IWDG_PRESCALER_64,625);  /* 启动独立看门狗 */  HAL_IWDG_Start(&hiwdg);   LED1_ON;   /* while部分是我们在项目中具体需要写的代码,这部分的程序可以用独立看门狗来监控   * 如果我们知道这部           分代码的执行时间,比如是50ms,那么我们可以设置独立看门狗的 &nb
发表于 2019-11-16
STM32-自学笔记(18.独立看门狗,使用到的库函数)
为16IWDG_Prescaler_256设置IWDG预分频值为256IWDG_Prescaler_32设置IWDG预分频值为32例子:IWDG_SetPrescaler(IWDG_Prescaler_8);                //设置IWDG预分频值为82.IWDG_SetReload函数原型:void IWDG_SetReload(u16 Reload)功能:设置IWDG重装载值参数:Reload:IWDG的重装载值。取值范围0~0x0FFF例子:IWDG_SetReload(0xFFF);       
发表于 2019-11-16
HAL库 STM32CubeMX教程五----看门狗(独立看门狗,窗口看门狗)
的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环;或者因为用户配置代码出现BUG,导致芯片无法正常工作,出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 简单说:看门狗的本质就是定时计数器,计数器使能之后一直在累加 而喂狗就是重新写入计数器的值,时计数器重新累加,如果在一定时间内没有接收到喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)STM32的内置看门狗STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗、窗口看门狗)可以用来检测和解决由软件错误
发表于 2019-11-16
HAL库 STM32CubeMX教程五----看门狗(独立看门狗,窗口看门狗)
怎样用STM32CAN总线接口发送和接收数据
,禁止高7位都为隐性,即不能:ID=1111111XXXX。RTR,远程请求位。0,数据帧;1, 远程帧;SRR,替代远程请求位。设置为1(隐性电平);IDE,标识符选择位。0,标准标识符;1,扩展标识符;r0,r1:保留位。必须以显现电平发送,但是接收可以是隐性电平。DLC:数据长度码。0~8,表示发送/接收的数据长度(字节)。IDE,标识符选择位。0,标准标识符;1,扩展标识符;位时序分解为了实现位同步,CAN协议把每一个数据位的时序分解成SS段、PTS段、PBS1段、PBS2段,这四段的长度加起来即为一个CAN数据位的长度。分解后最小的时间单位是Tq,而一个完整的位由8~25个Tq组成。STM32中的CAN接口STM32的芯片
发表于 2019-11-16
怎样用STM32CAN总线接口发送和接收数据
stm8s_iwdg(独立看门狗)
; IWDG_Prescaler_16  = (uint8_t)0x02, /*!< Used to set prescaler register to 16 */  IWDG_Prescaler_32  = (uint8_t)0x03, /*!< Used to set prescaler register to 32 */  IWDG_Prescaler_64  = (uint8_t)0x04, /*!< Used to set prescaler register to 64 */  IWDG_Prescaler_128 = (uint8_t
发表于 2019-11-16
小广播
何立民专栏 单片机及嵌入式宝典

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

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