拿到這樣的需求,我們當(dāng)然是先得保證通訊正常。于是我找了一個(gè)USB例程與一個(gè)CAN例程,分別調(diào)試驗(yàn)證。
經(jīng)過(guò)幾番折騰已經(jīng)保證了USB與上位機(jī)能正常通訊了,也能保證了CAN的正常收發(fā)(拿了兩塊開(kāi)發(fā)板做驗(yàn)證)。
兩頭都沒(méi)有問(wèn)題了,再加上一些數(shù)據(jù)處理就差不多完成了。USB與CAN我都是第一次用,沒(méi)想到那么順利,美滋滋,正準(zhǔn)備放松的時(shí)候,問(wèn)題就來(lái)了。這是一個(gè)整體的東西,最終都要把這兩部分集合起來(lái)吧。
我把CAN工程里關(guān)于CAN的部分移到USB工程里,這時(shí)候CAN竟然用不了了。這時(shí)候我就開(kāi)始在懷疑自己是不是手賤誤刪了哪里了,于是重新來(lái)一遍,發(fā)現(xiàn)還是不行。
查了代碼很久也沒(méi)找出什么錯(cuò)誤了,于是決定先不找錯(cuò)誤了,進(jìn)度要緊,這時(shí)候覺(jué)得應(yīng)該是工程哪里有問(wèn)題了,先想其它辦法避過(guò)這個(gè)問(wèn)題。
于是乎我就換著來(lái),我把USB的工程里關(guān)于USB的部分移到CAN工程里。大家猜一猜發(fā)生了什么?USB竟然打都打不開(kāi)!要炸了。。但是這時(shí)候已經(jīng)很明確肯定不是移植問(wèn)題了。CAN部分首先想到了波特率是不是對(duì)不上了,USB部分首先想到USB的時(shí)鐘是從哪來(lái)的,之前沒(méi)用過(guò)也沒(méi)仔細(xì)看。帶著這兩個(gè)問(wèn)題去查看了參考手冊(cè)與代碼,果然,STM32F429的USB的時(shí)鐘還真有點(diǎn)特殊(不知道其它芯片是不是也是這樣),其來(lái)自于PLL輸出,而不是我們熟知的APB1、APB2:
從時(shí)鐘樹(shù)中我們可以看出:(1)的輸出是系統(tǒng)時(shí)鐘,(2)的輸出是USB時(shí)鐘。相關(guān)公式:
當(dāng)然(2)的輸出不僅僅是給USB提供時(shí)鐘,還給RNG與SDIO提供時(shí)鐘:
這一部分對(duì)應(yīng)的代碼在system_stm32f4xx.c中。下面看看USB工程、CAN工程中該文件的差別:
可見(jiàn),問(wèn)題找出來(lái)了。在USB工程中,CAN通訊不正常是因?yàn)橄到y(tǒng)時(shí)鐘降為168MHz,導(dǎo)致APB1時(shí)鐘變?yōu)?2MHz,而代碼中是用APB1=45MHz來(lái)計(jì)算CAN的波特率的,所以導(dǎo)致波特率對(duì)應(yīng)不上導(dǎo)致CAN通訊錯(cuò)誤。
在CAN工程中,系統(tǒng)時(shí)鐘為180MHz,USB OTG FS時(shí)鐘變?yōu)?1MHz,超過(guò)了正常的48MHz,導(dǎo)致USB不能正常工作。
所以,每當(dāng)用到USB,都得單獨(dú)配置PLLCLK = 168MHz了,這樣的話(huà)其他外設(shè)可能得改變?cè)械呐渲?,比如這里的CAN就得用APB1=42MHz來(lái)計(jì)算波特率了,否則就會(huì)出錯(cuò)。這很不方便。。
正如野火火哥說(shuō)的,這是ST的一個(gè)奇葩設(shè)計(jì)。
所以,大家以后再使用USB的時(shí)候當(dāng)心這個(gè)陷阱!
-
usb
+關(guān)注
關(guān)注
60文章
8184瀏覽量
272879 -
CAN
+關(guān)注
關(guān)注
57文章
2920瀏覽量
467791 -
STM32
+關(guān)注
關(guān)注
2293文章
11032瀏覽量
364876
發(fā)布評(píng)論請(qǐng)先 登錄
求助,求分享STM32F429用IAR做的外部SPIFLASH下載算法例程
使用STM32的SPI主機(jī)通訊需要喚醒嗎?
變頻器輸出波形不正常原因及解決方法

使用STM32F429來(lái)讀寫(xiě),讀出來(lái)確是不固定的一個(gè)值,為什么?
STM32模擬eeprom只有起始地址0x8001000正常其他地址都會(huì)造成單片機(jī)運(yùn)行不正常怎么回事
伺服電機(jī)振動(dòng)不正常原因和維修及案例分析

評(píng)論