2020年10月25日 星期日

STM32_USB_DIY(一) --- Custom HID (一) :Project 建立

以前我從我自己所參與的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。


我主要是用最普遍、量大價格也最親民的 STM32F1XX 系列。所以他在V4.1.0 中所附的

標準周邊函式庫是 V3.6.1 版的。我知道很多大陸所提供的參考原始碼有很多都停留在

V3.5.0 版,你就自己比較新舊版之間差異,自行決定要不要跟上更新吧。

("做莊有做莊的好處",新學的有新學的好處,前面一句是香港電影台詞...)

它裡面也附有許多參考程式碼:


其中一項就是我們的主題:Custom HID 。你可以把這個目錄全部COPY 到你自己的

工作環境裡做測試開發工作。不過,這樣子所要面臨就是如何重新整理一下你自己的

開發平台環境了:


我用的是 Keil C 的開發工具平台。


所以你首先要做的就是如何重新整理這些開發平台環境了。

這個過程我認為是對一位工程師來說是一個很重要的經驗,或許我自己因為參與

過MCU 的IC 開發經驗,我覺得只會寫韌體程式不一定會很厲害,但懂得如何去整理

與建置屬於自己的開發環境與條件是一個非常重要的工作,因為未來你不會只寫或

參與一兩個系統的專案開發工作,而且有一天你的經驗也會讓你有經驗去帶領或

主持一個專案開發計畫,所以如何用自己的經驗或想法去建置一個屬於自己可以

管理的開發平台與環境,也是一項重要的訓練過程。

從上圖我們可以發現:原廠原來的檔案路徑包山包海,實在是太複雜了,

這種東西往往是日經月累堆積出來的,但對於我們這些新進或只想針對單一系列

的產品開發平台來說:太沉重了。

所以我就把它重新整理一下:也把許多落落長的路徑名稱給簡化了,這一部分你也可以

自己試試看,真的是一個很不錯的訓練機會。

---

其中還有一項很重要的是原廠這些範例程式其實都有它自己搭配的開發硬體平台:

這個案子我選的是: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

價錢也沒差多少。重點還是工程師的青春歲月與使用壽命是有限的啦。)

然後你就可以用原廠的範例程式直接插入電腦,你就可以看到裝置管理員裡新增

一項 HID 裝置了:


--
不過,你要留意的是:原廠的範例程式是有用一隻I/O Pin 來控制USB Enable 的:

就是控制USB 中的D+ Pull-up a 1.5K 電阻。


你就要留意你買的這一塊最小stm32 系統版有沒有這一根I/O pin。

我的這一片是直接用 3.3V 接 1.5K 到 USB D+。以我們的Custom HID 的應用來說

比較沒差,也是可以直接用的。

(PS : 一般會用到這一種的是系統比較龐大,而且是使用USB 5V 供電的,因為

系統初始化過程比較久,我們都希望先從用USB 5V 取電讓Embedded 系統初始化之後,

再讓USB 介面連接起來,才會採用這一種控制方式。)

---

結語:因為是第一篇關於 STM32 USB DIY 系列的文章,我就不要講太多了,

先告一段落,後續再慢慢整理推出討論。謝謝各位了。

(待續)



2 則留言:

  1. 自己成為專案負責人之後,才發現經驗傳承也不是容易的事情
    負責規劃專案的時候就沒時間自己敲程式了,
    即使我已經幫忙做開頭,給人家接下去

    就拿上面USB 斷線的控制腳位來說,即使我向接手的同事解釋過N次,
    這個斷線的功能一方面是可以用來自己準備好再通知host,
    還可以讓usb重新連線用,
    並解釋USB連線流程第一步是attach,不是usb reset...

    講這些還是回到接手人的態度,
    是想真的認識USB的原理,還是只想解決問題趕快下班呢

    回覆刪除
    回覆
    1. 這很正常,你想教,別人未必想學。

      學會那麼多,還不是領一樣的錢,以後真正有需要再說吧。

      搞不好,學越多,事情越多,反正有人看不下去時,自然就有人會接手啊。

      以前賈老師在學校時,有些老師就不想接"班導師",就擺爛啊。把班級搞得雞飛狗跳的。

      家長反應,學校長官看不下,自然下回就不會再找他接班導師。爽爽當科任老師啊。

      反而認真的老師就辛苦了。你說世界公平嗎?習慣一點對自己還比較好一點吧。

      你說:把它給Fired 掉好了。問題是誰要當壞人啊?薪水又不是你付的啊。

      啊!我有責任啊~那很好啊~那就看長官挺不挺你啊?人走了,事情還不是沒人做啊。

      不是嗎?

      搞產品研發技術簡單,管理人難啊。

      刪除