yj hung

Finding absolute path in C code

前言 近期因客戶臨時要求須要把原先相對路徑的指向,全部修改成絕對路徑,查詢後這個方式僅能使用windows API去組合,但因開發工具特別被綁定只能使用C,C++的語法會出現無法編譯現象,因此這邊會搭配特數字串裁切方式協助各位製作出尋找絕對路徑的方式 相對位置 這邊先介紹相對位置,因撰寫比較簡單而且只要確定執行檔案開啟參照點使用以下方式去撰寫即可操作可以看到這邊僅從exe執行檔位置起走,找尋對應參照 但使用相對位置會出現從其他地方指向該資料夾執行exe會導致,周邊相對位置無法正常被執行,因路徑找不到,因此這邊如果有需求是需要從其他路徑指向或CMD方式從其他目錄去開起執行檔,就需要改成絕對位置 絕對位置 絕對位置這邊就會需要使用到windows API,因但純C會有點難實作主要借助主要使用到的Function為GetModuleHandleEx與GetModuleFileName,這邊就可以獲取到目前執行檔的絕對位置,但這邊還包含執行檔本身名稱,因此會需要再把執行檔名稱去除,但目前有些project不支援C++因此PathRemoveFileSpec可能會無法使用下面提供一小段範例去找出絕對路徑 結果圖如下 去除執行檔字串 這邊提供2種方法第一種是使用C++ windows API 另一種方式須先轉義成char在操作,基本上就是搜尋關鍵字位置,然後再複製到新的區域截掉不需要部分 參考

Finding absolute path in C code Read More »

USB device custom HID class on STM32

前言 USB 的東西,肯定是需要PC 端的軟體配合,尤其是這一種屬於比較客製化的 Custom HID 的東西,雖然HID 是不需要PC端的驅動程式,但還是得要準備自己的上層應用軟體,這個不像一般標準的Virtual COM 可以用超級終端機,這邊針對Device的HID部分較多客戶會有需求希望做成客製化因此該文章會來探討這部分 STM32CubeMX設定 這邊基本上開啟USB後再ST會有選單可以協助弄出客製化設定的HID 其中這一塊是可以針對自己需求新增和配置,可以先使用預設數值再做修正,然後就可以調整clock tree後生成檔案 STM32CubeIDE 這邊主展開專案可以看到主要有幾個c檔,這3個檔案是主要要客製化HID部分會需要確認的檔案可以看下方檔案描述Function 這邊針對Size部分可以再usbd_customhid.h看到CUSTOM_HID_EPIN_SIZE and CUSTOM_HID_EPOUT_SIZEdefinesto 0x40 (64 bytes):這部分主要是因一開始STM32CubeMX設定64 USB裝置標準描述符會在usbd_custom_hid_if.c 這個file內可以詳細看 Information for Developers | USB-IF: 再來是上報資料給電腦CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE],建議使用 HID descriptor tool工具產生報告符,這裡要注意的是報告描述符大小USBD_CUSTOM_HID_REPORT_DESC_SIZE,一定要與實際產生的報告描述符大小(使用HID descriptor tool可查看)相對應,否則會導致HID設備配置失敗。 再來就是定時發送report來更新數據了,USBD_CUSTOM_HID_SendReport,這個函數在usbd_customhid.c中定義 參考

USB device custom HID class on STM32 Read More »

Digital Power Introduction

前言 數位電源(Digital Power)也稱為智慧數位電源(Intelligent Digital Power),是電機工程中針對電源供應設備的分類,是指用數位方式控制、調整及監控的電源供應器。在數位電源中,會有單片機或數位訊號處理器,用其中的韌體來來控制及監控輸出,但還是會有一些類比電路進行PWM控制,信號調整或是在特定頻域進行補償等。 優點與種類 數位電源不外乎是DC to DC/AC to AC /AC to DC/DC to AC等等,而會從原來類比設計更改為數位電源的設計不外乎優點如下 針對第一點,數位電源晶片透過系統管理匯流排(System Management Bus, 縮寫為 SMBus)協議相互聯繫,其所使用的電源管理匯流排(Power Management Bus, 縮寫為PMBus)協議是使用數位與功率轉換系統進行溝通聯繫的標準協議。這個標準協定可以系統整體性能提升,讓大系統更好的去做到控制 ST 數位電源方案 ST基本上在數位電源這塊主要也只有3款MCU是大多數客戶有在使用,分別是F3(非主流)G4(目前主要)H7系列(高性能),目前有在開發中的板子如下大多都是DC to DC或AC to DC後續會針對這個部分再繼續說明 參考

Digital Power Introduction Read More »

STM32 OneWire for Charger

