文章

顯示包含「STM32」標籤的文章

[開箱文] 帶有AI算力的正點原子 STM32N647 開發板

圖片
          STM32N647 晶片是單核 Cortex-M55 ,其內部工作頻率為 800MHz( 超頻 ) ,內建的記憶體大小約 4.2MB ,與其他 STM32Fx 系列的晶片不同,它沒有內建 Flash ,程式碼必須燒錄在外部的 Flash 。此外,晶片內建 NPU ,具備小量的 AI 加速算力,還有 JPEG/H.264 編碼器。順帶提一點,若有製作板卡的需求時,得由專業的PCB廠商來處理,推薦 JLCPCB  https://jlcpcb.com/hk 。 開發環境 過去習慣用 Keil IDE 開發 STM32 的板子,但是 N647 只能在 Keil 編譯,而無法進行燒錄與 debug ,因此只能用官方的 STM32Cube IDE 進行 step debug ,燒錄則用 STM32Cube Programmer 工具,將程式碼燒到外部的 Flash 記憶體。 影片連結【【正点原子】手把手教你学 STM32CubeIDE 开发【真人出镜】 STM32CubeIDE 开发视频教程 单片机 嵌入式】 https://www.bilibili.com/video/BV1Wp42127Cx/?p=3&share_source=copy_web&vd_source=c4accd27d29c32708912d15f0b5f15ce 開機模式 晶片的開機模式透過兩根 pin 腳切換,如下表,有三種模式:開發階段的開機 、 Flash 開機 、 序列方式開機。一般開發階段的開機就是透過 STM32Cube IDE 環境來運行程式碼,一旦 reset 後程式碼就消失了。 Flash 開機就是將程式碼燒錄到外部 Flash ,晶片透過 SPI 介面讀取程式碼運行。另一種是透過 USB 或 UART 序列方式讀取程式碼來運行。 在開發板的軟體包裡面,有個 External_Loader 目錄,裡面包含 MX25UM2565G 記憶體的下載程式碼的演算法 (MX25UM25645G_ATK-CNN647B_ExtMemLoader. stldr ) ,將這個檔案複製到 STM32Cube Programmer 工具的 bin 目錄底下。 外部擴展定址 底下...

STM32H7x 最佳化的數學運算,採用 CMSIS-DSP 函數庫

圖片
        STM32H750 的晶片核心是  ARM Cortex-M7,它是以  Armv7-M 架構所設計而成。內建浮點運算單元 (FPU - Floating Point Unit),以及數位訊號處理(DSP)模組,不過需要搭配適合的函數庫才能編譯成適合機器執行的指令碼。ARM 提供一套開源的 CMSIS-DSP 函數庫,支援 Cortext-M 系列的數學運算,能提升運算的速度。在 Keil IDE 開發環境下,STM32H750 的項目中打開下圖的選單,將CMSIS Core 和 DSP 模組載入,完成第一步驟。         接下來,我們要了解 CMSIS-DSP 有支援三種 ARM 的核心架構,這將影響程式碼的定義。 ARM_MATH_NEON 是第一種定義,代表 Neon 的核心, ARM Neon 技術是一種先進單指令多資料 (SIMD) 架構延伸,應用於 Arm Cortex-A 系列及 Cortex-R 系列處理器。 ARM_MATH_HELIUM 是第二種定義 ,代表 Helium 的核心 , ARM Helium  技術是 Arm Cortex-M 處理器系列的 M 系列向量擴充方案 (MVE)。Helium 為 Armv8.1-M 架構的延伸,可協助機器學習 (ML) 與數位訊號處理 (DSP) 應用大幅提升效能。STM32H750 並不屬於前面兩種的定義,就不用將它們放進編譯的過程裡。不過,我們要將這三個定義放進編譯,分別是 ARM_MATH_DSP ︑ ARM_MATH_MATRIX_CHECK ︑ ARM_MATH_ROUNDING 才行 。因為 STM32H750 晶片支援浮點運算,所以下圖的選單要開啟,如果不開啟的話,數學運算將會花費數倍的時間,甚至更多。         最後我們測試三角函數的運算,Cos(x)*Cos(x) + Sin(x)*Sin(x),運算一百萬次後,比較有無採用 DSP 的兩者效能。 下圖的程式碼,上半段是採用一般數學函數的運算,沒有 DSP 優化。下半段是採用 DSP 優化的函數,然後比較兩者的效能差異。     ...

[筆記] 製作一個 STM32H750 的外部 Flash 燒錄器

