你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeMX配置STM32F103C8T6 RTC分频器问题

[复制链接]
SoHimG 提问时间:2026-2-26 22:47 / 未解决
版本6.17.0,LL库。使用LSE时钟,频率为32.768KHz,设置Auto Predivider Calculation为Enabled时,程序生成的Asynchronous Predivider value为0xFFFFFFFFU,而非正确的分频值
收藏 评论5 发布时间:2026-2-26 22:47

举报

5个回答
摩洛哥的制砖匠人 回答时间:昨天 09:17

看着是一个负值

butterflyspring 回答时间:昨天 10:35
可以看一下源码,这个值应该是一个判定条件而已。后面根据这个条件自动计算出分频值。也可调试看看最终寄存器的值。 因为多数情况都是用来分频到1s钟的,但也有其他可能。所以厂家做了一个判断和计算。你可以调试一下,看看是不是这样获得寄存器需要配置的值。另外记得配置CubeMX 时的时钟树要选择LSE。

STM32F103 RTC CACULATION 3.PNG STM32F103 RTC CACULATION 1.PNG STM32F103 RTC CACULATION 2.PNG



xmshao 回答时间:昨天 10:44

没有关系的。

这个值只是个标志,后续的初始化配置里根据该值进一步得到最终的异步分频值。

没有问题的,放心。

SoHimG 回答时间:昨天 18:00
butterflyspring 发表于 2026-2-27 10:35
可以看一下源码,这个值应该是一个判定条件而已。后面根据这个条件自动计算出分频值。也可调试看看最终寄存 ...

不知道评论是不是被吞了,这么久没发出来。我用的是LL库,这是源码

void MX_RTC_Init(void)
{
    /* USER CODE BEGIN RTC_Init 0 */

    /* USER CODE END RTC_Init 0 */

    LL_RTC_InitTypeDef RTC_InitStruct = { 0 };
    LL_RTC_TimeTypeDef RTC_TimeStruct = { 0 };

    LL_PWR_EnableBkUpAccess();
    /* Enable BKP CLK enable for backup registers */
    LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_BKP);
    /* Peripheral clock enable */
    LL_RCC_EnableRTC();

    /* USER CODE BEGIN RTC_Init 1 */

    /* USER CODE END RTC_Init 1 */

    /** Initialize RTC and set the Time and Date
  */
    RTC_InitStruct.AsynchPrescaler = 0xFFFFFFFFU;
    LL_RTC_Init(RTC, &RTC_InitStruct);
    LL_RTC_SetAsynchPrescaler(RTC, 0xFFFFFFFFU);

    /** Initialize RTC and set the Time and Date
  */
    RTC_TimeStruct.Hours = 0;
    RTC_TimeStruct.Minutes = 0;
    RTC_TimeStruct.Seconds = 0;
    LL_RTC_TIME_Init(RTC, LL_RTC_FORMAT_BCD, &RTC_TimeStruct);
    /* USER CODE BEGIN RTC_Init 2 */

    /* USER CODE END RTC_Init 2 */
}




void SystemClock_Config(void)
{
    LL_FLASH_SetLatency(LL_FLASH_LATENCY_2);
    while (LL_FLASH_GetLatency() != LL_FLASH_LATENCY_2)
    {
    }
    LL_RCC_HSE_Enable();

    /* Wait till HSE is ready */
    while (LL_RCC_HSE_IsReady() != 1)
    {
    }
    LL_PWR_EnableBkUpAccess();
    if (LL_RCC_GetRTCClockSource() != LL_RCC_RTC_CLKSOURCE_LSE)
    {
        LL_RCC_ForceBackupDomainReset();
        LL_RCC_ReleaseBackupDomainReset();
    }
    LL_RCC_LSE_Enable();

    /* Wait till LSE is ready */
    while (LL_RCC_LSE_IsReady() != 1)
    {
    }
    if (LL_RCC_GetRTCClockSource() != LL_RCC_RTC_CLKSOURCE_LSE)
    {
        LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE);
    }
    LL_RCC_EnableRTC();
    LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE_DIV_1, LL_RCC_PLL_MUL_9);
    LL_RCC_PLL_Enable();

    /* Wait till PLL is ready */
    while (LL_RCC_PLL_IsReady() != 1)
    {
    }
    LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
    LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2);
    LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
    LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);

    /* Wait till System clock is ready */
    while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
    {
    }
    LL_Init1msTick(72000000);
    LL_SetSystemCoreClock(72000000);
}



SoHimG 回答时间:昨天 18:06
xmshao 发表于 2026-2-27 10:44
[md]没有关系的。

这个值只是个标志,后续的初始化配置里根据该值进一步得到最终的异步分频值。

实际上RTC时钟走时也不对,手动修改分频值就能正常走时

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版