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

[复制链接]
4164|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解决不了这个问题
李富贵 发表于 2011-11-1 22:28 | 显示全部楼层
那就干掉CMSIS的SystemInit(),自己写一个吧。
网络转接 发表于 2011-11-1 23:54 | 显示全部楼层
楼主真逗
ccmc 发表于 2011-11-2 08:24 | 显示全部楼层
楼主真可爱.....................
icecut 发表于 2011-11-2 13:18 | 显示全部楼层
原来如些
easy_eric 发表于 2011-11-2 15:02 | 显示全部楼层
到底怎么好呢
yfstudio 发表于 2011-11-2 15:14 | 显示全部楼层
学习一下,没看明白。
zhqs425 发表于 2011-11-2 15:17 | 显示全部楼层
学习一下!
dragon20100708 发表于 2011-11-12 13:36 | 显示全部楼层
学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

368

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部