yj hung

Azure RTOS ThreadX on STM32 MCU

前言 目前在最新系列H5/U5/U0 /C071使用STM32CubeMX建置出USB的基底都變成USBX是以Azure RTOS ThreadX 架構去撰寫,變成如果需要使用舊的FreeRTOS會必須自己搬移code相對變得麻煩許多,但因新的Azure RTOS在結構上優化這邊就嘗試研究撰寫整理文章 簡介Azure RTOS Azure RTOS 的核心是 ThreadX,它是一種即時內核,ThreadX 擁有多種競爭優勢,其中包括多種安全關鍵認證。Microsoft 提供Azure RTOS 也能夠最大限度地減少品質和可靠性問題,大大降低此類問題可能引發的冗長調試會話,總體上有利於 RTOS 用戶。 ST支援與架構 這邊會以主要THREADX架構往下生成 這邊留意Azure RTOS有支援USB PD但ST還未整合完全需要自己寫USB-PD is supported by ST USBPD library and applications provided in STM32Cube MCU packages. But it is not yet integrated with STM32 Azure® RTOS MW solution. THREADX簡介 ThreadX 是一個即時作業系統 (RTOS),專為嵌入式系統而設計 ThreadX 支援表如下 ThreadX操作 從 […]

Azure RTOS ThreadX on STM32 MCU Read More »

How to create DLL by Visual Studio

前言 之前因都需要使用CMD呼叫外部工具去讓PC對微控制器發送HID指令,這邊就想嘗試把這塊整合成DLL使用call DLL方式去達成,一來可以簡化操作也可以比較快速達到目的,今天彙整網路上各個資訊把如何使用Visual Studio生成DLL做完整 建立一個 DLL專案 選擇建置DLL專案,並且新增一個 .h 的檔案 官方文件中提供了兩種方式可以匯出dll中的函式: 首先新建立標頭檔案“XXX.h”,它的作用是用來宣告需要匯出的函式介面。 在新增的標頭檔中,填入以下程式碼。 再來要加入「C++ 檔(.cpp)」 然後我們需要在‘XXXXl.cpp’中實現在‘XXXXl.h’中被宣告的函式,程式碼如下: 與其相對的還有一句程式碼是__declspec(dllimport),此修飾符的作用是告訴編譯器和連結器被它修飾的函式或變數需要從DLL匯入 這是由於C語言沒有過載,不會改變函式名。而C++中有過載,在編譯過程中會根據返回值和引數修改函式名。 如何呼叫dll 參考

How to create DLL by Visual Studio Read More »

MCSDK Json File Description

前言 MCSDK目前在6.3.0版本後面新增開發版自訂圖形化模式,相對便利,但在6.2.X版本中都是要去自訂修改Json才可以把自訂功能加上去相對來說是相對麻煩的,而且需要先去對MCU pin腳是否有吻合功能需求。這邊就教學2個版本在自訂開發版上要如何修改 MCSDK6.3.0 Board Define 在最新的6.3.0以上版本目前已知bug是加上FreeRtos會導致UART無法正常連線,如果自己搬移修改會導致MCU進入HardFault,但在自訂板子上多了圖形化介面很方便自己去修改 這邊操作就比較簡單大概就是選取MCU或Power版或整合在一起的板子,比照認知選取即可 MCSDK6.2.X Json File 低於6.3.0版本就比較麻煩會需要到以下路經的資料夾中複製出來檔案直接做文字修改 這邊可以先複製一快開發版JSON到桌面開啟後可以看到,在MCU板那塊選擇目前有支援的即可在把對應的pin填上但其實更快的是直接使用inverter去改寫會快很多 在inverter上就比較顯而易見針對各種回售補對應參數就快速很果,並且在ST官網上也有描述 小Note,在Power 板上面的描述針對Shunt電阻數值這塊可以使用舊版MCSDK5.4.8 針對Shunt阻值的修改如圖最後就可以使用計算器完成數值 參考

MCSDK Json File Description Read More »

State observer sensorless algorithm

前言 State observer sensorless algorithm是ST的SDK所使用的方式,這邊會來深入解說observer+PLL算法以對應ST MCSDK所要調整參數,讓在調整參數上更為快速能準確完成任務目標,所參考資料為ST MCSDK 6.3.0版本以下是眾多sensorless馬達控制這次僅針對State observer 永磁同步馬達的數學模型 永磁同步電機,在α-β軸系下的電壓方程的一般表達形式 對龍伯格觀測器進行離散化,設採樣時間為T,則離散化後的觀測器為右圖 鎖相環(Phase-Locked Loop) 上面已經算出了反電勢的估計值,直接透過反正切函數就可以分別計算出位置和速度了,如下: Sensorless tuning STO & PLL page 針對ST參數有一個對照表如下 參考

State observer sensorless algorithm Read More »

STM32 Ethernet Sever (UDP and TCP)

