打印
[STM32F1]

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

[复制链接]
2877|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jlyuan|  楼主 | 2021-8-14 22:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问一下,网上关于STM32的RTC不能振的讨论多了去了,不过我们现在的产品比较特殊,没有使用LSE,而是使用的HSE/128,但是很奇怪的现象,程序已经正常运行,HSE不可能没有起振,不然机器早死机了,为什么RTC还是不动呢,在买回的开发板上测试使用HSE是正常的。

使用特权

评论回复
沙发
xxrs| | 2021-8-14 22:24 | 只看该作者
RTC配置代码

使用特权

评论回复
板凳
chenjunt| | 2021-8-14 22:29 | 只看该作者
被屏蔽部分使用的LSI,测试RTC正常

使用特权

评论回复
地板
chenjunt| | 2021-8-14 22:34 | 只看该作者
使用HSE/128则RTC没有工作,就改动了这两个地方。

使用特权

评论回复
5
renyaq| | 2021-8-14 22:37 | 只看该作者
我想问一下,是否HSE正常起振,RTC对电容值什么的还有要求呢?

使用特权

评论回复
6
jlyuan|  楼主 | 2021-8-14 22:43 | 只看该作者
按理说只要起振就可以吧?

使用特权

评论回复
7
chenjunt| | 2021-8-14 22:46 | 只看该作者
//在这之前有调用库函数 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();
}

使用特权

评论回复
8
yszong| | 2021-8-14 22:52 | 只看该作者
请问下面几个define中,你选的是哪一个?

使用特权

评论回复
9
zhanghqi| | 2021-8-14 22:54 | 只看该作者
STM32F10X_LD STM32F10X_LD_VL STM32F10X_MD STM32F10X_MD_VL STM32F10X_HD STM32F10X_XL STM32F10X_CL 你再看看 ...

使用特权

评论回复
10
renyaq| | 2021-8-14 22:56 | 只看该作者
STM32的RTC,真是很头疼,没想到用HSE/128也不行,我们是有一个校准时钟源,每次开机会校准时间,机器运行时间也不是很长,所以不会产生很大误差

使用特权

评论回复
11
jlyuan|  楼主 | 2021-8-14 22:58 | 只看该作者
没有备用电源,听说LSI很差劲

使用特权

评论回复
12
jlyuan|  楼主 | 2021-8-14 22:59 | 只看该作者
所以想使用HSE/128,没想这也不行

使用特权

评论回复
13
wyjie| | 2021-8-14 23:02 | 只看该作者
在你给的代码中,没有看到使能HSE的部分?

使用特权

评论回复
14
jlyuan|  楼主 | 2021-8-14 23:05 | 只看该作者
下面为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
}

使用特权

评论回复
15
zwll| | 2021-8-14 23:07 | 只看该作者
请问下面几个define中,你选的是哪一个?

STM32F10X_LD
STM32F10X_LD_VL
STM32F10X_MD
STM32F10X_MD_VL
STM32F10X_HD
STM32F10X_XL   
STM32F10X_CL


你再看看RCC_CR中的HSERDY标志。

使用特权

评论回复
16
jlyuan|  楼主 | 2021-8-14 23:12 | 只看该作者
选的是STM32F10X_MD,编译器环境是RealView MDK-ARM  Version: 4.10
HSERDY标志,用MDK-ARM  仿真,查看到RCC_CR寄存器确实有置位,示波器也测出晶振工作了。

使用特权

评论回复
17
tian111| | 2021-8-14 23:13 | 只看该作者
芯片具体型号是STM32F103RBTb。

使用特权

评论回复
18
jlyuan|  楼主 | 2021-8-14 23:15 | 只看该作者
现在很头疼,难道说HSE起振了还不行,还得符合那个电容的要求才可以?

使用特权

评论回复
19
dingy| | 2021-8-14 23:17 | 只看该作者
想想没道理啊,可是为什么一换成LSI就OK了呢?

使用特权

评论回复
20
ousj| | 2021-8-14 23:19 | 只看该作者
哈哈,不要总是看天上,怪不得头晕,:lol

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

使用特权

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

本版积分规则

880

主题

12030

帖子

4

粉丝