STM32F1 F4 USB 工程更新

現(xiàn)狀

  • 基于STM32CubeMX的F103/F40X的USB堆棧測試完畢氨淌;
  • 基于Mbed OS的F103/F40X的USB堆棧測試完畢必峰;
  • 主要測試USB CDC設(shè)備;
  • 基于USB ACM/CDC實(shí)現(xiàn)nRF24L01及類似“小無線”系統(tǒng)集成;
  • 基于USB ACM/CDC開發(fā)了VT100 cmdline
  • 基于USB ACM/CDC和cmdline實(shí)現(xiàn)SPI NOR Flash的讀寫洁段;
  • 基于USB ACM/CDC開發(fā)HCI定制協(xié)議;
  • 基于Linux udev的USB設(shè)備插入拔出時(shí)間的檢測质欲;

計(jì)劃

  • 開發(fā)其他TLV類型二進(jìn)制協(xié)議和基于字符串的JSON RPC等協(xié)議树埠;
  • 實(shí)現(xiàn)xmodem傳輸;
  • 實(shí)現(xiàn)I2C設(shè)備掃描與訪問把敞;
  • 更新現(xiàn)有的LoRaPHY/Aloha/LoRaWAN USB Dongle弥奸;
  • 支持C8T6/RCT6等多種核心板,以應(yīng)對更加復(fù)雜的堆棧奋早;
  • 支持USB ECM盛霎,以直接支持6LowPAN等物聯(lián)網(wǎng)設(shè)備;
  • 集成Arduino STM32的Bootloader實(shí)現(xiàn)固件升級耽装。

開源設(shè)計(jì)與板級產(chǎn)品

  • 大部分設(shè)計(jì)都是開源設(shè)計(jì)愤炸;
  • 或有根據(jù)客戶要求定制進(jìn)行設(shè)計(jì);

代碼設(shè)計(jì)過程

以下內(nèi)容針對Mbed C++和STM32F103/F407

今天完成的主要是在USB通道上實(shí)現(xiàn)VT100 cmdline掉奄,可以通過TeraTerm終端來配置管理設(shè)備规个,或者通過專門的cmd/GUI上位機(jī)程序?qū)崿F(xiàn)自動化配置。最早基于C和串口姓建,在Mbed Serial類上移植也很容易诞仓。但是在USB信道上實(shí)現(xiàn)cmdline很花費(fèi)了一些時(shí)間,且有了反復(fù)速兔。主要原因是USB對象初始化的特殊性墅拭,以及Mbed C++與基于標(biāo)準(zhǔn)庫或HAL庫的原始設(shè)計(jì)的差異所造成的。

基于標(biāo)準(zhǔn)庫或者HAL庫的模板一般是:

  • 將所需硬件資源(串口涣狗、GPIO)聲明為main的全局變量
  • 將USB聲明為 extern 全局變量
  • 在主函數(shù)中配置時(shí)鐘谍婉,初始化這些硬件資源
  • 展開應(yīng)用邏輯

發(fā)現(xiàn)STM32 CubeMX的USB實(shí)例是usb_device.c中的全局變量。 這和一般的硬件資源如GPIO/ADC/PWM/CAN/UART都有所不同镀钓。

// Private in main.c
CAN_HandleTypeDef hcan;
RTC_HandleTypeDef hrtc;
UART_HandleTypeDef huart1;

int main(void){
  HAL_Init();
  SystemClock_Config();  // RCC init before any other resources
  MX_GPIO_Init();
  MX_CAN_Init();
  MX_USART1_UART_Init();
  MX_RTC_Init();
  MX_USB_DEVICE_Init();  // USB init here
  while(1){
    ...
  }
}

main.c

USBD_HandleTypeDef hUsbDeviceFS;

void MX_USB_DEVICE_Init(void)
{
  USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);
  USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC);
  USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);
  USBD_Start(&hUsbDeviceFS);
}

usb_device.c

extern USBD_HandleTypeDef hUsbDeviceFS;

usb_device.h

而基于Mbed C++有些特殊穗熬。

DigitalOut myled(DBG_LED);  // See main.h for hardware issue
cmdline cmdhandler;
// You can put USBSerial/USBTerminal here, but will not be enumerated in F103
//USBSerial usbSerial(0x1f00, 0x2012, 0x0001,  false); 
USBTerminal *term;

int main(){
  confSysClock();  // RCC init first
  Serial    uart(PA_9, PA_10, 115200);
  //USBSerial usbSerial(0x1f00, 0x2012, 0x0001,  false); 
  USBTerminal usbSerial(0x1f00, 0x2012, 0x0001,  false);
  term = &usbSerial;  
}

main.cpp

USB對于時(shí)鐘是非常敏感的,所以必須在系統(tǒng)時(shí)鐘配置正確后才能夠產(chǎn)生USB對象丁溅。

在Mbed C++中祖搓,在調(diào)用main函數(shù)之前餐弱,進(jìn)行時(shí)鐘配置和對象實(shí)例化盛险。RCC時(shí)鐘配置隱藏在Mbed Library中缨该,如果對象在Main函數(shù)之外,視為公有對象饰序,也在main函數(shù)之前進(jìn)行實(shí)例化领虹。

