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

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

[复制链接]
pccldr 提问时间:2020-7-15 22:32 /
各位大佬,
小弟在学习105的 boot mode时候发现自带的BOOT ROM程序可以自己识别 外部8M或者 25M晶振,从而进入DFU更新模式。
我有点好奇,这个 BOOT ROM里面自己识别晶振频率的 代码在哪可以 找到参考啊?


捕获.PNG
收藏 评论7 发布时间:2020-7-15 22:32

举报

7个回答
ts2000 回答时间:2020-7-16 14:45:28
晶振的频率,一般有函数可以直接获取到频率值。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

cugxiao 回答时间:2020-7-16 17:55:21
这段代码是人家自己写好的代码编译好后直接刻蚀到那一片ROM里的,咱们也没有权限访问这一块ROM

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

pccldr 回答时间:2020-7-16 21:17:24
关心ROM干嘛,我只关心 在代码中如何识别 晶振频率

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


  1. unsigned int BoardLowCheckHSE(void)
  2. {
  3.         unsigned int subn, slap1, slap2;
  4.         float n;

  5.         RTC_InitTypeDef RTC_InitStructure;
  6.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  7.         PWR_BackupAccessCmd(ENABLE);
  8.        
  9.         RTC_DeInit();
  10.         RCC_LSICmd(ENABLE);
  11.         while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) {}
  12.         RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
  13.         RCC_RTCCLKCmd(ENABLE);
  14.         RTC_WaitForSynchro();
  15.         RTC_InitStructure.RTC_AsynchPrediv = 40;
  16.         RTC_InitStructure.RTC_SynchPrediv        = 20000;
  17.         RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
  18.         RTC_Init(&RTC_InitStructure);

  19.         RCC_HSEConfig( RCC_HSE_ON );
  20.         while( RCC_GetFlagStatus( RCC_FLAG_HSERDY ) == RESET ) {}
  21.         RCC_SYSCLKConfig( RCC_SYSCLKSource_HSE );
  22.         while( RCC_GetSYSCLKSource() != 0x04 ) {}
  23.         slap2 = RTC->SSR;
  24.         for(subn = HSECHECKLOOP; subn > 0; subn --);
  25.         slap2 -= RTC->SSR;

  26.         RCC_HSICmd(ENABLE);
  27.         while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET) {}
  28.         RCC_SYSCLKConfig( RCC_SYSCLKSource_HSI );
  29.         while( RCC_GetSYSCLKSource() != 0x00 ) {}
  30.         slap1 = RTC->SSR;
  31.         for(subn = HSECHECKLOOP; subn > 0; subn --);
  32.         slap1 -= RTC->SSR;
  33.        
  34.         n = (float)slap1 / (float)slap2;
  35.         subn = HSI_VALUE / 1000000;
  36.         subn = n * subn;
  37.        
  38.         return subn * 1000000;
  39. }
复制代码



butterflyspring 回答时间:2020-7-29 10:49:03
我觉得可以使HSE作为系统时钟,然后通过定时器5的通道4来捕获LSI,通过捕获值的范围可以判断当前是外部时钟。因为三个晶体的差距比较大,所以LSI的误差影响不大
STM32F105 LSI capture.PNG

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版