打印

STM32使用HSE作为RTC时钟源的问题

[复制链接]
15059|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dzh_fly|  楼主 | 2010-8-10 13:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
请问一下,网上关于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();
}
沙发
dzh_fly|  楼主 | 2010-8-10 15:11 | 只看该作者
自己顶个先,STM32的RTC,真是很头疼,没想到用HSE/128也不行,我们是有一个校准时钟源,每次开机会校准时间,机器运行时间也不是很长,所以不会产生很大误差,没有备用电源,听说LSI很差劲,所以想使用HSE/128,没想这也不行。
香主在不?能否回复一下?

使用特权

评论回复
板凳
香水城| | 2010-8-10 18:34 | 只看该作者
在你给的代码中,没有看到使能HSE的部分?

使用特权

评论回复
地板
dzh_fly|  楼主 | 2010-8-10 18:50 | 只看该作者
下面为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
}

使用特权

评论回复
5
香水城| | 2010-8-10 19:10 | 只看该作者
请问下面几个define中,你选的是哪一个?

STM32F10X_LD
STM32F10X_LD_VL
STM32F10X_MD
STM32F10X_MD_VL
STM32F10X_HD
STM32F10X_XL   
STM32F10X_CL


你再看看RCC_CR中的HSERDY标志。

使用特权

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

使用特权

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


哈哈,不要总是看天上,怪不得头晕,:lol

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

另外,我有一个问题,你是怎么判断RTC不动的?

使用特权

评论回复
8
dzh_fly|  楼主 | 2010-8-11 11:34 | 只看该作者


以上两张图为MDK-ARM的寄存器截图,至于判断RTC不动,多次查看RTC_CNTH,RTC_CNTL的值没有变化。

使用特权

评论回复
9
香水城| | 2010-8-11 14:51 | 只看该作者
目前每看到什么问题。

请问你的VBAT是怎么接的?

使用特权

评论回复
10
dzh_fly|  楼主 | 2010-8-11 16:44 | 只看该作者
VBAT共用的VDD,这个问题看来是不好解了,先试试LSI有多大误差吧。

使用特权

评论回复
11
dzh_fly|  楼主 | 2010-8-12 14:41 | 只看该作者
呵呵,找到原因啦!
PWR_BackupAccessCmd(DISABLE);
这一句,不能要!!!
不明白为什么关掉备份寄存器会不动的,而使用LSI时关掉没有影响,很奇怪的设计。
已经被STM32的奇怪设计折腾好多次了,继续吧,痛并快乐着。

使用特权

评论回复
12
wentian311| | 2010-9-7 14:29 | 只看该作者
11# dzh_fly

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.

使用特权

评论回复
13
xuetudou| | 2016-6-2 16:15 | 只看该作者
虽然是很早的帖子了,还是要回复个,lsi看了手册,时钟在30kHz和60Khz之间,只想说一句,你范围能不能再大点,这要是用到rtc上画面太美不敢想,让中小容量的怎么用啊,也在用hse128分频,发现误差也比较大,谢谢楼主的帖子

使用特权

评论回复
14
xiaobaimaoyou| | 2019-10-12 14:49 | 只看该作者
感谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

22

帖子

2

粉丝