前言 上篇章節初步介紹ST MCU 在Ethernet 的設定與ping ID,本章節會介紹2種Ethernet常見的UDP 和TCP Sever and Client都會介紹到。並比較2者不同處與注意事項,下一篇章節就會在更進一步討論LWIP等問題 UDP Vs TCP 2者基本上都會使用到UDP比較常使用在無線傳輸,TCP比較常用在有線傳輸比較表如下,基本上可靠度TCP會比UDP好,但傳輸效率上TCP會比較慢 STM32CubeMX setting 這邊基本上跟之前設定相同,並沒有特別不論UDP或TCP都是一樣的 Coding For SERVER 這邊可以發現大部分都有建立好Function可以使用,除了一開始IP宣告主要的要點就是接收 UDP TCP UDP主要接收是寫在callback TCP是額外寫 UDP的部分是比較簡單,TCP部分會需要額外寫除了接收外還要寫處理流程等等比較嚴謹 tcp_server_recv Server Handle 參考

STM32 Ethernet Sever (UDP and TCP) Read More »

STM32 Ethernet for H7 Series

前言 Ethernet在ST高規格MCU中存在該Funtion,但都沒有機會認真研究,這次剛好有客戶提出問題在於Ethernet如果在開機狀態下不接上,事後在接上線路會無法連上ethernet,藉由這次機會來研讀該Function的使用方式與詳細細則 STM32CubeMX設定 先設定ETH設定RMII,這邊可以參考圖設計或英文文字設定 另外開啟LWIP,這邊是以10KB為一個單位的the Heap 注意一定要把LWIP_NETIF_LINK_CALLBACK選上,不然連線狀態改變不能進入拔下或插入網路線回呼函數 Cortex-M7設定Lwip使用DMA傳遞訊息,對應的DMA記憶體定義在sram。 H7的sram分為好幾段,高速段為cpu獨享,通俗點說就是這段允許使用者寫的程式使用,但不允許DMA使用。 所以為DMA定義的記憶體或數組要避開這一段。 另外Lwip使用DMA時有互動存取問題,避開這段後,也不能讓cpu像使用普通cache那樣亂序使用,否則將可能出現嚴重問題。 (1)Lwip不被允許使用cpu專用的高速L1快取(DTCM),只能用D2 Sram區域;(2)cpu可以無序存取cache,為防止這種情況,Lwip的DMA段必須是device類型或Strongly-ordered類型,保證有序;(3)透過MPU配置這段cache,其中一段允許share、允許buffer,長度為256Byte,放置TXRX互動存取頭;另外一段不share,不buffer,不cache;長度32k Coding (添加簡單的 Hello UDP ) 在 main.c 的開頭新增以下包含檔案: 在 main.c 寫入 參考

STM32 Ethernet for H7 Series Read More »

STM32H5 DMA 2D addressing Overview

GPDMA GPDMA 是一種系統週邊設備,是 AHB 匯流排上的雙埠主設備。 它被用於透過鍊錶在外部和/或記憶體之間傳輸資料。 所有 GPDMA 可程式傳輸均在系統層面提供更高效能,並使 CPU 無需執行這些資料傳輸任務。 STM32CubeMX建置 這邊和舊的DMA不同會全部都彙整到GPDMA處設定,在所需要開啟DMA的interface,設定會直接link到GPDMA設定這邊通常都設定標準模式 這邊注意不同通道會有不同字結長度 GPDMA Coding 這邊可以參考UART範例 參考

STM32H5 DMA 2D addressing Overview Read More »

STM32CubePrg API(example project)

前言 這邊因協助客戶需要把ST更新軟體鑲嵌在客戶自訂的軟體上面,因此這邊就深挖STM32CubePrg原始的接口,並把他逐步整合到客戶指定的樣板上,基本上架構是以STM32CubePrg為主,這邊interFace會以USB DFU為主介紹(HID等客製化方式不再此介紹範圍) STM32CubePrg Project 結構 這邊主要會拆成2部分一部份是設定連接MCU的資料與連接上更新的interface,首先我們會先到以下路徑開啟project 該資料夾是在安裝STM32CubePrg後就會存在C曹個人資料夾中 第一部分是Set MCU更新資料 這邊幾個注意事項這邊已USB為例 該路徑事需要指向Database內,確認需要被更新MCU為哪顆保留一個該檔案即可,也可以先使用ST-LINKV2連線該資料會出現在STM32CubePrg Information上,可以不用全部都採納,但指向路徑必須設定正確 更新主軸API(USB為例) 再來是選擇InterFace去完成,這邊選用USB 這邊基本上做FW download Function就是downloadFile 其他都是在檢測是否有正常連線到,這邊有測試該Function是否能帶入絕對路徑,結果是部分會fail,可能在內部最佳化部分絕對路徑相對資源所以會建議使用相對路徑去執行 參考

STM32CubePrg API(example project) Read More »

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 »

Shopping Cart