最近某项目需要用到usb与can:
拿到这样的需求,我们当然是先得保证通讯正常。于是我找了一个usb例程与一个can例程,分别调试验证。
经过几番折腾已经保证了usb与上位机能正常通讯了,也能保证了can的正常收发(拿了两块开发板做验证)。
两头都没有问题了,再加上一些数据处理就差不多完成了。usb与can我都是第一次用,没想到那么顺利,美滋滋,正准备放松的时候,问题就来了。这是一个整体的东西,最终都要把这两部分集合起来吧。
我把can工程里关于can的部分移到usb工程里,这时候can竟然用不了了。这时候我就开始在怀疑自己是不是手贱误删了哪里了,于是重新来一遍,发现还是不行。
查了代码很久也没找出什么错误了,于是决定先不找错误了,进度要紧,这时候觉得应该是工程哪里有问题了,先想其它办法避过这个问题。
于是乎我就换着来,我把usb的工程里关于usb的部分移到can工程里。大家猜一猜发生了什么?usb竟然打都打不开!要炸了。。但是这时候已经很明确肯定不是移植问题了。can部分首先想到了波特率是不是对不上了,usb部分首先想到usb的时钟是从哪来的,之前没用过也没仔细看。带着这两个问题去查看了参考手册与代码,果然,stm32f429的usb的时钟还真有点特殊(不知道其它芯片是不是也是这样),其来自于pll输出,而不是我们熟知的apb1、apb2:
从时钟树中我们可以看出:(1)的输出是系统时钟,(2)的输出是usb时钟。相关公式:
当然(2)的输出不仅仅是给usb提供时钟,还给rng与sdio提供时钟:
这一部分对应的代码在system_stm32f4xx.c中。下面看看usb工程、can工程中该文件的差别:
可见,问题找出来了。在usb工程中,can通讯不正常是因为系统时钟降为168mhz,导致apb1时钟变为42mhz,而代码中是用apb1=45mhz来计算can的波特率的,所以导致波特率对应不上导致can通讯错误。
在can工程中,系统时钟为180mhz,usb otg fs时钟变为51mhz,超过了正常的48mhz,导致usb不能正常工作。
所以,每当用到usb,都得单独配置pllclk = 168mhz了,这样的话其他外设可能得改变原有的配置,比如这里的can就得用apb1=42mhz来计算波特率了,否则就会出错。这很不方便。。
正如野火火哥说的,这是st的一个奇葩设计。
所以,大家以后再使用usb的时候当心这个陷阱!
如何测试最大输出电流?纳米软件带你了解
硅谷风险投资人看好VR 成为主流技术势在必得
多地“拉闸限电”,隐藏着三大原因
盘点联建光电等企业在Mini LED领域的成果
瑞萨电子强化全球采购体系,重点强化大陆业务
STM32F429的USB工程CAN通讯不正常经验分享
一文解析桥式整流电路
新汉完整数字告示解决方案
电动车频“起火”!蔚来、宁德相互“甩锅”,已引起政府部门关注
芯讯通携摩摩哒共享按摩椅精彩亮相MWCA
污水流量流速液位在线监测系统有些什么配置
电脑死机画面卡住不动
通讯网络能否真正“提速降费”
接插件,电连接器的选择方法
加速智能制造:机器人产业“十三五”路线图将出
5G时代下XR的挑战与机遇探讨
紫光超级智能工厂项目在郑州高新区开工
射频电路如何选择合适的电容器
利用机器学习快速识别漏洞
美国消费者购买皮卡总数已接近特斯拉去年全球交付量