pccldr 发表于 2020-7-15 22:32:29

stm32f105如何检测HSE外部晶振频率?

各位大佬,
小弟在学习105的 boot mode时候发现自带的BOOT ROM程序可以自己识别 外部8M或者 25M晶振,从而进入DFU更新模式。
我有点好奇,这个 BOOT ROM里面自己识别晶振频率的 代码在哪可以 找到参考啊?


ts2000 发表于 2020-7-16 14:45:28

晶振的频率,一般有函数可以直接获取到频率值。

cugxiao 发表于 2020-7-16 17:55:21

这段代码是人家自己写好的代码编译好后直接刻蚀到那一片ROM里的,咱们也没有权限访问这一块ROM

pccldr 发表于 2020-7-16 21:17:24

关心ROM干嘛,我只关心 在代码中如何识别 晶振频率:lol

@ts2000 用哪个函数可以 获取晶振频率啊,能否指导一下?

pccldr 发表于 2020-7-16 21:19:12

我不关心ROM啊,我只想了解有没有识别晶振频率的代码

@ts2000 在哪可以看到识别晶振频率函数啊,能否指导一下?

watershade 发表于 2020-7-16 21:56:17

这是一个好问题。我也想知道答案。不知道你的demo在哪里,看看源码分析一下。
以下是我猜的:能否通过timer捕捉HSI和HSE来比较?另一种是试错法,毕竟只支持三种频率。类似于频率自动适配,类似与uart的波特率自动适配的方法

pccldr 发表于 2020-7-16 22:27:11

我在 F303里面尝试了一下,通过超时判断8M/16M晶振锁定72MPLL的方式死活 试不出来,完了之后通过LSI作为RTC时钟,计时判断HSI(固定8M)与HSE的相对值来计算出外部晶振。还真准的。附下面代码,大家有兴趣可以尝试哈,看成功率,另外,我是比较好奇 内部ROM的代码是 怎么样实现的。知情者能否分享哈~~或有更好的方案可以分享啊


unsigned int BoardLowCheckHSE(void)
{
        unsigned int subn, slap1, slap2;
        float n;

        RTC_InitTypeDef RTC_InitStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
        PWR_BackupAccessCmd(ENABLE);
       
        RTC_DeInit();
        RCC_LSICmd(ENABLE);
        while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) {}
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
        RCC_RTCCLKCmd(ENABLE);
        RTC_WaitForSynchro();
        RTC_InitStructure.RTC_AsynchPrediv = 40;
        RTC_InitStructure.RTC_SynchPrediv        = 20000;
        RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
        RTC_Init(&RTC_InitStructure);

        RCC_HSEConfig( RCC_HSE_ON );
        while( RCC_GetFlagStatus( RCC_FLAG_HSERDY ) == RESET ) {}
        RCC_SYSCLKConfig( RCC_SYSCLKSource_HSE );
        while( RCC_GetSYSCLKSource() != 0x04 ) {}
        slap2 = RTC->SSR;
        for(subn = HSECHECKLOOP; subn > 0; subn --);
        slap2 -= RTC->SSR;

        RCC_HSICmd(ENABLE);
        while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET) {}
        RCC_SYSCLKConfig( RCC_SYSCLKSource_HSI );
        while( RCC_GetSYSCLKSource() != 0x00 ) {}
        slap1 = RTC->SSR;
        for(subn = HSECHECKLOOP; subn > 0; subn --);
        slap1 -= RTC->SSR;
       
        n = (float)slap1 / (float)slap2;
        subn = HSI_VALUE / 1000000;
        subn = n * subn;
       
        return subn * 1000000;
}


butterflyspring 发表于 2020-7-29 10:49:03

我觉得可以使HSE作为系统时钟,然后通过定时器5的通道4来捕获LSI,通过捕获值的范围可以判断当前是外部时钟。因为三个晶体的差距比较大,所以LSI的误差影响不大
页: [1]
查看完整版本: stm32f105如何检测HSE外部晶振频率?