stm32f105如何检测HSE外部晶振频率?
各位大佬,小弟在学习105的 boot mode时候发现自带的BOOT ROM程序可以自己识别 外部8M或者 25M晶振,从而进入DFU更新模式。
我有点好奇,这个 BOOT ROM里面自己识别晶振频率的 代码在哪可以 找到参考啊?
晶振的频率,一般有函数可以直接获取到频率值。 这段代码是人家自己写好的代码编译好后直接刻蚀到那一片ROM里的,咱们也没有权限访问这一块ROM 关心ROM干嘛,我只关心 在代码中如何识别 晶振频率:lol
@ts2000 用哪个函数可以 获取晶振频率啊,能否指导一下? 我不关心ROM啊,我只想了解有没有识别晶振频率的代码
@ts2000 在哪可以看到识别晶振频率函数啊,能否指导一下? 这是一个好问题。我也想知道答案。不知道你的demo在哪里,看看源码分析一下。
以下是我猜的:能否通过timer捕捉HSI和HSE来比较?另一种是试错法,毕竟只支持三种频率。类似于频率自动适配,类似与uart的波特率自动适配的方法
我在 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;
}
我觉得可以使HSE作为系统时钟,然后通过定时器5的通道4来捕获LSI,通过捕获值的范围可以判断当前是外部时钟。因为三个晶体的差距比较大,所以LSI的误差影响不大
页:
[1]