【STM32】一次F105 USB OTG驱动填坑记录
使用MCU為STM32F105VC,新建工程,使用Keil 自帶ST?std庫(kù),以及ST Legacy usb otg?庫(kù),
問(wèn)題一為VBUS檢測(cè)的設(shè)計(jì)疏漏
問(wèn)題二為usb device無(wú)法正常枚舉,使用庫(kù)中參考工程也是一樣情況,使用CubeMX生成工程驗(yàn)證了硬件正常,
最終使用Legacy工程和HAL工程運(yùn)行對(duì)比工作狀態(tài)發(fā)現(xiàn)Legacy中的異常狀態(tài),檢查各處差異,發(fā)現(xiàn)驅(qū)動(dòng)中讀取到的系統(tǒng)時(shí)鐘數(shù)值異常,跟蹤時(shí)鐘初始化代碼并對(duì)于CubeMX中時(shí)鐘樹,發(fā)現(xiàn)整個(gè)usb的時(shí)鐘都是異常的,按照CubeMX中的值調(diào)整后一切恢復(fù)正常。
問(wèn)題根源為Keil中CMSIS CORE文件中bug,計(jì)算中默認(rèn)認(rèn)為F10x CL系列單片機(jī)使用25M晶振,導(dǎo)致PLL倍頻因子計(jì)算錯(cuò)誤,最終導(dǎo)致usb時(shí)鐘異常。
#ifdef STM32F10X_CL/* Configure PLLs ------------------------------------------------------*//* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz *//* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);按照HSE為8M來(lái)計(jì)算,將分頻和倍頻因子分別改為2和10.
總結(jié)
以上是生活随笔為你收集整理的【STM32】一次F105 USB OTG驱动填坑记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android tuner 教程,真正免
- 下一篇: 图像修复:Object Removal