硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3809|回复: 6
收起左侧

[有问必答] STM32F1 内部RTC例程 有没有使用LSI的dom

[复制链接]

22

主题

22

回帖

88

积分

初级会员

积分
88
发表于 2021-4-13 15:25:52 | 显示全部楼层 |阅读模式
/*
*********************************************************************************************************
*
*        模块名称 : STM32内部RTC模块
*        文件名称 : bsp_cpu_rtc.h
*        版    本 : V1.0
*        说    明 : 头文件
*
*        修改记录 :
*                版本号  日期       作者    说明
*                v1.0    2015-08-08 armfly  首版.安富莱电子原创
*
*        Copyright (C), 2015-2016, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/

#include "bsp.h"

#define RTC_Debug   /* 用于选择调试模式 */

/* 选择RTC的时钟源 */
#define RTC_CLOCK_SOURCE_LSE    /* LSE */
//#define RTC_CLOCK_SOURCE_LSI     /* LSI */

回复

使用道具 举报

22

主题

22

回帖

88

积分

初级会员

积分
88
 楼主| 发表于 2021-4-13 15:45:32 | 显示全部楼层
  1. void bsp_InitRTC1(void)
  2. {
  3.      uint16_t u16_WaitForOscSource;

  4.         /*
  5.                 在BKP的后备寄存器1中,存了一个特殊字符0xA5A5, 第一次上电或后备电源掉电后,该寄存器数据丢失,
  6.                 表明RTC数据丢失,需要重新配置
  7.         */
  8.     if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
  9.     {
  10.                 /* PWR时钟(电源控制)与BKP时钟(RTC后备寄存器)使能 */  
  11.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  12.                
  13.                 /* 使能RTC和后备寄存器访问 */  
  14.                 PWR_BackupAccessCmd(ENABLE);
  15.                
  16.                 /* 将外设BKP的全部寄存器重设为缺省值 */   
  17.                 BKP_DeInit();

  18. #if defined (RTC_CLOCK_SOURCE_LSE)
  19.                
  20.                 /* 使能LSE */               
  21.                 RCC_LSEConfig(RCC_LSE_ON);
  22.                
  23.                 #if 1
  24.                 for(u16_WaitForOscSource=0; u16_WaitForOscSource < 5000; u16_WaitForOscSource++)
  25.                 {
  26.                         ;
  27.                 }
  28.                 #endif
  29.                
  30.                  /* 等待外部晶振震荡稳定输出 */  
  31.                 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
  32.                
  33.                 /* 使用外部32.768KHz晶振作为RTC时钟 */
  34.                 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  35. #elif defined (RTC_CLOCK_SOURCE_LSI)
  36.                
  37.                 /* 使能LSI */
  38.                 RCC_LSICmd(ENABLE);

  39.                 /* 等待直到LSI就绪 */
  40.                 while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);

  41.                 /* 选择LSI作为RTC的时钟 */
  42.                 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);      
  43. #endif
  44.                
  45.                 /* 使能RTC时钟 */
  46.                 RCC_RTCCLKCmd(ENABLE);
  47.                
  48.                 /*
  49.               在APB1总线复位或者停止后重新开启,RTC的任何读取前得等待RTC寄存器
  50.               (RTC_CNT, RTC_ALR and RTC_PRL)跟RTC APB时钟同步。
  51.             */
  52.                 RTC_WaitForSynchro();
  53.                
  54.                 /* 等待RTC寄存器操作完成 */
  55.                 RTC_WaitForLastTask();

  56. #if defined (RTC_CLOCK_SOURCE_LSE)

  57.                 /* 32.768KHz晶振预分频值是32767,如果对精度要求很高可以修改此分频值来校准晶振 */
  58.                 RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */      
  59. #elif defined (RTC_CLOCK_SOURCE_LSI)

  60.                 /*
  61.                   1. LSI的频率典型值是40KHz(30KHz到60KHz)
  62.                   2. 这里按40KHz来计算
  63.                          RTC 周期 = RTCCLK / RTC_PR = (40 KHz)/(39999 + 1) = 1Hz
  64.                 */
  65.                 RTC_SetPrescaler(39999);
  66. #endif

  67.                
  68.                 /* 等待RTC寄存器操作完成 */
  69.                 RTC_WaitForLastTask();
  70.                
  71.                 /* Enable the RTC Alarm interrupt */  
  72.                 RTC_ITConfig(RTC_IT_ALR, ENABLE);                 
  73.                 /* 设置默认时间 */
  74.                 RTC_WriteClock(2015, 8, 8, 0, 0, 0);
  75.                
  76.         /* 配置完成后,向后备寄存器中写特殊字符0xA5A5 */
  77.         BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
  78.                
  79.                 /* 打印调试信息 */
  80.                 #ifdef RTC_Debug
  81.                         printf("重新配置后使用RTC \n\r");
  82.                 #endif
  83.                
  84.                 /* 检测上电复位标志是否设置 */
  85.                 if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
  86.                 {
  87.                         /* 发生上电复位 */
  88.                         #ifdef RTC_Debug
  89.                                 printf("发生上电复位 \n\r");
  90.                         #endif
  91.                 }
  92.     }
  93.     else
  94.         {
  95.                 /* 若后备寄存器没有掉电,则无需重新配置RTC */
  96.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  97.                
  98.                 for (u16_WaitForOscSource = 0; u16_WaitForOscSource < 5000; u16_WaitForOscSource++)
  99.                 {
  100.                         ;
  101.                 }
  102.                
  103.                 /* 打印调试信息 */
  104.                 #ifdef RTC_Debug
  105.                         printf("第n次使用RTC \n\r");
  106.                 #endif
  107.                
  108.                 /* Enable the RTC Alarm interrupt */  
  109.                 RTC_ITConfig(RTC_IT_ALR, ENABLE);
  110.                
  111.                 /* 检测上电复位标志是否设置 */
  112.                 if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
  113.                 {
  114.                         /* 发生上电复位 */
  115.                         #ifdef RTC_Debug
  116.                                 printf("发生上电复位 \n\r");
  117.                         #endif
  118.                 }
  119.                 /* 检测引脚复位标志是否设置 */
  120.                 else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
  121.                 {
  122.                         /* 发生引脚复位 */
  123.                         #ifdef RTC_Debug
  124.                                 printf("发生引脚复位 \n\r");     
  125.                         #endif   
  126.                 }
  127.                
  128.         /* 清除RCC中复位标志 */
  129.         RCC_ClearFlag();
  130.       
  131.     }
  132.         return;
  133. }
