發表文章

目前顯示的是有「Embedded」標籤的文章

文章總列表

STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收

圖片
前言 我一般用Segger-RTT來debug。不過這東西也有限制,比如MCU進出sleep mode,他的data stream就會斷掉,也是不方便 http://lihgong.blogspot.com/2016/05/segger-rtt-1.html http://lihgong.blogspot.com/2016/05/segger-rtt-2.html http://lihgong.blogspot.com/2016/05/segger-rtt-3_6.html 我不是很喜歡UART,根本原因是把他 用好 其實不容易。當年選用Segger RTT其實就是要逃避這題(笑);很多年過去了,總是要回來解決這題 STM32 HAL UART driver足足有3726Lines,這代表他的複雜度。假如UART跑在115200bps來說,傳送1byte需要約100us,假設CPU跑在16Mhz就需要1600T。簡單用Polling mode丟資料(或是接收資料)效能很悲劇;用了中斷模式會好一點,但是每個字元都來中斷,遇到高速UART其實效率也不大好;這題的根本解法是需要DMA mode 這篇我會介紹怎在使用STM32CubeIDE,把UART+DMA mode跑起來,TX/RX都有,實作我心裡最佳的框架。這篇直接講結論和步驟,原理很複雜,但是架起來卻很簡單 環境 STM32CubeIDE 你改用STM32CubeIDE了嗎?如果還沒,可以試試看;我用起來很滿意! Nucleo F411RE Board 上面有ST-LINK加開發版,帶條USB線就能出去玩;缺點是MINI-USB線有點討厭 MobaXTerm 好用的Terminal工具,可以連SSH/ RDP/ Serial Terminal UART-TX設定步驟 STM32CUBEIDE設定UART,關鍵是要打開UART中斷,以及打開TX/RX的DMA Enable UART IRQ Enable UART DMA channels 假如要傳送資料,這一段code能幫上忙。這裡面有個資料結構內藏ring-buf,每次user要寫東西就往buf[]擺,並且更新wptr;資料擺上去會呼叫UART HAL library的API來傳送;或是DMA傳送完了,也會檢查還有沒有剩下的要傳。因為有Global variabl...

STM32 IAP Consideration

圖片
Bootloader可以實作IAP(In-Application Programming)。IAP是軟體運行中升級自己,電腦升級BIOS也算IAP,我們執行程式就能更新BIOS。開發IAP是為了重燒軟體,所以要先問:能否不要折騰IAP MCU已經有內建的燒錄程式 參考 STM AN2606 文件,STM32F103C8開機讓boot0 pin = high就能用內建bootloader開機。這段軟體是STM寫好,直接刻在IC裡面 STM32F103C8T6的Bootloader提供的資源,最重要的資訊是:他用USART1和外界溝通 這份軟體的行為能看 STM AN3155 ,開機過程如下圖,支援的命令我也列出來。表格最重要的內容是Read Memory/ Write Memory/ Erase。也就是說,開發者買個USB to UART的dongle,就可以燒寫MCU了 如果不想自己寫程式燒寫MCU,STM也提供 STM32 Flash Loader ,他就是用上面的bootloader protocol和MCU溝通 為什麼原廠程式不合用 要啟動原廠Bootloader,需要滿足以下兩個條件 Boot0 pin = 1 看得到UART pins 我得打開機殼才能湊滿條件(不開機殼是先決條件),所以原廠的解決方案不能用。所以我得重現原廠所有工作量,達成我的目的。這種東西沒標準,想怎麼搞都可以,開心就好 IAP框架設計 一般我們會把IAP拆解成一系列步驟,每次PC下命令讓MCU做一小步。PC負責串流程(想修改也方便),MCU只做簡單的操作。我的電路是CAN bus對外,IAP得從通訊界面著手,我定義的框架如下: PC透過CAN bus後門把更新軟體寫入Flash PC通知MCU計算checksum PC寫入觸發訊號 PC通知MCU重新開機 MCU開機經過Bootloader,看到觸發信號,把更新軟體覆蓋原軟體,並且清除觸發信號。操作完成後,跳轉回主程式開始執行 我在韌體端,定義以下的操作。記住這東西沒標準,想怎麼做都可以! IAP_ERASE_PAGE IAP_SET_ADDR IAP_PROGRAM_FLASH IAP_GET_BUF_DEPTH IAP_PROGRAM_FLASH_SEND_WORD IAP_PROGRAM_FLASH_BATCH IAP_CHECK...

