前言
最近在验证去年画好的一套板子,因为是验证,大概齐看看有没有问题。
采用STM32CubeMX生成的HAL库工程框架来测试。各种例子CubeMX包里面都有。
发现一个奇怪的问题,外部时钟时钟初始化很少能通过。导致只能使用HSI+LSI来编程。
当时没在意,就是以为元件问题(晶振和起振电容货不好,精度不合规,或者我焊工太差)。
这几天又做了一块BMS板子,又发现外部时钟初始化过不了。
上网一查,好像很多同学都说有问题。工作计划里面,我都考虑使用外部有源晶振来提供时钟了。
看了一眼ST官方的晶振设计文档(en.CD00221665.pdf AN2867),讲究蛮多的。但是只要元件(晶振+2个起振电容)质量是正品,值不错,精度够,布线讲究,还不能起振,那还真不知所措。
晶振这块的布线,已经很注意了。虽然没有ST官方晶振指南布线那么讲究,也说的过去。见过很多布线不讲究的板子,人家板子也跑的好好的。
用CubeMX生成测试程序后,点了一个LED灯,就这么简单的程序。
发现在时钟初始化时,老是过不去,HAL_RCC_OscConfig()会失败。
因为是打样板子,没有做钢网过炉子。自己借助显微镜来手工焊接。是自己手笨将晶振焊接坏了?
x2是OSC 3215-2P,起振电容为10pf
x1是OSC 5032-2P,起振电容为20pf
连续换了4轮晶振元件(x1,x2, c6,c7,c35,c36),焊接上,用CubeMX生成的测试工程测试,都过不了时钟初始化HAL_RCC_OscConfig()那里。
以为是自己焊接功力不行,联系好同事(他专职焊工,有10+年经验)让他搞,然后我再测试。
正好他去现场了,我继续找资料。
当看到 https://blog.csdn.net/u012564117/article/details/93969372时,有点被电到的感觉。
马上回头去看CubeMX向导。
晶振选择为3种:
Disable 这个是不用外部晶振
Crystal/Ceramic Resontor 这个是用无源外部晶振
BYPASS Clock Source 这个是有源外部晶振
这段时间我用CubeMX生成测试工程,晶振这块选的都是 “BYPASS Clock Source”。这事弄的,真丑陋。。。
正好实验板已经带来了(准备让同事帮焊接晶振),马上接上12V电池包,开始试验。好使!时钟初始化过了,LED灯亮灭都好使…
一个人玩确实不好,好多问题自己一个人想,都想偏了,犯一些低级错误。
我们以前工程都是固件库编程,有些手头的实验板都是寄存器编程。没有HAL库的积累。赶上验证板子时,都没有一个靠谱的测试程序。都是眼泪。
回想起焊接晶振那块,因为有显微镜加持,焊接质量不敢说太好,还过的去吧,焊接时间也就几秒,也不会轻易将元件烧毁。还是要相信自己。哪有问题找哪里。
不过自己长时间搞不定的事情,还是要怀疑一下自己,去借鉴下网上其他同学的经验。
以前产品也出过一些,从来没发现STM32的MCU晶振不起振。可能还是出货量不到那个级别吧。
看网上其他同学,在出货量巨大时,还是会发现用无源晶振会有概率不起振。有的同学说,已经参照了ST官方的晶振设计手册,还是会不起振。
下次,如果再弄板子,而且价格不敏感,准备上4脚的贴片有源晶振了。
8MHZ和32.768KHZ的价格,在力创上看了,大概3~4元一只。那一个MCU成本就加10元(主/副晶振),像我这套板子,用了6个MCU. 成本就加60元。