圖片
        STM32H750這顆晶片是 Cortex-M7 核心,內部時脈 480MHz,在同級的 STM32 系列中屬於高效能晶片。不過,它有個問題就是內部 Flash 容量太小,只有 128MB 而已,為了解決這問題,通常外部會掛一顆 Flash 晶片。此時,我們需要自製一個燒錄程式,如下圖所示,紅線標示的 On-chip Flash 是官方提供的燒錄程式,而另一紅線標示的 Ext Flash SPI 就是我們要提供給 Keil IDE 的燒錄程式。         如何自製一套燒錄程式給 Keil IDE 使用呢?放心,IDE 有提供一個範例項目,放在 \Keil_v5\ARM\Flash\_Template 目錄底下,我們工作就是將 FlashDev.c 和 FlashPrg.c 兩個檔案的函數給實現了即可。在 FlashDev.c,我們填入外掛 Flash 的屬性,比如容量大小﹑STM32 存取的位址﹑Sector size, Sector Addr...等,如下。         在 FlashPrg.c,我們必須實現底下幾個函式的驅動。由於外掛 Flash 晶片型號為 W25Q256,也就是寫一套驅動這顆晶片的程式碼。不必擔心!這部分可以從網路的開源找到相關的驅動程式碼 ( https://pan.baidu.com/s/1LuH_zhXgZMqHJcKoLcepdQ   提取码:kmbf )。         筆者下載後,還是會遇上驅動的問題,必須再進行 debug 後才能使用。這裡有一點要注意的,W25Q256 預設的 SPI 通訊指令是 3-byte Address Mode,但是整個驅動程式都採用 4-byte 模式,於是在初始化過程要先設定為 4-byte Addr Mode 才能成功使驅動程式執行,如下圖。         最後,將這個 Flash 項目編譯後,產生的 .axf  複製成 .FLM 檔案,再把這檔案放到  \Keil_v5\ARM\Flash 目錄底下,這樣就完成自製外部燒錄器的功...

[筆記] STM32H750 如何宣告一塊外部記憶體? 而不發生 HardFault 異常。

圖片
        STM32H750 內部記憶體不到 1MB,在記憶空間使用大的情況下,我們需要在晶片外部增加外部 SRAM 以滿足空間需求。如何宣告一個變數映射到這外部記憶體?對於編譯器版本 AC5 或 AC6 最安全的做法是底下這樣宣告:                 uint16_t    *myTest = (uint16_t *) 0xC0000000;   直接將變數的位址映射到外部記憶體位址上,然後計算好這個變數的 array 長度大小。 另一個宣告方式,如下,但僅適用於 AC5 版本,                     uint8_t myTest[128] __attribute__((section(" .exsram "))); 這樣宣告後,需要在 Keil IDE 的 scatter 檔案中,添加一個記憶體空間,如下圖所示。上面變數宣告的 section 名稱為 .exsram ,正好對應到下面 scatter 檔裡面的定義空間。如此一來,變數與外部記憶體的綁在一起了。 不過,光這樣做還不夠,因為在系統 SystemInit 函數執行後,跳到 main 函數前會對變數進行初始化,此時的外部記憶體與晶片之間的介面還未配置好,系統就直接存取外部記憶體會發生硬體異常,掉進 HardFault_Handler( ) 中斷裡面。因此,在 跳到 main 函數前必須執行 FMC 介面的初始化,把外部 SRAM 介面參數配置好,這樣就能存取外部空間了,而不發生異常情況。

[筆記] 兩款 STM32H7xx 攝影模組開發板 (H750XBH6 / H743VIT6)

圖片
        最近動手研究兩款 STM32H7xx 系列的開發板,去年已經做過 STM32H750 相關的案子,這次是研究攝像頭模組。購買一塊是 H750XBH6,另一塊是 H743VIT6,兩款的核心都是 Cortext-M7,最高時脈 480MHz ,屬於 STM32 系列的高效能晶片,開發板適合實現照相﹑攝影﹑記錄...等功能。兩款的主要差別在於 Flash 和 SRAM 容量的大小,如下圖。Flash 128kB vs 2MB ,H743可以用來開發更大型複雜的程式。內部可使用的 SRAM 都是 864kB ,透過擴充介面,可以外部再增加 SRAM 容量,H750 開發板外部又多了 16MB SRAM,可惜 H743 開發板沒有外增 SRAM。         若要開發邊緣運算的功能,所占用的 Flash 和 SRAM 空間都不少,這兩款開發板以 STM32H743 最為適合,但是需要再外增 SRAM 容量才行。實際上,STM32 市面上的開發板還沒看到帶有特大的記憶空間,反觀 ESP32-S3 Cam 模組很容易買到 Flash 8MB / SRAM 8MB 的型號板子,因此未來想要開發影像方面的功能,或許用 ESP32 做為前期研究較為適合,且價格更便宜。

[筆記] ARM Compiler 6 且不勾選 MicroLIB,晶片無法開機運行?

圖片
問題:STM32晶片用 ARM compiler 6 版本編譯,不勾選 MicroLIB,如下圖設定。燒錄後,晶片不會自動運行? 1. 使用 C++ 編譯,不能再勾選 MicroLIB,因為組譯會出現錯誤。由於 MicroLIB 不支援C++。 2. 改回 ARM Compiler 5,勾選 MicroLIB。 3. 或者使用 C++ 編譯,但需要重新定義一些 stdio 的函數,參考  keil MDK AC5向AC6迁移后如何重定向printf_ac6 printf-CSDN博客 。然後,勾選 MicroLIB,全部重新編譯。 4. 使用 C++ 編譯的解決方式,新增 Compiler I/O,如下圖。如果有用到 File or TTY,就勾選起來。

STM32H743VIT6 開發板並帶有 CAM 和 LCD 模組

圖片
        STM32H743 開發板帶有 DCMI 的鏡頭模組和 LTDC 控制器可外接 LCD 顯示模組,晶片的內部時脈最高可達 480MHz,內建 Flash 和 SRAM 記憶體,開發板的正背面,如下圖所示。開發板上面還有 SD 卡槽和 USB 接口,在應用方面可開發為照相機﹑攝影機﹑行車紀錄器...等終端產品。         晶片開機啟動機制:STM32H7x 系列晶片有一根 BOOT 接腳,當腳位電壓為低時,開機通電後,系統會從 Flash 的 0x08000000 位址開始執行,這塊區域正是我們所存放的應用程式碼。萬一我們程式碼寫得不夠完整而造成晶片系統陷入異常的時候,此時可能我們也無法透過 ST-Link 燒錄或除錯,遇到這種情況,必須將 BOOT 腳位電壓拉高,再開機通電,讓晶片進入 Bootloader。晶片在生產期間,ST會將官方的 Bootloader 燒錄在 Flash 的 0x1FF00000 位址,於是通電後進入這段程式後,我們就可以透過官方工具 STM32CubeProgrammer 從 USB 端口進行燒錄下載。 開發板生產商提供鏡頭與顯示模組的範例程式碼,連結如下 http://www.fdiot.top/forum.php?mod=forumdisplay&fid=52 ,我們用 Keil IDE 環境就能編譯並除錯運行。所提供的範例不帶 RTOS 架構,為了往後擴展便利,我將此範例架構修改為 RTOS 系統。首先,在 Keil 環境下需添加三個部分:CMSIS-RTOS2 ﹑  Device-Startup ﹑  RTOS,如下所示。 然後,程式碼呼叫 osKernelInitialize() 初始化函數,再創建新的線程函數 osThreadNew ( Routine, NULL, &osAttr ),最後呼叫 osKernelStart() 啟動函數,開發板就能運行 RTOS 架構了。 操作影片 https://youtube.com/shorts/LuNI9CanfJ4?feature=share

工控板 STM32H750 ADC / DAC / 網路介面

圖片
        在實務上,經常使用意法半導體的 MCU,本文介紹一塊高效能的工控板,如圖一所示,以 STM32H750 為基礎,其核心為 ARM Cortex-M7,最高運算時脈 480MHz。底下列出這塊工控板的周邊介面:      1) 12 路光耦合GPI      2) 8 路光耦合GPO (有帶+24V電源的接點)      4) 2 路DAC (12-bit, 0~10V)      5) 8 路ADC (16-bit, -10.24V~+10.24V, 外接 ADS8688 晶片)      6) RS-485 x 4, RS-232 x 1, FDCAN-bus x 2, USB-to-COM x 1      7) Ethernet RJ-45 (外接 LAN8720 PHY)      8) 8 路高速 PWM 輸出 值得一提的是這款工控的 CAN bus 是高速的 FDCAN (Flexible Data-rate CAN),傳輸速度可達 5Mbps,原本的 CAN 只有 1Mbps。 圖一:STM32H750 工控板的外觀         工控板上面外接了一顆 ADS8688 的 ADC 晶片,其規格是 16-bit 解析度,總取樣率為每秒 500k samples。在取樣的效能上,比起之前的 STM32F407 工控板提升了不少,請參考前文  https://han-ya.blogspot.com/2024/03/stm32f407-24-bit-adc.html 。雖然 ADS8688 晶片最高取樣率為每秒 500k,但是實際與 STM32H750 搭配後,只剩下 53.9k 左右,因為兩者間的通訊為 SPI,需要處理每筆通道的中斷服務,這會耗損不少時間。筆者也曾試著用 SPI_DMA 方式,看看能不能解放更多 MCU 的時間,無奈,效果更差,大概只剩不到 20k 左右。