STM32 Bootloader

圖片
要解決的問題 升級韌體很麻煩,開機殼短路兩個點上電洗掉程式,最後再用JTAG寫程式 但是裝置接在CAN bus,為什麼不能用CAN更新軟體,省掉上面步驟? Atollic 這份文件 把bootloader講解得很詳細 Flash規劃 STM32F103C8T6的page size是1KB Page[7:0] bootloader Page[15:8] main program Page[23:16] program to upgrade Page[62] bootloader NVRAM Page[63] main program NVRAM 我的程式不大,直接多放一份program to update也還好,程式運行中把軟體寫入此區域。重新開機,bootloader偵測到更新需求,把program to update覆蓋main memory完成更新後,再正常開機。所以bootloader邏輯很簡單 if bootloader_nvram_update == True copy program_to_upgrade to main_program Jump to main program 修改main program 本來主程式放在Flash開頭,現在被放到8K開始,我們要告訴linker script搬家了 也要告訴軟體,中斷向量表搬家了 主程式的修改就這樣,很簡單吧! 產生bootloader bootloader也許會精雕細琢壓code size;但是我很懶,stm32cubemx直接產生,畢竟最後我也要讀寫Flash,有現成driver用就是爽 打開main.c,照著Atollic的文件抄,記得加上__disable_irq()才不會噴出hard fault。我也懶得找原因了,推測是跳入主程式時,也許會摸到某些保護跑飛。反正多一行就搞定,別太折磨自己了 實際的PM開銷約3K左右,就可以跳轉入主程式了 燒錄和Debug 現在MCU有兩個子專案,有兩個ELF file,代表要分兩步讓一顆MCU正常使用 我用Segger ozone,先載入bootloader.jdebug,燒寫bootloader到page[7:0],不碰其他地方 原本專案就有一個stm32.jdebug,燒寫主程式到pa...

VOLVO+開發故事 (11),第二次發表

圖片
新功能發表A-SS OFF & 露營模式韌體修正 XC60 ASS-OFF開發完成 VOLVO+開發故事 (8),A-SS OFF功能定義 VOLVO+開發故事 (9),A-SS OFF開發過程 Demo Video 露營模式 VOLVO+開發故事 (10),露營模式 舊車友特價升級A-SS OFF方案 付費升級A-SS OFF方案, 請填單 (選$800,升級C版,舊車友專案),特價800免運費到2019/11E,郵寄地址: 郵遞區號:30099 地址:交通大學郵局第102號信箱 收件者: QQM LAB 產品的主頁在此,內有說明書和訂購表單 致謝 感謝新竹陳Sir,提供硬體相關知識,幫我review線路圖 感謝購買的車友,如果沒人要,這個專案就沒有意義 感謝 協助測試A-SS OFF的車友 ,我不可能買一堆車做實驗,感謝你們讓專案成功 感謝Volvo in Taiwan臉書社團 & 管理員冬雪飄飄同意發布 特別感謝新竹徐Sir,這個專案因你幫忙而能完成

VOLVO+開發故事 (10),露營模式

