你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
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个回答
小小超
回答时间:2020-7-16 14:45:28
a0a.1 32b0c
晶振的频率,一般有函数可以直接获取到频率值。
评分
参与人数
1
蝴蝶豆
+2
收起
理由
STMCU
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
fighter12315
回答时间: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
评分
查看全部评分
评分
查看全部评分
@ts2000 用哪个函数可以 获取晶振频率啊,能否指导一下?
@ts2000 在哪可以看到识别晶振频率函数啊,能否指导一下?
以下是我猜的:能否通过timer捕捉HSI和HSE来比较?另一种是试错法,毕竟只支持三种频率。类似于频率自动适配,类似与uart的波特率自动适配的方法
评分
查看全部评分