STM32MP157 的 Linux 系統處理器 -- 第二步建立 Qt Creator 開發環境

圖片
        STM32MP157開發板通電後,如下圖,開發板上面所運行 Qt 的版本為 5.12 ,因此我們從 Qt 官網下載對應的版本來開發 UI 介面,網址: https://download.qt.io/archive/qt/5.12/5.12.9/ 。 MP157 上面運行的作業系統是 OpenLinux ,要從 ST 官網下載 STM32MP1 OpenSTLinux Developer Package ,安裝包裡面有交叉編譯器和基於 Yocto 的 SDK ,安裝過程請參考 [2] 第一章或 [4] 第六章。         安裝 Qt Creator 5.12.9 後,需要將上述 cross compiler 的位置指向 ST 官方自帶的工具,如下圖所示,請參考 [2] 第二章。第一步先設定 qmake 路徑,第二步再設定 C++ 編譯器的路徑,最後再將開發環境的配置設定好。 第一個範例         利用 Qt 來編譯我們第一個範例 Hello World , Qt 能分別編譯 Ubuntu 環境的 UI 介面,也能編譯 MP157 開發板的 UI 介面。下面第一張圖是運行在 Ubuntu 系統的 Hello World ,下圖第二張是運行在 MP157 板子的 Hello World ,如果第一個範例能成功運行在不同系統的話,這代表我們上述安裝 Qt 開發環境是正確的。 參考資料 [1] STM32MP1 嵌入式 Linux 驅動開發指南 V2.0 [2] STM32MP157 出廠系統 Qt 交叉編譯環境搭建 V1.1 [3] STM32MP1 嵌入式 Linux C 應用編程指南 V1.4 [4] STM32MP157 快速體驗 V1.6