圖片
露營模式 XC60非常適合露營,車友反映開尾門卸貨,幾分鐘後尾門就關不起來了 這個場景真的沒測過:糗了。驗屍報告如下: 車子放著,幾分鐘後CAN Bus睡著了,Volvo+也跟著睡著 Volvo+睡著後,每三秒(3000ms)起來聽10ms,有封包才會醒來 關門要落在10ms才行,機率10/3000 = 0.3%,三百次成功一次,不可能接受,修改參數看看: 改成每秒(1000ms)起來聽10ms,成功率1%,一百次成功一次,爛透了 改成每秒(1000ms)起來聽500ms,成功率50%,兩次成功一次,超耗電 改成車子睡著後,等10分鐘再睡,拿電瓶來換但不是根治(開著尾門開Party不行嗎?) 於是 我自豪的省電機制 完全崩潰了。仔細再讀MCU的手冊,找到希望: CAN收發晶片能省電的監看網路,上面有任何擾動,都能發出信號叫醒MCU MCU進入深睡時,看到CAN晶片的喚醒信號會立刻起來 於是這題解掉,省電機制也進化了 喚醒速度(<1ms)遠勝舊的機制,改善10~3000倍,一個CAN封包就搞定 待機耗電表現稍稍改善,1%電瓶能待機2年 作為負責的開發者,我會通知出問題的Volvo+修復,來回運費我會負擔 也許我也應該去露營,這樣設計就能更全面了

VOLVO+開發故事 (9),A-SS OFF開發過程

圖片
這篇我想分享A-SS OFF開發的技術細節;裡面有些Hack汽車CAN Bus的思路可以參考 先找到觸發信號 想要A-SS在 引擎發動 後關閉,那就得在CAN Bus辨識引擎發動的訊息,發動後才能對A-SS動手腳。所以我得監聽CAN Bus,在上萬筆記錄裡大海撈針 我不可能寫信和VOLVO要他們CAN Bus規格(理我才怪),更沒有現成的VOLVO CAN Bus分析工具,我只能自製工具。以下是嘗試過的方法,沒有哪招特別靈驗,一般我只能用著 堅忍不拔 的毅力撐著分析下去 我大多透過Linux和CAN Bus打交道,這裡寫程式方便些; Linux有現成的can-utils套件,裡面的candump是所有工作的源頭,可以錄下記錄檔 直接讀記錄聽起來很笨,抓手感是必要的 錄下來的記錄可以搭配grep指令快速分析 或是candump也能監看特定封包 錄下的記錄,塞到Excel分析 微軟的旗艦級軟體,可以把紀錄分門別類,統計數量,過濾,非常好用 也可以寫軟體對封包處理,進行可視化分析,找到引擎發動的信號 找到關A-SS的封包 接下來要再找怎麼讓A-SS關燈 監控CAN Bus,測試各種場景按下A-SS的按鈕的封包。下面是我嘗試過的各種組態,盯著看完全看不懂的紀錄,在裡面找規則(總不能發信問VOLVO吧) 我做過不少開發工具。下圖是生產兼開發的設備,現在有個鋁盒,檔次高多了(笑) 自製工具吃苦頭:電路板有個焊點鬆脫,導致這盒幾個月來都不穩定 外出精簡工具盒,我喜歡豐富的色彩,嬌小的體積,方便攜帶 對俄羅斯的產品逆向工程,分析封包。雖然不認識,但我覺得與他在心靈上有著高層次的交流(也許他不願意就是) 附帶一提,老婆是對的,做腸子鏡如果會流血,夜用型用就對了,洗床單很麻煩 至於有人說這世界上有棉條可以用(這個就過份了>_<) 開發韌體 & 測試 找到引擎狀態和A-SS封包,寫韌體串起來,最後的精華是短短20行code 驗證一下功能正確與否,下圖上方黃條代表引擎發動,下方黃條成功把A-SS關閉,搞定! 我不是專業做CAN Bus逆向工程,短短幾個步驟也花了幾百個鐘頭,不管怎樣,我搞定他了!現在發動汽車,我再也不用伸手去...

VOLVO+開發故事 (8),A-SS OFF功能定義