前言 目前客戶需求有接觸到包code部分,需要協助開發完成1 wire對於電池的感應等等,會走UART OneWire需要去驗證是否可以正常work ,在下一版規劃上面也會有些許不同,這邊因先把one wire資訊統整併做驗證方法上做比較細部說明。 簡介 OneWire匯流排操作,將stm32的串列的TX接腳與RX接腳短接後與1-Wire匯流排連接 基本上在STM32CubeMX上設定和一般UART是相同的 線路上外部對接即可 這邊Code部分 1-Wire/UART 位元時序 UART 可作為匯流排主控器,因此在 TX 輸出引腳從高電平到低電平的轉換時開始所有通訊。當電氣介面將緩衝的 TX 訊號連接到 RX 輸入接腳時,UART 每發送一個位元組就會接收一個位元組。 圖 6 和圖 7 產生的讀取時隙使用的波特率為 115,200。從 1-Wire 讀取 0 接收的 RX 位元組範圍從 0xFE 到 0x00,取決於從裝置的內部時基和 IO 上升時間。 參考

STM32 OneWire for Charger Read More »

Single-shunt VS Three-shunt

前言 這邊因設計參考需要,深入研究 single-shunt and three-shunt ,此篇文章會深入探討這2者差異與新舊版MCSDK的差異,另外深入介紹這2者Sensing的流程與差異 Shunt電阻設計 前一篇有提到不同Shunt電阻設計,這邊簡單針對系統回顧 基本上會分成3個部分Filter/offset/OPA,其中Filter是不一定會加上的部份,因為加上RC Filter會讓響應速度變慢,這邊會在一些速度控制上來說不一定是好的,但加入RC Filter可以提高在快速降速上避免OverShut的過大導致偵測錯誤Offset部分基本上一定要加因為ADC是無法收到負值,最後OPA部分就是看需求條配Gain值大小 3 shunt 介紹 3 shunt 電流偵測偵測的彈性度會比較高因公式𝐼𝑎 + 𝐼𝑏 + 𝐼𝑐 = 0 這邊3 shunt各取2項就可以推算出全部因此,相對1 shunt偵測不會有複雜的演算法和偵測死區,但成本上3 Shunt會比 1 Shunt設計來的高 The threeshunt technique can bounce sampling between current signals, selecting two out of three phases eachperiod, which allows long time periods for the current signals to

Single-shunt VS Three-shunt Read More »

Adding ADC channels and PINs in MCSDK 5.X

前言 馬達控制使用MCSDK時候因為ADC已被使用來採樣Shunt電流,這邊在現有的ADC上要再增加通道會需要考慮到取樣率等問題,如果直接用STM32CubeMX加ADC通道沒有做成是排成修改,會讓系統排成Fail,這邊主要是提供資訊如何在馬達專案上增加通道用在飛Shunt電阻採樣 實際操作 關鍵步驟 把標頭檔文件加入宣告,另外需要加入引用 新增 ADC 連接埠配置初始化程序以及控制引腳電平 最後使用內建函數配合排成 ADC channels注意事項 這邊如果依照原先增加方式通道是只有2可存放單純改通道數目會出現Hard Fault 仔細研究後會發現除了改以上通道外標頭檔的宣告文件RCM_MAX_CONV內也需要跟著修改 參考

Adding ADC channels and PINs in MCSDK 5.X Read More »

I3C (bus) using in STM32H5 series

前言 MIPI在I2C的基礎上誕生了I3C,它與I2C一樣使用兩根線,並且支援IBI中斷和熱拔插,同時頻率可以達到較高的頻率,因為它與I2C不同,I2C兩根引腳使用的 是開漏輸出,開漏內部接地是無法輸出高電平的,如果需要輸出高電平必須外接上拉電阻才能實現高電平輸出,但是電阻會阻礙電流導通,所以會比較耗時,I2C 最高也才達到5MB,但I3C可達12.5MB,且功能比I2C強大許多且它支援I2C,向前相容。 I3C Bus介紹 MIPI I3C 結合了傳統I2C和SPI介面的關鍵屬性,以提供統一的、高效能、極低功耗的解決方案。I3C介面使用的跟I2C類似,也是一條漏級數據線(SDA)和一條推挽式時脈線(SCL),該SDA線上的從設備可以控制資料匯流排,並且可以啟動中斷。主控透過此SCL線可以將匯流排的時脈頻率調節到12.5MHZ。I3C支援多種類型設備,包括Main Master(目前主設備),secondary master(輔助主設備)、I3C Slave、I2C Slave。 I2C Vs I3C 與 I2C 模式相比,I3C 還降低了功耗,並在 12.5MHz 下提供了更高的資料速率。 I3C仍然支援I2C的ACK確認方式,只是某些情況下I3C要求只能使用I3C的方式來進行ACK,這麼做的目的是忽略掉總線上I2C的設備, 例如分配動態位址是時不想讓I2C設備參與進來那麼久使用這個方式來忽略掉I2C設備,因為傳統I2C設備只會在SCL拉高時來確認ACK,如果I3C將SCL拉低那麼I2C設備會把此 次通訊視為沒有ACK訊息視為失敗則放棄本次通訊 I3C dedicated VDDIO2 supply pin 專用電源接腳 VDDIO2 降至 1.08V。 因此,包括I3C在內的所有這些通訊介面都可以工作電壓為 1.2V STM32CubeMX – I3C 配置 Bus characteristics 這邊針對2個case計算配置 Sample code 這邊以ST官方這邊提供6種模式範例提供選擇依照客戶需求確認即可 參考

