2020年7月29日 星期三

我的 ARM--- STM32 故事 (一) :開發學習版的 UART

如果我不來寫點 32 Bits MCU 的話,人家還真的以為我是LKK 工程師,

或是認為我獨鍾 8 bits MCU 而排斥 32 bits MCU 呢。

但說坦白話,搞 32 bits MCU 就比較有出路或比較容易賺到錢嗎?見仁見智吧!

這還是要看你對於產品市場的定義吧。那如果從技術觀點呢?那也不一定。

我的硬體師傅(就是我的PCB Layout 啟蒙老師),他最近因為大陸疫情關係,

暫時就回台灣待一陣子,他就跟我說:他之前在大陸就碰到一個案子:LED 燈控,

用STM32 跑 170 幾MHz ,結果碰到中斷,發現:STM32 也沒比較厲害...

至於我為什麼比較少寫 32 bits MCU 的故事?因為我覺得這些東西基本上跟

一般 8 bits MCU 的基礎觀念是差不多的,那你說:不一樣啊,效能或資源比較多啊。

但說效能或資源比較多,那乾脆就透過USB 把工作丟到PC 端不是更好嗎?

人家現在還標榜"雲端運算",那不是更好嗎?所以說啊,這種事誰說得準?

我就舉一個以前我自己碰過的故事:

下圖是我在 IC 設計業的第一個SOC 產品:Scanner SOC 。
大家可以看到他內部有 8 KBytes MCU 跑程式的 Cache Memory,另外還有影像處理

的資料記憶體: 16 KBytes。其實大家都知道:記憶體在 IC 內部是最佔空間的,

也是IC 成本的最大殺手。所以這個資料記憶體能越小就越好。

如果大家不清楚整顆SOC 的架構或資料流程的話,我就用另一張圖給大家參考:

當然啊,我們這一代的SOC 算是很成功的,因為我們在系統上根本不用在外掛任何

記憶體緩衝區,真的只靠一顆SOC 就搞定掃描器的產品開發,頂多就是外掛一顆

步進馬達驅動IC 就可以了。

那為什麼是 16 KBytes 的記憶體緩衝區?因為當初掃描器能做到 600 DPI 就不得了了,

就算是 1200 DPI 的,也是用 600 DPI 的影像RAW data 內插出來的。 

所以我們算一下:600 點 x RGB = 1800 Bytes 資料,一般步進馬達會不斷的掃描影像

將影像資料透過USB 上傳給影像處理軟體做影像處理。但如果上層處理速度不夠的話,

步進馬達會暫時停下來,然後會稍微在倒退一點重新讀取幾條線,讓影像連結平滑

一點,所以只要這中間的資料傳輸有點任何耽誤的話,就容易造成掃描停頓問題。

但那時候USB 1.1 剛出來,他的傳輸速度遠超過傳統的串列或並列(EPP)的傳輸效能。

所以我們認為這樣子的資料緩衝區就夠了。
---
但到了第二代的產品規格討論時,我們內部就發生了規格上的嚴重意見爭執,

我的主管主張:因為電腦效能與USB 介面的傳輸速率會越來越快,所以內部

記憶體緩衝區不但不用增加還可以減少;但另一派的看法認為:反正市場出現

2400 DPI 需求,而外掛 DRAM 當緩衝區,可以直接拿掉SOC 內部的記憶體緩衝區,

直接降低IC 成本,但這一點我主管認為只是把IC 成本轉嫁系統成本給客戶,

(因為系統板子上除了我們的IC 之外,還要再加一顆DRAM...)。他不是那麼苟同。

但最後結論是我主管敗下陣來。(當然還有其他因素,他就離職了。)

而我呢?為了避免捲進風波...適逢公司被園區大型IC 設計公司合併,我就選擇請調

到該公司的另一部門。那另一派就以他們外掛DRAM 方式進行新一代SOC 開發,

當然啊,在IC 設計團隊強勢主導下,而系統應用不強的情形下,TAPE-OUT 幾顆之後,

這個產品線的計畫就全面中止了。這沒有誰對?誰錯?的問題。這在許多公司都很