圖片
遙控關閉尾門完成後,接下來要開發自動啟停(Auto Start-Stop,以下簡稱A-SS),這篇我想討論這個功能 很多車友不喜歡A-SS,他毫無疑問會多吃電瓶,多用一些啟動馬達,不少人是發動就伸手關閉;我不討厭這個功能,等90秒紅綠燈停下引擎我滿好的;但是左轉排隊有點惱人,發動延遲一下,有時候就過不去了! 對A-SS的看法大概有三種 永遠打開A-SS,不關 永遠關閉A-SS,發動立刻關 發動關閉A-SS,需要再打開 俄羅斯的產品支援A-SS OFF,他會記憶熄火前的狀態,下次發動會回存;這個邏輯正好能讓第一和第二種人滿足,但是我不喜歡:我得在熄火時關閉A-SS,反而增加腦力的負擔 經過很多訪談,我定義功能是插上去A-SS OFF, 不用記憶任何規則 。所以區分成三個版本,至於Z版最後取消了,誰會想買這片板子回去寫程式呢(笑) Z版:純硬體 A版:A-SS OFF (2019/11 Deliver) B版:Remote Tailgate (2019/6 Deliver) C版:A-SS OFF + Remote Tailgate (2019/11 Deliver) 現在回頭看,結論超簡單;不知道為何當時很糾結

VOLVO+開發故事 (7),向您介紹我的產品!!

圖片
第二片電路板拔掉不必要的設計,送去PCB打件(手焊的觀感不好)。我給產品命名為Volvo+,給車子增加新功能;絲印有我的書房名字(QQM Lab),以及我一直想養的貓 30片PCB排在一起有點密集恐懼症 試做幾個看看 真的會動沒問題 產品的主頁 在此,有興趣請參考

VOLVO+開發故事 (6),Sample Back

圖片
在我工作的地方,我們說Sample Back代表IC從晶圓廠製作完畢,封裝好,回到公司進行驗證(我們也即將進行超高強度的工作)。不管多少次,我都會仔細的看看IC,看看上面的絲印,看看他是大顆還是小顆。IC承載著團隊的智慧,眾人的努力 IC要上電才會發燙;但是設計的人,心是火熱的 ---- 我設計的PCB透過 JLCPCB製作 ,我的瑞典同事對這間讚不絕口!生產的步驟還可以及時觀看進度。這片板子到我手上,就是Sample Back 我很快把IC準備好找硬體專家解釋圖面,幫我焊接(順便問一下焊接的技巧) 接著轉念一想,就算我畫錯layout,我也想第一個知道;連板子都做了,為什麼不自己焊?我這輩子不能當外科醫生動手術,但是焊接手藝還是能鍛鍊的 拿了IC和PCB到實驗室施工,很快焊錫就糊成一團。別怕,熱風槍吹下IC,清理後再來,這片板子我練了很多次。隔天再拿一片到實驗室報到,果然又短路了。照著網路文章,沾上松香用烙鐵抖抖抖,還真的是刷過去整排針腳就搞定,一瞬間我的焊接技能晉級了 繼續加工,焊上降壓IC,CAN收發器,電阻電容。檢查電壓和clock,正常;然後接上電腦正確下載程式,MCU運作正常;接上汽車模擬器也能正確運作;最後上車測試,我沒焊上LED不能閃動,但是車門就如同預期關上了 我搞定了! IC不發燙,因為省電做得好 我是工程師,用專業做產品,以創造為榮

VOLVO+開發故事 (5),Low Power比想像得更難做