I3C (bus) using in STM32H5 series Read More »

ECDSA_SignVerify(SHA256) STM32F4 series

前言 針對驗證簽名部分,因近期客戶需求但MCU部分被綁定無法放入SBSFU去做更新,而且SBSFU更新部分目前提供範例也僅UART,其他interface需要自己coding,最後這邊討論後只做簽名驗證來防程式被修改,該章節會介紹簽名驗證流程和原SBSFU流程 參考軟體包 這邊因單純驗證簽名因此直接參考x-cube-cryptolib即可,因這邊使用F4系列所以這邊參考比較舊相近系列L152,因G4或L4是相對較新的系列避免有些Function不存在 圖解流程基本上如下 其實可以看到MCU會需要處理部分主要是把資料轉換,因這邊選用是SHA256所以是把檔案轉換SHA256格式,再透過ECC校驗,這邊公/私鑰匙的生成是透過OpenSLL生成,使用為外部軟體非在MCU內執行生成 SBSFU簡介 因SBSFU是包含加密更新部分,而F4是屬於比較舊款因此支援部分沒有到這麼多參考圖如下 而已更新步驟來說會如圖,因此你可以看到如果需要加密更新你的code size不能太大另外,或你的Flash size需要夠大(APP Code需要2倍大小,這邊大概說明流程,因這次只使用到驗證簽名部分所以這邊就不詳細說明 ECC驗證簽名Code 在程式上會分成2部分 Boot code和APP code,App code部分比較簡單會透過外部軟體所增加標頭檔部分打包起來 這邊主要2個檔案需要修改1.system_stm32f4xx.c2.ld檔案 這邊是用python寫外部加密打包檔案這邊跟MCU較不相關未來再詳細說明 把APP剛剛規劃標頭檔相關位置填入,因驗證部分會需要知道相關資料位置 在執行檔中需要把Key引用帶入,在執行檔最後加入下方 鑰匙部分也是需要call外部軟體生成(OpenSLL) 最後在main.c部分就比較簡單主要是把加密驗證簽名部分補上即可,前半在做把鑰匙BIN和簽名BIN輸入陣列中 參考

ECDSA_SignVerify(SHA256) STM32F4 series Read More »

NMI interrupt trigger issue for STM32GXX

前言 客戶使用STM32G491MCT6料號,但遇到試產階端有部分料件在讀Flash會卡住,這邊因在一般測試都沒有遇到,只能靠經驗摸索,使用PC counter最後發現所提的位置都在NMI interrupt,這個問題找尋資料偏少,由此紀錄一下。 NMI Interrupt介紹 在計算中,不可屏蔽中斷(NMI)是一種硬件中斷,系統的標準中斷屏蔽技術無法忽略它。這樣做通常是為了警告不可恢復的硬件錯誤。某些 NMI 可能會被屏蔽,在這種情況下,您應該使用您自己的特定於特定 NMI 的方法。 當響應時間至關重要或在正常系統操作期間不應禁用中斷時,通常會使用 NMI。此類用途包括報告不可恢復的硬件錯誤、系統調試和分析以及處理系統重置等特殊情況。 可以看到圖表會觸發NMI中斷的有SRAM parity error/Flash ECC/HSE CSS Case1:Clock security (CSS) configuring HSE and CSS in RCC, and shorting one of the HSE pins to something else, but it might void your warranty. 這邊解法基本上就是去看HSE等硬體問題 Case2:SRAM parity error The parity bits are computed and stored when

NMI interrupt trigger issue for STM32GXX Read More »

ST7735 TFT LCD Module with 4 IO 128*160

前言 LCD的選擇有很多種,尺寸也很多,但若需要顯示彩色的畫面,這邊推薦ST7735, CP值最高,效果也不錯的。本範例將介紹ST7735 彩色1.8吋顯示螢幕與STM32的使用方式。這邊參考Arduino Adafruit函式庫,函式庫為所有的LCD和OLED顯示器提供了通用語法和圖形功能。 接線說明 這邊可以參考以下說明 Sample Code 這邊可以直接移植Arduino或網路直接抓Driver這塊因為便宜有更多人選用開放資源也很多 以下2個是最常使用到Function 下面可以看到是常用Fuction詳細內容 影片參考 ST7735驅動程式設計要點 參考

ST7735 TFT LCD Module with 4 IO 128*160 Read More »

Shopping Cart