打印

V3.5库函数对F103初始化可能存在的风险

[复制链接]
2969|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
seawwh|  楼主 | 2011-11-1 14:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
V3.5库函数对F103初始化可能存在的风险
在IAR隐含的启动代码中(main 运行之前),调用了system_stm32f10x.c/SystemInit程序
其中有一个SetSysClock()子程序;这个子程序是假定你的外部时钟是8M的情况下设置时钟的。
如果你的板子使用的是8M外部时钟,那么SetSysClock会将MCU初始化到72M运行,
但是如果你的板子的外部时钟,高于8M,例如是16M,那么会将MCU初始化到144M运行。
我的某项目是使用16M外部时钟的,在main()之后按照16M对PLL做了设置,MCU运行在72M.
显然这样是存在风险的,上电后MCU 的运行时钟变化如下:
    8M(内部时钟)->144M->72M
当然144M运行的时间很短,但是MCU按照这个速度访问Flash 是不安全的!
个人认为,如果外部时钟高于8M的话,应该去掉SetSysClock()子程序。
也许应该这样来写SetSysClock()子程序:
1. 利用 HSI 校准 LSI
2. 利用 LSI 估算 HSE 大致的频率;
3。决定 PLL 的倍频系数;
或者: 在PLL倍频的时候考虑到HSE_VALUE的值。
评分
参与人数 1威望 +4 收起 理由
香水城 + 4 有道理
沙发
grissiom| | 2011-11-1 20:30 | 只看该作者
把 SystemInit 代码改了不就成了么…… 反正手里也有源代码……

使用特权

评论回复
板凳
李富贵| | 2011-11-1 21:05 | 只看该作者
3.x的库根本不需要你配置RCC,如果你的时钟不是8M,找到这句话,改了完事了呗。
  #define HSE_VALUE    ((uint32_t)8000000)

使用特权

评论回复
地板
seawwh|  楼主 | 2011-11-1 22:18 | 只看该作者
回3楼:
  SetSysClock()子程序并没有考虑到HSE_VALUE的值。
So, 修改HSE_VALUE解决不了这个问题

使用特权

评论回复
5
李富贵| | 2011-11-1 22:28 | 只看该作者
那就干掉CMSIS的SystemInit(),自己写一个吧。

使用特权

评论回复
6
网络转接| | 2011-11-1 23:54 | 只看该作者
楼主真逗

使用特权

评论回复
7
ccmc| | 2011-11-2 08:24 | 只看该作者
楼主真可爱.....................

使用特权

评论回复
8
icecut| | 2011-11-2 13:18 | 只看该作者
原来如些

使用特权

评论回复
9
easy_eric| | 2011-11-2 15:02 | 只看该作者
到底怎么好呢

使用特权

评论回复
10
yfstudio| | 2011-11-2 15:14 | 只看该作者
学习一下,没看明白。

使用特权

评论回复
11
zhqs425| | 2011-11-2 15:17 | 只看该作者
学习一下!

使用特权

评论回复
12
dragon20100708| | 2011-11-12 13:36 | 只看该作者
学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

368

帖子

0

粉丝