以前我從我自己所參與的Scanner SOC 中,開始介紹關於USB DIY 。
後來我改用一般 八位元的8051 Based 帶USB 介面的MCU 繼續講USB DIY。
隨著時代推進,現在其實大家可能都慢慢地改用 32 bits 的ARM MCU 了。
好像如果我沒有繼續用這一類的MCU 來講USB DIY 的話,又好像跟不上時代。
當然啊,我也不年輕了,學東西也永遠學不完的啦,只是如果沒有把這一塊
系統文章補齊的話,就好像人生有點缺憾似的。
其實我這幾年也有一直使用32 bits MCU,尤其是 STM32 這一族系。
不想寫這方面的開箱文或相關技術文章,是因為這一類文章在網路上
幾乎已經是汗牛充棟了,真的也沒差我一個人來寫甚麼,而我大部分在寫
STM32 程式時,也都是從網路上參考其他網路作者的做法,也真的很方便,現在
寫韌體程式在網路上真的有太多的參考原始碼讓你使用,搞這些系統開發時,
就好像在堆積木一樣,就找一些合適的副程式庫,慢慢地拼湊到系統應用中。
可以很快又很方便的打通一些在底層與MCU 基本架構的建構。有時候覺得
好像不是在搞系統,而是在一台小型PC 上寫應用軟體似的,不過幸好的是:
這一類的系統應用還是跟PC 應用有點差異的,有時候還是跟系統硬體或很基礎
的小型系統平台息息相關。所以以前那一種在八位元寫韌體的技巧還是非常受用的。
包括:開發平台的建立與熟悉度,系統除錯或測試驗工作也都蠻駕輕就熟的。
我想這應該我們這些老一輩的系統工程師還有一點剩餘價值吧。所以才能繼續
存活至今吧。
----
但關於USB 系統應用的東西,還是一樣不變的,因為還是牽涉到許多與USB 規格
與相關應用上限制問題。當然啊,這些原廠或網路上的開箱文或是開放原始碼
還是一堆的。只是有很多也都只是剪下、貼上,也沒有多交代甚麼。
當然啊,如果是標準USB Class 的東西,我也覺得沒甚麼好說的:像是隨身碟
的MSDC(Mass-Storage Device Class)、串列通訊的 Virtual COM 或是 DFU
(Device Firmware Upgrade) 等,這些東西就是死的,只要原廠釋出的參考原始碼,
直接套用,大家也就不用需要認真的學USB ,反正會動交差就可以了。
但偏偏這種Custom HID 介面還是最麻煩的,因為這個除了基本USB 架構外,
還是牽涉到每一個USB 系統問題,也常常會隨著系統應用不同,而有所不同,
尤其這一類的USB 系統應用也都會牽涉到獨特的PC 端系統應用程式的不同
而有所不同。所以如果沒有真正搞清楚這一種USB 應用介面的話,在系統應用
上也就無法隨心所欲的因應不同的系統開發要求而做有效的韌體與PC 應用軟體
的整合系統開發了。
還有一點的是:這一類網路文章就真的不多了,一來這方面都不是一篇、兩篇
文章就可以交代清楚的,有時候還得要搭配PC 端的應用程式才有辦法講個完整
的來龍去脈的,或許就是因為如此,這些網友也就盡量避開不講,這也包括許多
學習開發版所附的參考原始碼,也很少有這一類的文章,所以我想我還把這一塊
的USB 系統應用做一個簡單的系列介紹,也算是給自己的USB DIY 系列文章
拼完最後的一塊版圖吧。
好吧,前言已經交代完畢了,就直接進入主題了。
-------------------
因為 STM32 這一系列的MCU 都帶有USB 周邊,而且市面上一大堆學習版或相關
開發工具或硬體電路板,貨色齊全又取得便宜方便...所以我就拿這個東西來講吧。
一般新進學習者一開始怕不知道哪個東西是最原始或最乾淨完整的,所以常常就會
從原廠釋出的原始資料開始看起或開始學起,所以我也就以這種情況開始說吧。
如果你是以前也就在用STM32 的,相信也可以很快進入狀況,不過晚學的有晚學的
好處,因為之前原廠的許多資料也都還沒有那麼完整或是程式碼可能也一直在修改
更新,到後來往往有時會陷於說:那我的系統平台也要不要跟著升級更新啊?
現在這個東西都已經慢慢成熟了,所以這些困擾可能會少一點吧。
首先我們來看原廠的相關資料:
目前原廠最新的參考程式碼庫是 V4.1.0。---
其中還有一項很重要的是原廠這些範例程式其實都有它自己搭配的開發硬體平台:
這個案子我選的是:STM3210B-EVAL 這一塊平台硬體。但講白了:已經這麼久的
東西,你要買還不一定容易買得到,而且也不便宜。所以,這一部份我們就可以
適度的調整一下。
因為我們只是針對USB 系統開發,我們可以找一些替代品來用:
下方那一片就是號稱最小的STM32 學習版,
我是不建議用那個像 Arduino mini 或 nano 那麼小的板子,它的外加環境又過少了。
像這一片至少還有獨立的 ST-LINK 及UART 專屬排針位置,這樣子就夠了。
另外因為原廠的Custom-HID 範例程式主要就是針對四個LED 及幾個按鍵作演示而已,
所以我們只要在外加一片LED 及按鍵模組板子就夠了。
但因為這一顆stm32F1xx 與原廠的那一片STM3210B-EVAL 的MCU 型號不同,所以你
在你的開發環境要重新設定:
另外你也只要修改一下:stm3210b_eval.c/stm3210b_eval.h 這個程式裡相關的硬體設定
就可以了。
---
我把它重新整理之後,重新組譯之後:如下圖下方所示:
程式碼長度約 8KBytes 左右,記憶體也都幾百個Bytes 而已,就可完成了。
(說來諷刺,以前我們在八位元搞系統時,常常對這一部分的數字都很敏感,
因為以前我們用的MCU 在這方面的資源都得要斤斤計較,但現在用這些MCU
就已經是其次了,趕快把系統搞定,總比花時間在那邊縮減程式碼還比較重要,
因為現在產品開發市場是講求時間與速度的...而且現在MCU 差那麼幾百個Bytes
價錢也沒差多少。重點還是工程師的青春歲月與使用壽命是有限的啦。)
然後你就可以用原廠的範例程式直接插入電腦,你就可以看到裝置管理員裡新增---
結語:因為是第一篇關於 STM32 USB DIY 系列的文章,我就不要講太多了,
先告一段落,後續再慢慢整理推出討論。謝謝各位了。
(待續)
自己成為專案負責人之後,才發現經驗傳承也不是容易的事情
回覆刪除負責規劃專案的時候就沒時間自己敲程式了,
即使我已經幫忙做開頭,給人家接下去
就拿上面USB 斷線的控制腳位來說,即使我向接手的同事解釋過N次,
這個斷線的功能一方面是可以用來自己準備好再通知host,
還可以讓usb重新連線用,
並解釋USB連線流程第一步是attach,不是usb reset...
講這些還是回到接手人的態度,
是想真的認識USB的原理,還是只想解決問題趕快下班呢
這很正常,你想教,別人未必想學。
刪除學會那麼多,還不是領一樣的錢,以後真正有需要再說吧。
搞不好,學越多,事情越多,反正有人看不下去時,自然就有人會接手啊。
以前賈老師在學校時,有些老師就不想接"班導師",就擺爛啊。把班級搞得雞飛狗跳的。
家長反應,學校長官看不下,自然下回就不會再找他接班導師。爽爽當科任老師啊。
反而認真的老師就辛苦了。你說世界公平嗎?習慣一點對自己還比較好一點吧。
你說:把它給Fired 掉好了。問題是誰要當壞人啊?薪水又不是你付的啊。
啊!我有責任啊~那很好啊~那就看長官挺不挺你啊?人走了,事情還不是沒人做啊。
不是嗎?
搞產品研發技術簡單,管理人難啊。