0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F429的USB工程CAN通讯不正常经验分享

汽车玩家 来源:嵌入式大杂烩 作者:嵌入式大杂烩 2020-04-04 17:32 次阅读

最近某项目需要用到USBCAN

STM32F429的USB工程CAN通讯不正常经验分享

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

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

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

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

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

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

STM32F429的USB工程CAN通讯不正常经验分享

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

STM32F429的USB工程CAN通讯不正常经验分享

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

STM32F429的USB工程CAN通讯不正常经验分享

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

STM32F429的USB工程CAN通讯不正常经验分享

STM32F429的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的一个奇葩设计。

STM32F429的USB工程CAN通讯不正常经验分享

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    60

    文章

    7891

    浏览量

    263976
  • CAN
    CAN
    +关注

    关注

    57

    文章

    2715

    浏览量

    463365
  • STM32
    +关注

    关注

    2266

    文章

    10871

    浏览量

    354787
收藏 人收藏

    评论

    相关推荐

    stm32f429如何把变量定义到sdram中去?

    最近搞stm32f429,请教如何把变量定义到sdram中去?能够同时使用内部的sram和外部的sdram吗?
    发表于 05-15 07:54

    STM32F429 AD采集出的数据波动很大是哪里的问题?

    STM32F429 AD采集稳压源335V,得出来的数据偏差幅度很大,能从339-349V变化,怎么可能?还有,这款单片机AD不支持校准。现在怀疑它波动大的原因是 AD的问题,有没有同样的看法?
    发表于 05-14 07:42

    STM32F429开发板只能插电脑USB供电接口LCD才能显示,为什么?

    手中一块STM32F429 Disvovery开发板,在插入电脑USB接口的情况下,LCD正常显示图片内容。将USB供电线插到充电宝、充电器上就无法
    发表于 04-29 07:04

    stm32f429 USB Host HID键盘枚举成功读取键值失败的原因?怎么解决?

    求助大神,手上一块stm32f429的板子,作为USB host连接USB键盘,使用cubemx生成工程文件,在主循环内添加键值处理程序,现在的问题是通过串口打印调试信息显示,
    发表于 04-28 07:18

    请问STM32F429硬件IIC需要外围上拉电阻吗?

    如题,STM32F429使用IIC通信的时候,是否需要外加上拉电阻? 看过很多资料,都说是需要上拉电阻,让人郁闷的是,这次设计硬件的时候,偏偏忘记了加,于是乎我进行了测试, //使能IO引脚
    发表于 04-24 06:35

    如何维修安捷伦N8946电源输出不正常

    。其电压输出范围为0至200V,电流输出范围为0至140A,最大输出功率为10000W。同时,该电源支持340–440 VAC的交流输入电压范围。 维修安捷伦N8946电源输出不正常 安捷伦N8946电源输出不正常时,可以尝试以下步骤进行维修: 检查电源输入:首先确认电源
    的头像 发表于 04-23 18:07 684次阅读
    如何维修安捷伦N8946电源输出<b class='flag-5'>不正常</b>

    stm32f429 FMC地址总线的疑问求解

    stm32f429单片机,使用FMC操作并行总线。其中地址总线上主设备为f429,从设备为一个fpga和两个存储器,地址总线经5.1K电阻上拉。 经示波器测试,观察到下面的异常现象: 当读控制信号
    发表于 04-11 07:58

    STM32F429做的PIL仿真速度非常慢的原因?

    各位大神好, 本人用MATLAB/SIMULINK搭建了小型直流电力系统。系统包含三个直流转换器。相关三个控制器被载入STM32F429中,从而与SIMULINK构成PIL仿真。仿真运行一切正常
    发表于 04-11 07:28

    stm32f429 can1通讯使用hal发送数据不稳定怎么解决?

    stm32f429 can1通讯,使用hal库配置工程,发送数据不稳定,发送几十个包才有一俩正常发送,但是使用标准库就可以
    发表于 04-02 06:04

    通过stm32f429 usb host hid发送命令控制hid设备,能枚举不能发送数据的原因?

    大家好,这个问题一直困扰了我好久,我的下位机是hid设备,已经做好无法改变,我想通过stm32f429 usb host hid发送命令控制它,枚举都成功了,就是不能发送数据,我不知道什么原因,有什么好的建议吗?我用的是USBH_HID_SetReport函数
    发表于 03-28 09:14

    STM32F103C8T6 CAN发送数据波形不正常的原因?

    大家好,STM32F103C8T6关于CAN发送数据波形不正常的问题。
    发表于 03-27 08:27

    STM32F429工程标准库移植到HAL库后中断向量表异常的原因?

    STM32F429工程标准库移植到HAL库后中断向量表异常
    发表于 03-20 06:02

    STM32F373使用flat类型不正常,为什么?

    STM32F373使用flat类型不正常
    发表于 03-18 07:20

    stm32f429 fatfs分了4个区,usb_hs挂载后4个都显示出来了,如何用代码控制显示其中的几个?

    如题 板子是stm32f429。开发环境stm32cubemx+keil,用的HAL库,裸机no_os fatfs分了4个区,读写正常usb_hs挂载后4个都显示出来了,读写也
    发表于 03-08 07:24

    请问stm32f429如何改内部rc时钟工作?

    stm32f429标准库如何改内部rc时钟工作?
    发表于 01-17 06:25