如果將USB對象作為公有對象,F(xiàn)407工作正常求豫,而F103工作不正常塌衰,表現(xiàn)在枚舉失敗诉稍。換而言之,在F407代碼中最疆,可以將USBSerial/USBTerminal在main函數(shù)之外聲明杯巨,且工作正常。但是F103代碼中努酸,同樣的代碼服爷,編譯通過,但是枚舉失敗获诈。

所以第三方開發(fā)者打了一個(gè)補(bǔ)丁仍源,在main函數(shù)中增加了一個(gè)confSysClock()。有興趣的話舔涎,可以查看RCC寄存器的數(shù)值笼踩。

由于時(shí)鐘是main函數(shù)中調(diào)用的,間接造成USB對象(USBSerial及其子類USBTerminal)是main函數(shù)中的對象亡嫌,其他模塊和函數(shù)無法訪問嚎于。

解決方法是在main.cpp中預(yù)留一個(gè)USB對象指針,讓其他函數(shù)和其他模塊可以訪問到USB對象挟冠。代價(jià)是USB對象的所有方法必須采用“->”來訪問于购。這也就導(dǎo)致了基于Serial對象和USB對象的代碼存在兩套,這實(shí)在違背了OOP的原則知染。

由此看來肋僧,基于Serial對象,基于F103的USBSerial持舆,基于F407的USBSerial的通道色瘩,居然出現(xiàn)了兩套(確切地說是2.5套)代碼伪窖。這種情況可能同樣會影響到其他協(xié)議逸寓,包括HCI/SIP/TLV/JSON等。

對于ARM來說覆山,USB不是IoT的一部分竹伸。他們的IoT/Connectivity主要包括的是Cellular Modem/WiFi/BLE/LoRaWAN/BLE/TLS/MQTT等。

要合并代碼簇宽,還需要開發(fā)者自己動手勋篓。要么統(tǒng)一為指針類型;要么期待Mbed底層得到修改魏割。然而這些代碼都是基于Mbed 2譬嚣,而Mbed 5并沒有對USB堆棧進(jìn)行維護(hù)。需要開發(fā)者自己Backport钞它。代碼在此:ARM Mbed OS STM32F103的系統(tǒng)時(shí)鐘配置代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拜银,一起剝皮案震驚了整個(gè)濱河市殊鞭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尼桶,老刑警劉巖操灿,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泵督,居然都是意外死亡趾盐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門小腊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來救鲤,“玉大人,你說我怎么就攤上這事秩冈⊙鸭颍” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵漩仙,是天一觀的道長搓茬。 經(jīng)常有香客問我,道長队他,這世上最難降的妖魔是什么卷仑? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮麸折,結(jié)果婚禮上锡凝,老公的妹妹穿的比我還像新娘。我一直安慰自己垢啼,他們只是感情好窜锯,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芭析,像睡著了一般锚扎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上馁启,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天驾孔,我揣著相機(jī)與錄音,去河邊找鬼惯疙。 笑死翠勉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的霉颠。 我是一名探鬼主播对碌,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蒿偎!你這毒婦竟也來了朽们?” 一聲冷哼從身側(cè)響起克伊,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎华坦,沒想到半個(gè)月后愿吹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惜姐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年犁跪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歹袁。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坷衍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出条舔,到底是詐尸還是另有隱情枫耳,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布孟抗,位于F島的核電站迁杨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凄硼。R本人自食惡果不足惜铅协,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摊沉。 院中可真熱鬧狐史,春花似錦、人聲如沸说墨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尼斧。三九已至姜贡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間突颊,已是汗流浹背鲁豪。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工潘悼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留律秃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓治唤,卻偏偏與公主長得像棒动,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子宾添,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 盡管javascript里有大量內(nèi)建引用對象船惨,很可能你還說會頻繁創(chuàng)建自己的對象柜裸。當(dāng)你在這么做的時(shí)候,記得javas...
    WanLum閱讀 525評論 1 3
  • 程序員創(chuàng)業(yè)白皮書 作者:Paul Graham Paul Graham是程序員粱锐,專欄作家疙挺。他在1995年創(chuàng)建了第一...
    劉立山John閱讀 1,853評論 0 20
  • 自然衝擊療法由丁愚仁老師發(fā)明,又稱「禪拍」怜浅,「拍打」铐然,"自然拍打"。 丁師及其團(tuán)隊(duì)總結(jié)經(jīng)驗(yàn)恶座,不同的各種病癥(含絕癥...
    YouAreMyMusic閱讀 2,243評論 0 4
  • 《達(dá)爾文所未知的》解說詞 撰寫(Written):阿爾芒·馬裏耶(The Animal Mother) 翻譯(Tr...
    JENTSON閱讀 1,286評論 0 1
  • 我喜歡你 盡管你是個(gè)好女孩 你不抽煙你不喝酒 你溫柔你漂亮 你顛覆了我搀暑,一切喜歡人的標(biāo)準(zhǔn) 可這樣,我還是喜歡你
    yukhaCHAN閱讀 91評論 0 0