复制代码



用了 这个发现调用RTC_ReadClock(); 然后打印timecount 一直都是0
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106905
QQ
发表于 2021-4-14 14:35:24 | 显示全部楼层
lijiukun 发表于 2021-4-13 15:45
用了 这个发现调用RTC_ReadClock(); 然后打印timecount 一直都是0

开头的宏定义可以切换

#define RTC_CLOCK_SOURCE_LSE    /* LSE */
//#define RTC_CLOCK_SOURCE_LSI     /* LSI */
回复

使用道具 举报

34

主题

111

回帖

213

积分

高级会员

程序小白

积分
213
QQ
发表于 2021-4-26 22:16:43 | 显示全部楼层
eric2013 发表于 2021-4-14 14:35
开头的宏定义可以切换

#define RTC_CLOCK_SOURCE_LSE    /* LSE */

老大  我自己的板子  选择RTC_CLOCK_SOURCE_LSI  RTC时间可以正常显示; 而选择 RTC_CLOCK_SOURCE_LSE 时间就显示00:00:00 ,可以判定是硬件电路的问题吗? 晶振电路有问题?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106905
QQ
发表于 2021-4-27 08:40:44 | 显示全部楼层
清风徐来 发表于 2021-4-26 22:16
老大  我自己的板子  选择RTC_CLOCK_SOURCE_LSI  RTC时间可以正常显示; 而选择 RTC_CLOCK_SOURCE_LSE 时 ...

一般是起振问题。
回复

使用道具 举报

210

主题

1044

回帖

1684

积分

至尊会员

More we do, more we can do.

积分
1684
发表于 2021-4-27 10:51:08 | 显示全部楼层
你可以确认下起振标志
回复

使用道具 举报

2

主题

38

回帖

44

积分

新手上路

积分
44
发表于 2021-5-10 10:43:38 | 显示全部楼层
兄弟我跟你的情况差不多,lsi可以显示,但是断电就不继续走了,只会保持断电前的数据;你的lse电路设计的匹配电容是多大的啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-9 11:57 , Processed in 0.242439 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表