發表文章

目前顯示的是 2020的文章

文章總列表

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

網頁版CAN bus分析工具

圖片
我自製分析CAN封包工具,想要什麼就刻什麼;源頭是candump紀錄的文字檔,這篇 筆記 紀載我怎麼用這些工具做分析 直接用文字編輯器閱讀 使用Excel分析 使用 Jupyter-Notebook 在網頁工具出來以前,我是敲指令串起一切步驟,每次做都覺得累(然後就很懶得做實驗了)。多年來我一直想學網頁設計,眼下就有個好題目。下圖是我的工作畫面,右邊兩個視窗觀測CAN bus有沒有動靜,左邊是Python Flask寫的網頁前台,填下面的表格就能做實驗:後台會把紀錄檔輸入資料庫進行分析。這裡要聊一下SQLITE3,有資料庫就是爽,一個檔案能存很多東西,不用再土炮的開關檔了。靠這個以後能走得遠,也比較好擴展 Log List有兩個連結,LOG能看原始記錄檔,點下ANALYZE看報告。Universe Histogram用EXCEL手工操作很繁瑣,現在直接看報告,爽爽的 CAN封包可視化分析也是直接產生,不用再手工操作 我得意洋洋的拿著去車上做實驗,然後程式又掛掉了 >_<  原來Linux沒有正常關機,sqlite3資料庫檔案很容易死掉,以後拔電源之前要想一下,資料庫也要備份就是... 修好以後,用著新工具感覺爽多了 寫工具很簡單,但是把工具整合到好用很難... SQLITE沒想像得難 網頁的介面很好用 網頁前台的技能值得投資,以後在公司寫工具,讓人爽爽的用瀏覽器操作才對 把這些設備縮得更小,塞一套樹莓派在車上隨時監看CAN Bus更爽(不過樹莓派有點耗電...)

CO-ROUTINE

圖片
我小時候一直很好奇,電動程式要怎麼一心多用?同時能吃鍵盤輸入,更新畫面,撥放音樂,這樣起碼三件事同時做。我小時候寫過BASIC,記得用play這個指令可以撥放音樂,撥放完了才能讓程式繼續執行下去 PLAY "..." After play done, execute subsequent commands 長大後我知道,這些API都是blocking call,這行PLAY得撥完才會出來;於是系統要設計緩衝區,先填入資料,再讓硬體慢慢撥放;硬體快要搬光了,打中斷通知程式填下一段音樂。這種概念是前景背景的設計,前景反覆跑(繪圖,吃鍵盤輸入,處理敵人);背景填音樂。只要他們切換得夠快,人就不覺得有中斷 後來學了另外一個方法叫執行緒(Threading),一個程式可以啟動很多執行緒,讓作業系統分時間喚醒執行緒。只要切割得夠快,人還是覺得他們是同時的。Multi-Threading的程式有個好處,他可能在多核心的電腦同時執行,於是就得用"鎖"處理同步存取的問題,這題不容易,暫且跳過 後來工作接觸到RTOS(Real Time Operating System),他們也是作業系統,只是資源更少,他一樣能在多個工作之間切換。這種切換工作的術語叫CONTEXT SWITCH,原理是切換之前,把程式的狀態保存下來,等一下就能切回來。下圖是個想像的CPU(大概是ARM7),切出去之前把所有暫存器(Register)的數值存下,還有程式跑到哪裡(PC)存下,這樣就能在工作之間切換 上述的一切招數都只為了讓處理器一心多用,或著說 多工 ,最底層都是CONTEXT SWITCH 前景工作,背景(中斷)工作 Linux多執行緒 RTOS多執行緒 原本上述CONTEXT SWITCH都發生在作業系統的層級,一般用戶摸不到;但C語言提供setjmp/ longjmp這對函數,可以儲存和還原CONTEXT,這意味著用戶就可以自己切換CONTEXT,不依賴作業系統,達成多工      拿他來做什麼? 本來軟體跑在RTOS上,希望移植到電腦執行,加速開發。最大的困難是底層的工作切換由作業系統負責,他們刻成組合語言,不容易移植。稍等... 前面不是說,setjmp/ longjmp提供CON