你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
每日签到
STM32团队2
论坛吐槽优化专区
升级测试
stm32f105如何检测HSE外部晶振频率?
[复制链接]
pccldr
提问时间:2020-7-15 22:32 /
问答
是否解决:
各位大佬,
小弟在学习105的 boot mode时候发现自带的BOOT ROM程序可以自己识别 外部8M或者 25M晶振,从而进入DFU更新模式。
我有点好奇,这个 BOOT ROM里面自己识别晶振频率的 代码在哪可以 找到参考啊?
赞
0
收藏
0
评论
7
分享
发布时间:2020-7-15 22:32
举报
请先
登录
后回复
7个回答
ts2000
回答时间:2020-7-16 14:45:28
a0a.1 32b0c
晶振的频率,一般有函数可以直接获取到频率值。
评分
参与人数
1
蝴蝶豆
+2
收起
理由
STMCU
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
cugxiao
回答时间:2020-7-16 17:55:21
a0a.1 32b0c
这段代码是人家自己写好的代码编译好后直接刻蚀到那一片ROM里的,咱们也没有权限访问这一块ROM
评分
参与人数
1
蝴蝶豆
+3
收起
理由
STMCU
+ 3
查看全部评分
赞
0
评论
回复
支持
反对
pccldr
回答时间:2020-7-16 21:17:24
a4a.1 32b0c
关心ROM干嘛,我只关心 在代码中如何识别 晶振频率
@ts2000 用哪个函数可以 获取晶振频率啊,能否指导一下?
赞
0
评论
回复
支持
反对
pccldr
回答时间:2020-7-16 21:19:12
a4a.1 32b0c
我不关心ROM啊,我只想了解有没有识别晶振频率的代码
@ts2000 在哪可以看到识别晶振频率函数啊,能否指导一下?
赞
0
评论
回复
支持
反对
watershade
回答时间:2020-7-16 21:56:17
a0a.1 32b0c
这是一个好问题。我也想知道答案。不知道你的demo在哪里,看看源码分析一下。
以下是我猜的:能否通过timer捕捉HSI和HSE来比较?另一种是试错法,毕竟只支持三种频率。类似于频率自动适配,类似与uart的波特率自动适配的方法
赞
0
评论
回复
支持
反对
pccldr
回答时间:2020-7-16 22:27:11
a4a.1 32b0c
我在 F303里面尝试了一下,通过超时判断8M/16M晶振锁定72M PLL的方式死活 试不出来,完了之后通过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;
}
复制代码
赞
0
评论
回复
支持
反对
butterflyspring
回答时间:2020-7-29 10:49:03
a0a.1 32b0c
我觉得可以使HSE作为系统时钟,然后通过定时器5的通道4来捕获LSI,通过捕获值的范围可以判断当前是外部时钟。因为三个晶体的差距比较大,所以LSI的误差影响不大
评分
参与人数
1
蝴蝶豆
+2
收起
理由
STMCU
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
评分
查看全部评分
评分
查看全部评分
@ts2000 用哪个函数可以 获取晶振频率啊,能否指导一下?
@ts2000 在哪可以看到识别晶振频率函数啊,能否指导一下?
以下是我猜的:能否通过timer捕捉HSI和HSE来比较?另一种是试错法,毕竟只支持三种频率。类似于频率自动适配,类似与uart的波特率自动适配的方法
评分
查看全部评分