常見的故事。
----
所以這個故事告訴我們:有很多產品開發的技術規格問題,不能光只靠單一角度或

某種觀點就可以了,有很多方面除了硬體本身效能問題之外,還有許多外在系統

調教平台觀念建立的。經歷這一件事也讓我真正的學習到產品開發過程中,

不是一拿到解決方案就矇著頭一路拼命的往下走,有些東西還是有一些理論分析

工作可以事先評估計算的...尤其是你將來也會成為技術主管,也是要會看規格,

開規格,也會像我主管那般的專業判斷能力的。

所以針對 32 bits MCU 的系統應用,我就比較會冷靜的用系統觀點來評估的。

沒有凡事都得人云亦云,就算要用也要懂得拿捏使用條件與環境。

只是因為現在 32 bits MCU ,尤其是這一顆 STM32 MCU,幾乎淹沒所有國內外

技術論壇,所以有時真的沒差我一個人來幫他寫甚麼專業技術的開箱文的...

所以就算我自己私底下在用,我也沒有多大的興致提筆寫寫關於他與我的故事。

剛好我最近也算比較有多一點自己閒暇時間,我就可以拿來玩玩寫寫東西了。
---
最近有朋友請我用 STM32 幫他看一下產品開發的技術問題,所以我就拿出

這一片已經買了一陣子(2018/07) 的學習開發版出來玩一下:


結果我發現他串口除錯是用大陸的 CH340 。我當然知道這一顆UART 轉USB 的IC。

只是在網路上也有一些負評。當我架起來玩不到幾分鐘就覺得哪邊怪怪的...

說真的,我也懶得幫這些IC 廠 Debug,也不想讓這一種鳥事耽誤自己的青春。

所以我就直接外接另一片以 CP210X 的模組取代原來開發版上的CH340。

結果一試就OK 了。

我是覺得網路上有很多人在糾結這樣的故事,哎啊...這個東西有甚麼問題啊?

到處請教專家?或到各個粉絲團或論壇提問....

花了很大的功夫只是為了只證明一件事:原來這些 Cost Down 的東西問題那麼多喔?

原來大家所講的是真的喔。怎樣?幫這些IC 找Bug 有獎品或獎金嗎?

學習過程固然是一種技術養成的訓練,但有些時候也是要看一下甚麼情況啊。

就像我上述的那個掃描器SOC 的規格爭論問題一樣,有些東西也是可以事先評估算計的,

而不是凡事都是矇著頭一路蠻幹的....不只是技術觀點,有些就是技術以外的觀念也是

要有的。這是一個小小的經驗分享。

