STM32 | STM32F429的USB有坑?

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

最近某项目需要用到USB与CAN:

======001

拿到这样的需求,我们当然是先得保证通讯正常。于是我找了一个USB例程与一个CAN例程,分别调试验证。

经过几番折腾已经保证了USB与上位机能正常通讯了,也能保证了CAN的正常收发(拿了两块开发板做验证)。

两头都没有问题了,再加上一些数据处理就差不多完成了。USB与CAN我都是第一次用,没想到那么顺利,美滋滋,正准备放松的时候,问题就来了。这是一个整体的东西,最终都要把这两部分集合起来吧。

我把CAN工程里关于CAN的部分移到USB工程里,这时候CAN竟然用不了了。这时候我就开始在怀疑自己是不是手贱误删了哪里了,于是重新来一遍,发现还是不行。

查了代码很久也没找出什么错误了,于是决定先不找错误了,进度要紧,这时候觉得应该是工程哪里有问题了,先想其它办法避过这个问题。

于是乎我就换着来,我把USB的工程里关于USB的部分移到CAN工程里。大家猜一猜发生了什么?USB竟然打都打不开!要炸了。。但是这时候已经很明确肯定不是移植问题了。CAN部分首先想到了波特率是不是对不上了,USB部分首先想到USB的时钟是从哪来的,之前没用过也没仔细看。带着这两个问题去查看了参考手册与代码,果然,STM32F429的USB的时钟还真有点特殊(不知道其它芯片是不是也是这样),其来自于PLL输出,而不是我们熟知的APB1、APB2:

======002

从时钟树中我们可以看出:(1)的输出是系统时钟,(2)的输出是USB时钟。相关公式:

======003

当然(2)的输出不仅仅是给USB提供时钟,还给RNG与SDIO提供时钟:

======004

这一部分对应的代码在system_stm32f4xx.c中。下面看看USB工程、CAN工程中该文件的差别:

======005

======006

可见,问题找出来了。在USB工程中,CAN通讯不正常是因为系统时钟降为168MHz,导致APB1时钟变为42MHz,而代码中是用APB1=45MHz来计算CAN的波特率的,所以导致波特率对应不上导致CAN通讯错误。

在CAN工程中,系统时钟为180MHz,USB OTG FS时钟变为51MHz,超过了正常的48MHz,导致USB不能正常工作。

所以,每当用到USB,都得单独配置PLLCLK = 168MHz了,这样的话其他外设可能得改变原有的配置,比如这里的CAN就得用APB1=42MHz来计算波特率了,否则就会出错。这很不方便。。

正如火哥说的,这是ST的一个奇葩设计。

======007

所以,大家以后再使用USB的时候当心这个陷阱!

以上就是本次的笔记分享,如有错误,欢迎指出!


我的微信公众号:嵌入式大杂烩

在这里插入图片描述

  • 17
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式大杂烩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值