圖片
第二篇 做了樣品上車測試,結果第一晚過去了,電瓶電壓掉得比平常更低,發動後自動啟停也不反應。看起來我量到很低的電流跟成功搞定省電(low power)是兩件事(淚) 當晚我在汽車鎖定的狀態下,端詳著板子上的LED燈。他設計成有封包就會閃,而且是每0.1秒亮暗切換。我真的看到LED一閃一閃亮晶晶,想破頭不小心觸發汽車警報!我一直都沒辦法順利解除警報,最後把OBD-II電源 & 警報系統的保險絲燒壞,車子也跑出錯誤碼收場 有三個讓LED閃爍的可能 LED閃爍讓汽車警報系統送出CAN封包 汽車休眠,還是定期會有CAN封包 我的關門器插上去,把汽車喚醒,於是出現CAN封包 看來問題不單純,要找兇手了 我還是得先修車,不然OBD-II頭沒電不能做實驗。雖然還在保固期,但跑原廠和他說我開發車用電子要出保固,似乎不大妥。趕緊約新竹知名的外場(昇佑汽車)處理,老闆很專業,很快就定位到保險絲的問題,幫忙消除錯誤碼,整台車又回復正常 下圖是換下來的5A保險絲,可以看到裡面的線已經斷掉 我和老闆討論起實驗,老闆很有把握:LED閃爍不會觸發警報。所以眼下只剩兩個可能(柯南背景音樂響起) 汽車休眠,還是定期會有CAN封包 我的關門器插上去,把汽車喚醒,於是出現CAN封包 ELM327還是很好用的 從駕駛座拉出一分二延長線,一邊接ELM327,一邊接遙控關門器,有趣的地方來了 接ELM327,汽車鎖定幾分鐘後,CAN bus確實平靜無波 接ELM327和遙控關門器,ELM327和遙控關門器都會看到CAN bus有封包 每隔幾秒就有一些封包送出 所以接上遙控關門器,就會讓汽車定期被喚醒一下(然後又立刻睡下去)。所以第一晚測試,汽車不斷被喚醒,吃了不少電 驗屍報告 CAN Transceiver有根腳叫CAN-TX,這根腳收到0,就會送出CAN bus的"dominant"信號叫醒大家。所以汽車睡覺時, CAN-TX必須永遠保持是1,才不會驚擾大家 經過一長串debug,我找到錯誤的原因了 開機瞬間,CAN Transceiver還沒啟動,CAN-TX是0或1都沒關係 事件A: 打開CAN Transceiver CAN-TX pin開機預設是0 ...

VOLVO+開發故事 (4),定義產品外觀,畫電路

圖片
在我之前,戰鬥民族俄羅斯已經有類似的產品,一共有兩個版本。第一個要拆開電動尾門後飾板,在裡面接5根線。這個版本其實非常省電,可靠,而且他有蜂鳴器可以提醒人注意。程式簡單無比,不用折騰CAN bus。缺點是安裝比較麻煩,像我就沒把握拆開自己的車,還有辦法無損再裝回去 俄羅斯人的CAN Bus產品長得像下面這樣:一個OBD-II的頭,搭配一串尾巴連接到盒子裡   安裝好以後,再把盒子藏到飾板裡面 這個外觀我就覺得不OK了:太大了!還要想辦法藏盒子,我覺得不好 我的原型只有三顆IC,最理想的尺寸是下圖ELM327的大小。我打開外殼,把裡面印刷電路板的大小用A4紙裁下來,再剪三張真實IC大小的紙片排排看 扮家家酒的結果顯示:似乎塞得下 只是藍色透明的外殼感覺有點low,我另外訂購了黑白兩色的外殼,感覺和車子比較搭 我找了身邊的硬體專家評估可能性。他們聽到信號速度只有125kHz,沒有高速信號,評語很簡單:塞得進去就結案了。問要不要幫我畫? 我寫了十幾年的韌體,一直想畫一次Layout,這個產品只有三顆IC,成功率滿高的,為什麼不試試看?KiCAD是一款免費的PCB軟體,裝了就開始動工了! 畫PCB有點像畫室內設計,需要先畫原理圖,描述IC怎麼連接,再來才是實際擺放。擺放的時候,軟體會提醒你哪根PIN要彼此相連,把所有線都接完基本上就搞定了 以前我看IC的手冊很少看封裝,現在我就得仔細核對IC的型號和封裝尺寸,畢竟畫錯了板子就是垃圾 電源的部分我有點特別留意要用高耐壓的元件,避免被突波打壞。不過這裡的耗電量只有13mA,只要降壓IC就結案了。最後挑選的元件都能承受到36v 擺放元件有點像老婆神奇的收納術,要在有限的面積塞下元件和走線。走線很難一次就滿意,多試幾次反覆修改,還真的給我畫出來了!同一顆IC我甚至留了兩個封裝的腳座,還可以選擇不同尺寸放上去(我買了兩種尺寸的CAN Transceiver,也才用得上) 我把圖印下來,放上連接器再確認尺寸。但是訂購的外殼還沒回來,不過尺寸看起來合用 幾個容易出錯的點要注意 IC接腳的定義要再看仔細,看錯了回來就是垃圾 還真的有幾顆電源元件錯了 OBD-II接頭定義再仔...