15915|11

60

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32使用HSE作为RTC时钟源的问题 [复制链接]

请问一下,网上关于STM32的RTC不能振的讨论多了去了,不过我们现在的产品比较特殊,没有使用LSE,而是使用的HSE/128,但是很奇怪的现象,程序已经正常运行,HSE不可能没有起振,不然机器早死机了,为什么RTC还是不动呢,在买回的开发板上测试使用HSE是正常的。
以下是我的RTC配置代码,被屏蔽部分使用的LSI,测试RTC正常,使用HSE/128则RTC没有工作,就改动了这两个地方。
我想问一下,是否HSE正常起振,RTC对电容值什么的还有要求呢?按理说只要起振就可以吧?
//在这之前有调用库函数 SystemInit();初始化HSE
void RTC_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
/* Reset Backup Domain */
BKP_DeInit();
#if 0
//!!!使用内部低速晶振
RCC_LSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);  
#else
//使用外部高速晶振8M/128 = 62.5K
RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);  
#endif
//允许RTC
RCC_RTCCLKCmd(ENABLE);
//等待RTC寄存器同步
RTC_WaitForSynchro();

RTC_WaitForLastTask();
//允许RTC的秒中断(还有闹钟中断和溢出中断可设置)
RTC_ITConfig(RTC_IT_SEC, ENABLE);

RTC_WaitForLastTask();
//62500晶振预分频值是62500,不过一般来说晶振都不那么准
#if 0
  //!!!使用内部低速晶振
RTC_SetPrescaler(32768); //如果需要校准晶振,可修改此分频值
#else
RTC_SetPrescaler(62498); //如果需要校准晶振,可修改此分频值
#endif
RTC_WaitForLastTask();
//RTC 的时钟校准,暂不使用
//BKP_SetRTCCalibrationValue(120);

PWR_BackupAccessCmd(DISABLE);

//清除标志
RCC_ClearFlag();
}
此帖出自stm32/stm8论坛

最新回复

                                   Power control register (PWR_CR) Bit 8 DBP: Disable backup domain write protection. In reset state, the RTC and backup registers are protected against parasitic write access. This bit must be set to enable write access to these registers. 0: Access to RTC and Backup registers disabled 1: Access to RTC and Backup registers enabled Note: If the HSE divided by 128 is used as the RTC clock, this bit must remain set to 1.  详情 回复 发表于 2010-9-7 14:29
点赞 关注
 

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
自己顶个先,STM32的RTC,真是很头疼,没想到用HSE/128也不行,我们是有一个校准时钟源,每次开机会校准时间,机器运行时间也不是很长,所以不会产生很大误差,没有备用电源,听说LSI很差劲,所以想使用HSE/128,没想这也不行。
版主在不?能否回复一下?
此帖出自stm32/stm8论坛
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 在你给的代码中,没有看到使能HSE的部分?
此帖出自stm32/stm8论坛
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
下面为system_stm32f10x.c中代码
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_Value */
#define SYSCLK_FREQ_24MHz  24000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_Value */
/* #define SYSCLK_FREQ_24MHz  24000000 */
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
  #define SYSCLK_FREQ_72MHz  72000000
#endif

下面为RTC_Configuration()之前的初始化代码,其中SystemInit();为库函数,有初始化HSE,固件版本version V3.3.0
void RCC_Configuration()
{
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------         
RCC system reset(for debug purpose)
----------------------------------------------------------------------
SYSCLK: 72 MHZ
HCLK   : 72 MHZ
PCLK1  : 36 MHZ
PCLK2  : 72 MHZ
USB     : 48MHZ
ADC     : 9MHZ  //最大只能到 14MHZ

        RCC_ClocksTypeDef RCC_ClockFreq;

        SystemInit();

        /* Select USBCLK source */
        RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
       
        /* Enable the USB clock */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);

        /* ADCCLK = PCLK2/8*/
        RCC_ADCCLKConfig(RCC_PCLK2_Div8);

        /* Enable SYSTICK clock */
        SysTick_Config(SysTick_CLKSource_HCLK_Div8);

        /* Enable CRC clock */
//          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);

        /**************************************************
        获取RCC的信息,调试用
        请参考RCC_ClocksTypeDef结构体的内容,当时钟配置完成后,
        里面变量的值就直接反映了器件各个部分的运行频率
        ***************************************************/
        RCC_GetClocksFreq(&RCC_ClockFreq);

//        RCC_ClockSecuritySystemCmd(ENABLE);  //启动时钟安全系统CSS
}
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
请问下面几个define中,你选的是哪一个?

STM32F10X_LD
STM32F10X_LD_VL
STM32F10X_MD
STM32F10X_MD_VL
STM32F10X_HD
STM32F10X_XL   
STM32F10X_CL


你再看看RCC_CR中的HSERDY标志。
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
选的是STM32F10X_MD,编译器环境是RealView MDK-ARM  Version: 4.10
HSERDY标志,用MDK-ARM  仿真,查看到RCC_CR寄存器确实有置位,示波器也测出晶振工作了。
芯片具体型号是STM32F103RBTb。
现在很头疼,难道说HSE起振了还不行,还得符合那个电容的要求才可以?
想想没道理啊,可是为什么一换成LSI就OK了呢?
天啊,真是头晕了!
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
选的是STM32F10X_MD,编译器环境是RealView MDK-ARM  Version: 4.10
HSERDY标志,用MDK-ARM  仿真,查看到RCC_CR寄存器确实有置位,示波器也测出晶振工作了。
芯片具体型号是STM32F103RBTb。
现在很头疼,难道说HSE起振了还不行,还得符合那个电容的要求才可以?
想想没道理啊,可是为什么一换成LSI就OK了呢?
天啊,真是头晕了!
dzh_fly 发表于 2010-8-11 09:15

这样吧,你把所有的RTC寄存器显示出来看看。

另外,我有一个问题,你是怎么判断RTC不动的?
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 
RCC.jpg RTC.jpg

以上两张图为MDK-ARM的寄存器截图,至于判断RTC不动,多次查看RTC_CNTH,RTC_CNTL的值没有变化。
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

9
 
目前每看到什么问题。

请问你的VBAT是怎么接的?
此帖出自stm32/stm8论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(中级)

10
 
                                 VBAT共用的VDD,这个问题看来是不好解了,先试试LSI有多大误差吧。
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
呵呵,找到原因啦!
PWR_BackupAccessCmd(DISABLE);
这一句,不能要!!!
不明白为什么关掉备份寄存器会不动的,而使用LSI时关掉没有影响,很奇怪的设计。
已经被STM32的奇怪设计折腾好多次了,继续吧,痛并快乐着。
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

12
 


Power control register (PWR_CR)

Bit 8 DBP: Disable backup domain write protection.
In reset state, the RTC and backup registers are protected against parasitic write access.
This bit must be set to enable write access to these registers.
0: Access to RTC and Backup registers disabled
1: Access to RTC and Backup registers enabled
Note: If the HSE divided by 128 is used as the RTC clock, this bit must remain set to 1.
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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