23 則留言:

  1. 個人是可以少用中斷就少用。以STM32 UART為例,我幾乎完全沒有中斷(除了錯誤檢知),就可以收發資料。
    後來有人做案子找我要UART程式碼,我才覺得奇怪,原來是要我寫的無中斷收發寫法。遇到同版主問題,中斷影響到主要效能,問我是如何解。我就單純使用DMA,將資料堆入RAM,有空才去解析。
    在大陸論壇上目前看來仍是青一色用中斷,不管用那個都不能解決問題。

    回覆刪除
    回覆
    1. 請問Bee大工作上幾乎都用STM32嗎? 以前在學校時就看過大陸的 uart dma的寫法了, stm32的dma真的很好用, 以前工作上有接過類比輸出的熱像感測器成像,後端輸出用了3個TIMER串聯+DMA(RAM->GPIO)模擬ccir601(一般cmos的輸出介面), 這段自己實作出來的時候也超有成就感, 只可惜部門內也沒人懂, 這段功能如果用中斷寫肯定是寫不出來的.上級主管都以為線拉一拉就會動了

      刪除
    2. 2013就用三個timer串dma做線性影像抓取,軟體再拼裝成單張照片,單色解析度為12bit,只用stm32抓取。前一版電路用10bit adc IC, MCU還要降階到8位元單色。
      這個電路目前在手持式掃瞄器上可見(不是我流出到市面)。不過會MCU仍是被人當工具人叫來叫去。

      刪除
    3. 喔喔~跟我的應用好像呢~我是外掛 SPI ADC(16bit) 類比感測器的senclk & ADC輸出也是用STM32
      的TIMER輸出與SPIDMA去搭配, 影像是QQVGA 之後再軟體轉8bit灰階影像, 光前段我就覺得用其它平台可能就被每個ADC輸出中斷到什麼事都不用做了, STM32可以搞到一整張圖才中斷一次

      刪除
    4. 主管是外行...當初做出來的時候就聽過他跟人講點這種sensor對韌體來說很簡單啦~
      跟他做事前2年就換過3~4種平台,曾經還想拿ARM9的給我,他以為MCU頻率越快就越好做事情,
      換平台跟換椅子一樣簡單

      刪除
    5. 通用型MCU 提供DMA 是一個變通的作法,如果像我以前也搞過TV 數位晶片,

      只要是市場夠大,這些東西就直接用IC 硬體做掉了,寫MCU Code 只是拿來做UI

      介面而已。所以若以技術的角度來說:那只是又回到老闆的思維,市場的規模值不值得而已。

      至於工程問題,那是工程部門主管要操心的,而工程主管的想法也只是迎合老闆對於市場

      看法所做的對應之策。有本事的~主管的位置就是穩穩當當的,那怕是他只是出一張嘴。

      所以我現在也可以理解這些我們稱為"外行、不懂技術的人"(偏偏這些人是決定你的績效)

      所以呢?若以磨練技術與功夫來說:我們能做就做,做了學到了,算我們自己的...

      或許未來有一天換你當主管時,你也可以多一點認知。而對於這些人來說:

      只要是在他們的領導之下,所有的對上或對外的績效本來就算他的啊。領導有方啊。

      要不然你以為郭台銘或張忠謀等,他們真的懂這麼多技術嗎?

      你有本事,你也可以藉由如此的機會或條件,想想辦法成為Leader 啊。

      否則這種事還是會一直出現的,那怕是你自己出來弄個小公司當老闆,

      一開始也可能是這樣子,而等你懂了這種道理之後,或許你又已經成為大老闆了,

      而你底下的工程主管或工程師們也是會有這種感觸的...這本來就是一個職場輪迴循環而以。

      因為我自己也是一樣的,許多認識我的朋友也說:Chamber 這幾年,看你好像變得比較

      市儈一點,少一點工程師的純真,多一點業務的現實嘴臉了...很簡單啊,

      物競天擇,適者生存,而怎樣的性格改變才能成為"適者生存"的條件?

      刪除
  2. http://wallace7914032.blogspot.com/2014/12/dmafifo.html
    以上是個人解法,找出來給您參考。若是用HAL函式庫,就要自己去暫存器設定。

    回覆刪除
    回覆
    1. Goodspeed 大大,趕快來朝聖一下吧。

      很巧,Godspeed 大大這兩天也寫了一篇類似這般問題:

      https://goodspeedlee.blogspot.com/2020/07/real-time-embedded-system-4-fifo.html

      我認為搞系統的戲法大家都會變,只是因為現在網路 Open Source 的東西太多了。

      而有很多新手或一般人(以一般比例來說:在大陸應該也為數不少吧),

      反正網路上面抓到甚麼東西,就直接套著用吧,也都沒有花太多心思去想這麼多,

      可能也因為經驗不足,也不知道該如何下手去變戲法,時間一久,也就慢慢養成習慣,

      就像你最後一句話:若是用HAL函式庫,就要自己去暫存器設定...

      看起來,你我都不是那一種,會直接抓HAL 函式庫來用的人。

      但偏偏原廠還是希望多一點人可以大量引用HAL 函式庫的人,畢竟出貨量大快速,

      才是他們要的生意模式...

      這也沒關係啦,反正懂的人自然如何處置,要不然為什麼還有許多案子還是希望

      找有經驗的外包人員呢?這個就交給市場機制了吧。

      刪除
    2. HAL的問題不是這樣,單純是我沒有更新。找到解法是2014年,當年寫下來做筆記時HAL還沒有出生。
      現在已有用HAL的解法,還是免不了要去設暫存器,但少設很多。這部分一直有機會補寫。看那天想起來再說了。

      刪除
    3. 反正STM32 族系MCU 一缸子,出MCU 的速度大概都比我們在系統上搞產品還快,

      不搞這種HAL 東西,怎麼來得及支援那麼多種又快速推陳出新的MCU 種類?

      而客人呢?很簡單,只要習慣了,就麻痺了。

      這就跟我同時在MCU 及PC 上寫程式一樣,有時候真的也很難好好的一個一個去研究每個

      函式庫的底層...幸好的是:經由這麼多年的殘酷地市場淘汰賽,每個平台的作業系統或

      程式語言平台,大概也都趨於完善穩定了,所以自然就有更多的高階程式軟體釋出。

      現在真的不需要太懂程式語言架構的人,也都有很多美美畫面的APP 讓大家使用。

      像 Prometheus/Grafana 這些東西都很受大家青睞。

      只是現在越來越多新玩意兒,學也學不完,學了如何不知道如何變現?

      也只能真的要讓自己慢慢的沉澱下來,好好想想自己的定位與生存之道吧。

      刪除
  3. STM32的中斷慢,也不是現在的事。我一拿到STM32公司就要我安裝公司用的SPI及I2C驅動,我才覺得奇怪,MCU不是硬體已有,那程式是做什麼,好奇打開一看,天啊!是GPIO模擬的SPI及I2C。我回頭問,裝這怎用?結果真的是用GPIO,公司還說可以用在所有的MCU上。我沒裝,直接用MCU上的,再加上DMA。後來GPIO模擬的遇到新IC就出問題了,我就沒有事。
    有時就覺得時代上來了,差不多成熟,還是用上去。有些則是太早的技術,會等它成熟些。

    回覆刪除
    回覆
    1. 這種問題就分成不懂技術的老闆看法,及真正執行工程設計的工程師看法。

      對老闆來說:產品技術又日新月異不斷,工程師又來來去去,技術工作銜接也不可能都是老闆的事。

      這種最原始的方法,當然是最簡單穩定的事,出了問題,當然就是你們工程師的事,

      要不然我老闆幹嘛還要花錢找你們來上班?產品穩定出貨就像印鈔票這麼簡單的事,

      東西能賣個五年、十年等,誰不想這麼簡單容易就好...

      所以啦,各取所需吧,你拿到這些東西,能用就用,不能用,就自己想辦法搞定。

      等下次還你離職之後,下一個工程師拿到你所交接的東西時,還是有抱怨的。

      答案是:還是你們工程師的問題啊。不就是這麼簡單的事嘛!您說呢?

      刪除
    2. 雖然說只要不出問題就沒有錯。8051上就只能用GPIO,就不弄新的通信? GPIO模擬也只是中間產物,現在變成備用方案。 有DMA, 工程師當然要用,不然那天真要用又用不上去。
      對很多人來說技術是靜止的,就像是架上的書。我沒這樣看,時代本身就是在動的,所以書的內容在我的腦中也是不斷的在改版。

      就以這篇標題來說,中斷是問題,因為我多會了DMA,所以使用DMA去解決中斷所造成的問題。前題是DMA我要是不熟,也不會找到解決的方法。

      解決方法一直都很簡單,但要找到才是困難的。

      刪除
    3. "解決方法一直都很簡單,但要找到才是困難的。" --- 是的!沒錯。

      網路上一大堆Open Source 讓大家無限取用,但還是看到許多人一直在各論壇與

      粉絲團發問,其實這些問題都是出自於:根本不知道怎麼找問題與除錯。

      是啊,抄寫程式,有誰不會啊,但找問題與除錯,就是真的考驗著每個工程師的根基。

      如何使用工具?分析問題?及找到解決方法,然後驗證確認...就是"這麼簡單而已"啊。

      刪除
    4. 我比較好奇的是STM32中斷比較慢是怎麼得出這結論的?

      刪除
    5. 和8051比。
      計算方式就是中斷信號生成到可以反應的clock數。1T的8051後期的clock數目少很多。
      STM32核心有pipe-line,中斷所需的clock反應需求數就變多,但因為clock倍升,所以還補了一些回來。STM32F系列反應時間還好。
      問題出在STM32L系列,因為IO有省電問題,有自己的管理系統及獨立clock。中斷生成到IO可以反應的時間就變更慢。
      在8051時代,用中斷驅動IO可以做很多事,大家都養成用中斷做事。一但中斷慢下來,一堆舊函式就不好用,於是一堆人在論壇就指說中斷慢了。
      我很早就覺得有如此多的週邊,若都要中斷才能管理遲早出問題,於是找替代方案。結果就發現用DMA是一個好方法。但DMA和中斷都是一般工程師不易理解的功能,要普及還要一些時間。

      刪除
    6. 中斷慢這件事去年開始,未見有人出來說明。所以論壇上是找不到答案的。
      問題要解方法簡單,但能解的人真的不多,這就是活生生的案例。

      刪除
    7. 個人覺得這中間有個誤區,難道ARM跟STM都沒有比較過8051?他們做SA時是關起門來自己搞?而且印象中PIC也有pipeline...

      所以說如果用夠高端的示波器/LA去看就,從rising/falling edge到ISR裡第一行點GPIO,兩個方波間的gap會比8051大??

      DMA這種功能只要是碰到影像跟網路是不可能不接觸的,這兩者經常需要搬移大區塊資料,沒有DMA會浪費一大堆CPU time

      刪除
    8. 這個問題我們一般稱為 Interrupt Latency。

      因為MCU 要進中斷程式時,他在硬體上還有很多事情要做的,包括:將PC值 塞進stack,

      有些 Registers 也是需要的... 這些東西大家都很清楚,其時不用我說。

      我想、我猜的啦... (因為我還沒有仔細去Trace 或實驗在 stm32 上的這些東西)

      但因為 stm32 標榜是可以讓你搞一些Embedded System,又要強調他在系統上的

      Robustness。所以他在架構就得有別於傳統 8 bits MCU 的方式,

      我們光看 stm32 的中斷向量表上,前幾個都是一些跟傳統MCU 有很大差異的東西。

      我相信:當中斷發生時,硬體內部還是有一些檢查機制,可能會造成一些Latency。

      當然Pipe Line 的架構也有影響。光一般 Microchip 的Interrupt Latency 也比

      8051 差。這些都是在許多在MCU 基本架構或成本考量所造成的。

      當然啊,當周邊裝置越多,每個都希望有屬於自己的中斷機制,就算是32 bits MCU。

      畢竟他還只是一顆單核的MCU 啊。如果系統上純粹只是一個簡單的中斷,我認為應該沒差。

      但如果你的系統把這些周邊的東西都跑起來的話,可能問題就越來越嚴重了。

      所有的東西都是有極限的,也有其在系統上使用的限制條件,當然在應用市場上

      也有其市場客戶區隔的。真的不用太強求吧。

      至於DMA 的這種硬體支援的東西,還是得看規格上有沒有做對,畢竟硬體的東西

      他的使用彈性很小,功能有做到或有甚麼沒考慮的...那就是那樣了。

      所以我才跟你說:如果你有機會在IC 設計公司工作過,有時候,搞系統應用真的

      也不妨試著想想如何把自己的系統觀念轉換成IC 硬體規格,這樣子才是真正屬於

      自己的技術核心價值。這是我自己的經驗...

      刪除
  4. 誤解是從clock上來看的,STM32花的clock數目多,很多人就不接受。認為STM32跑個200Mhz,IO翻轉率也要跟上來,你以為翻IO不用電?翻得快,電也用得多,為了省電IO的clock就降速。最後速度變得只比8051的時間好一些些,然後STM32有6組uart,3組spi,2組i2C,若是全部用中斷11組通信埠都在中斷來中斷去,效率會好?
    我問過很多工程師,中斷這樣多,不會變慢?清一色回答,是晶片商的事。最後倒楣的會是專案經理,一下這不穩或是效率不好等等。
    DMA用在通信上是以封包為單位,就是輸出時要告知多少字元要出,出完了才給中斷。中斷使用率比沒有用DMA的少了至少有十倍,接收也差不多。
    以前一個字元就會收到,然後要寫處理程式。現在DMA則是一次收一包,用字串方式處理,程式結構不太一樣,有些工程師就是不想改字元處理為字串處理,就不想用DMA。
    許多問題是習慣性而不是技術性,工程師就推說是廠商問題,於是才會有中斷比較慢這個傳說。

    複雜的處理器,更考驗工程師的功力。但一般人會以為"更好的處理器,會得到更好的功能"。
    這就是現實和認知的落差。

    回覆刪除
    回覆
    1. 是的..."是晶片商的事...",他們就是要你們有這種想法,他們才能一直出IC

      賣給你們。如果每個應用系統開發工程師都像你我這麼會調系統的話,

      根本不用幾顆MCU 就可以了,搞不好一顆MCU 型號還可以搞好幾年。

      那他們晶片商就可以關門了。不是嗎?

      所以當你越依賴晶片功能,你的系統價值就越低了,然後在職場上被取代的機會

      就越大了。因為所有的東西都是人家晶片商給你甚麼?你就做甚麼?

      那對老闆來說:買貴一點晶片比付你的薪水還合算時,你是隨時可以走路的。

      所以啦,工程師們真的不要以為這樣子工作很好幹,

      別忘了,老闆就是比你會算,也比你還會計較的。要不然他怎麼幹老闆。

      你就別拿這種是考驗你老闆的智慧,就算老闆對你好,老闆也是有股東要負責的,

      這些股東是看不懂技術,他們只會看會計報表的,他們只要看到老闆付你的薪水

      比買東西貴時,肯定是不會放過你老闆的,而你跟老闆交情在怎麼好,也是沒有用的啦。

      記得世上不是只有搞技術這檔子的事而已,尤其是上班領薪水,老闆想的絕對是比你多的。

      刪除
    2. 換個方式想,不如說要知道為何晶片商要加這些功能,例如DMA是因為系統中太多
      memory to memory
      memory to Peripheral
      Peripheral to memory
      這些程式很多是可以讓硬體去做的,而且寫多了也不會增加多少功力
      而重點是要怎麼去證明用了這些系統是有改善的(我問過幾個來面試的人,要怎麼跟老闆證明CPU busy?)

      刪除
    3. 我之前從原來公司到合併新公司搞USB MP3 SOC 芯片。

      那時我接專案經理,幫忙搞系統,結果不用多久我就發現這棵SOC 在USB 的Throughput

      效能太差了,因為我剛接手時,這個SOC 就已經幾乎設計完成IC 了。

      而這一部份的USB 是沿用數位相機SOC 的設計,是公司的另一項主力產品。

      結果我就用類似以下這篇文章的USB 分析儀數據給他們看:

      https://chamberplus.blogspot.com/2019/09/hinet-usb-diy-usb-diy_27.html

      人家USB 規格就是 12Mb/Sec。您IC 設計跑不到這個規格,當然就是硬體問題啊。

      這當然對IC 設計者來說:沒有任何理由藉口的。不要到時候,被客訴時,把問題丟給AE

      系統部門。在系統上那是不可能解決的...

      我記得在那個跨部門的大型會議上,我用那張USB 分析儀的圖表說明後,

      一戰成名。不久我就接整個部門,那些平常眼睛長在頭頂的IC 設計部門的人

      都敬我三分。

      其實有些時候,這些東西都是有標準規格可以查的,但因為在系統上要實驗規格理論上

      的數據,還是有一些需要大家努力與挑戰的。但如果沒有我們這些搞AE 系統人員

      來把關驗證的,那些IC 設計者,還真的會隨便應付你的。

      當然我們也是被訓練出來的。有些東西真的不要只光低著頭,像苦命童養媳一般的

      整天就窩在那埋頭苦幹就會出頭天?那當然是不可能的啦。

      刪除