对ST提供的标准代码,我们做了一个小改动。
改动虽小,却大有讲究。
话说,几天前,经过一番研究,
没有从芯片厂家获得官方的代码库。
决定自力更生,今天开始在ST提供的system_stm32f0xx.c做一些修改。
使得开源代码扫描blackduck不再匹配上ST的代码。
同时,在代码中增加了使能读保护的功能。
在做代码修改时,想起来几年前对st提供的代码做了一个小修改。
1) 在设置系统时钟之前,做好watchdog的设置,同时使用watchdog。
2) 在使能外部时钟,并检测外部时钟是否ready时,注释掉超时判断的变量。
这个改动基于以下的考虑:
1) 对于ST的代码,如果在超时时间内没有检测到外部时钟ready,则退出等待并且切换到内部时钟。
2) 内部时钟精度比较差,精度受温度影响比较大。在全温度范围内仅能做到5%左右的精度。
3) 外部晶振在上电过程中可能因为时序会出现不起振的情况。
4) 如果切换到内部时钟,应用程序没有再进一步检测ready状态以及HSE相关的寄存器,根据应用逻辑很难判断是否使用内部时钟。
5) 串口以及我们类似KNX的通信对时钟精度要求比较高,当精度低于3%时,可能导致误码。
经过我们这一改动,如果外部晶振因为上电时序等原因,不能启动,则会发生看门狗超时,导致处理器重新上电,同时晶振部分电路也会重新初始化,达到了检测错误,同时出错重试的目的。
当使用st的代码库时,不能闭着眼睛使用,应该深入了解实现代码,特别应该分析代码的异常处理是否有问题。