STM32MP157 的 Linux 系統處理器 -- 第一步建立開發編譯環境

圖片
STM32MP157開發板的資料非常多,本文主要是抓出建立一個開發環境的重點部分。MP157  晶片有兩顆 ARM Cortext-A7 核心 800MHz 和一顆 Cortext-M4 核心 209MHz ,其中 A7 運行 Linux 核心。由於其多核的架構適用於處理複雜的任務,比如智能家居、環境監控、安防、自動控制系統、智慧醫療監測 … 等嵌入式的 Linux 應用。 首先認識啟動過程,當晶片通電啟動後,先跑 TF-A(STM 的安全開機流程 ) ,接著運行 uboot 開機程式 ( 俗稱 bootloader) ,此時 uboot 會載入 Linux 核心到 SRAM ,最後再運行 Linux 系統,周邊設備的驅動會被 Linux 系統帶起來,呈現給我們的就是 Linux 操作介面。 由於是 ARM 為基礎的晶片,編譯過程需要用 ARM 官方的編譯工具,也就是 tool-chain 。正點原子建議使用 gcc-arm-9.2-2019.12-x86_64-arm-none- 版本,這是 2019 年底出的 9.2 版本,有分為 Linux 和 Windows 版。同時, STM 官方有提供 TF-A 、 uboot 、 Linux 內核的原始碼,為了避免編譯原始碼產生錯誤,最好用同一編譯版本 9.2 版,因為無法確認新版本編譯工具是否能成功編譯原始碼。最後留意一點,如果要修改 uboot 或 Linux 內核驅動的話,最好在 Ubuntu 的環境底下進行原始碼的編譯。 Cross Compiler交叉編譯器 首先,到 ARM 官網下載 https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads ,搜尋 version 9.2 。 如果安裝到 Windows 環境,選 Windows (mingw-w64-i686) hosted cross compilers 底下的 AArch32 target with hard float (mingw-w64-i686-arm-none-linux-gnueabihf.tar.xz) 。然後,用 WinRAR 工具將它解壓縮到某一目錄下...