STM32 MCU

How to use DMA2D on STM32H7

前言 近期因為需要,所以需要幫客戶弄thermal camera顯示在MCU STM32H7顯示面板,使用STM32H750-DK,而這個開發版使用的顯示面板不是SPI驅動,所以只好開始學習LTDC+DMA2D,這個章節將會先介紹DMA2D使用方式與介紹 DMA2D的簡介 在實際使用LTDC控制器控制液晶屏時,使LTDC正常工作後,往配置好的顯存地址寫入要顯示的像素數據,LTDC就會把這些數據從顯存搬運到液晶面板進行顯示, 而顯示數據的容量非常大,所以我們希望能用DMA來操作,針對這個需求,STM32專門定制了DMA2D外設,它可用於快速繪製矩形、直線、分層數據混合、 數據複製以及進行圖像數據格式轉換,可以把它理解為圖形專用的DMA DMA2D工作模式 DMA2D操作 DMA2D的常用API要熟練掌握,後面的GUI的底層驅動加速,JPEG硬解,攝像頭等部分都要用到。這里為大家介紹如下幾個常用API: framebuffer的這種特性使得我們不能簡單使用memset這類高效的操作來實現矩形區域的填充。這邊下面展示2種方式作為比較 通常情況下,我們會使用以下方式的雙重循環來填充任意矩形,其中xs和ys是矩形左上角在屏幕上的坐標,width和height表示矩形的寬和高,color表示需要填充的顏色: 參考

How to use DMA2D on STM32H7 Read More »

How to use STM32CubeAI on STM32CubeMX

前言 這邊ST推出STM32CubeAI與NanoEdge AI Studio 2款軟體針對不同用戶族群,這邊會針對SRM32CubeAI做初步介紹與使用(STM32CubeAI 目前是掛載在STM32CubeMX底下的軟體包X-Cube-AI,這邊STM32CubeAI僅針對第3方軟體做轉換,不能自動生成AI model) STM32CubeAI 這邊會由STM32CubeMX去更新下載軟體包,並將其第三方生成的軟體轉譯成C code掛在STM32CubeMX專案中 這邊直接照一般步驟生成專案後把X-cube-AI加上專案中 下一步驟針對STM32CubeMX加入X-Cube-AI轉譯軟體包 如範例這邊如果都完成按下分析會跑成功 在專案上就會出現對應接口,且model也會放置在middlewares上 結構 參考

How to use STM32CubeAI on STM32CubeMX Read More »

Discovery STM32H750XB-External Loader

前言 由於 STM32CubeProgrammer 中,對 Flash 支持的型號有限,只能覆蓋一部分 MCU和 Flash 的型號,無法完全滿足客戶的需求。stm32CubeMX 製作 external Flash loader 的方法。客戶可以根據自己的型號,進行定制化的生成。這邊使用Discovery STM32H750XB為基準-從CubeIDE+CubeMX建立Eternal Loader 給CubeProgrammer使用 STM32CubeMX設定 建立QSPI配置以及DriverFlashMemory 官方有寫好的Code複製到資料夾內 這邊官方有提供範例可以下載,可以再依照範例修改 STM32CubeIDE Code修正 quadspi.h的部份將官方提供的資料複製 要在CubeProgrammer上面顯示的資訊 建立linker.ld檔以及產生出stldr檔 根據所使用的FlashMemory做配置 Complier產生stldr檔 放到STM32CubeProgrammer可以存取到的資料夾內 參考

Discovery STM32H750XB-External Loader Read More »

Internal Temperature Sensor On STM32

前言 STM32 微控制器具有內部溫度傳感器。 該傳感器非常粗略 (±1.5 °C),並在內部連接到 ADC 通道的一個,這使得輕鬆獲取設備溫度成為可能,無需任何額外組件即可使用。但請注意此溫度為相對溫度非絕對溫度,且有溫度最高與最低限制無法完全取代一般sesnor 內部計算方式 這邊選用STM32WB35為主要參考(It support the temperature range –40 to 125 °C.)這部分可以參考各系列的reference manual未經校準的內部溫度傳感器更適合用於檢測的應用溫度變化而不是絕對溫度。 數值位置要點 這邊是TS_CAL1/TS_CAL2要從Datasheet中抓取出對應Flash位置數值TS_CAL1_TEMP與TS_CAL2_TEMP分別就是對應30與130 計算公式及修正如下 STM32CubeMX設定 這邊需要再ADC部份把Temperature Sensor Channel 與Vrefint Channel開啟,針對Vrefint Channel是可選的未得確定內部實際Vref電壓來提高精準度 STM32CubeIDE Code 這邊有2種方式可以選擇一種是直接寫公式如下code區域或使用官方給出Function 這邊主可以參考網路範例TMPSENSOR_getTemperature把其數值抓取下來公式部分修正即可 Note 有反映讀取內部溫度時不是標準3.3V時會建議使用__HAL_ADC_CALC_TEMPERATURE()The value returned by __HAL_ADC_CALC_TEMPERATURE() seems to be closer to the temperature measured on the microcontroller’s casing.在電壓Vref不是3.3時會建議使用__HAL_ADC_CALC_TEMPERATURE() refer Web 參考

Internal Temperature Sensor On STM32 Read More »

STM32 USB_Device IAP practice

IAP前言 IAP(In Application Programming,應用內編程),是指程序在運行過程中對User Flash的部分區域進行燒寫,目的是為了在產品發布後可以方便地通過預留的通信口對產品中的固件程序進行更新升級。 IAP流程 這邊是開啟2包專案,其中一包是DFU另一包APP則是看需求撰寫,流程如圖,為便捷開發我們都會以DFU為起始位置 USB DFU實作注意事項 這邊因是燒2包程式,把Flash切割成2個區塊,因此需要留意DFU在程式中所占比的空間與要轉跳到APP的指向位置 如圖這邊第一步是需要先確認DFU程式占比,一般會預留一些空間避免蓋到APP Flash 這邊要留意預留空間盡可能以一個page為單位,這邊範例以STM32CubeMX生成因DFU抓64kb為主體因此APP會燒入在0x8010000為起始,詳細參考各系列的reference_manual(這邊範例以STM32G0系列為出發) APP端燒入注意事項 使用STM32cubePrg燒入記得要去留意Start address避免去覆蓋到DFU程式區域,且要確定DFU轉跳位置須為APP起始位置 這邊一樣要去修訂ld檔,但要修訂ld檔啟示位置 這邊最後一步是要去修訂中斷向量表的Offset這邊就需要依照各自需求去做變化 這邊有個小要點,就是部分MCU會沒有RCC初始化這區塊,如果APP轉跳後不會動,可以把這塊初始化移植上去這塊在sample code上都會有但由STM32CubeMX生成檔案可能會缺少這區塊 轉跳參考機制 這邊提供官方範例是以按鈕做轉跳,如果也可以變通為特定flash位置數值判斷是否要執行DFU還是直接跳APP,這邊以APP起始位置為0x08010000作為範例 參考

STM32 USB_Device IAP practice Read More »

STM32 RTC_Calendar(G0 Series)

RTC簡介 實時時鐘(RTC) 是一個獨立的 BCD 定時器/計數器。 RTC 提供具有可編程鬧鐘中斷功能的日曆時鐘/日曆。 RTC 還包含具有中斷功能的周期性可編程喚醒標誌。兩個 32 位寄存器包含二進碼十進數格式 (BCD) 的秒、分鐘、小時( 12 或 24 小時制)、星期幾、日期、月份和年份。此外,還可提供二進制格式的亞秒值。系統可以自動將月份的天數補償為 28、29(閏年)、30 和 31 天。只要芯片的備用電源一直供電,RTC上的時間會一直走。 STM32CubeMX設定 這邊為了準確性把Clock source由LSI改成LSE 這邊開啟重要的日期 RTC calibration clock output:RTC的1Hz輸出,可以做為秒跳時鐘源,每秒閃一次燈,電子表的:號。512Hz可以做為秒錶的時鐘源呀,秒錶是百分之一秒精度,512可以做到百分之一秒的四分之一精度。RTC reference clock detection:利用外部時鐘校正,其時鐘源必須要比LSE的時鐘還精準。 STM32 code RTC_HAL函式庫 這邊主要取前面4個來使用讀取出系統時間 參考

STM32 RTC_Calendar(G0 Series) Read More »

STM32 USB_Device(CDC_Standalone)

前言 使用USB中的CDC類來虛擬串口 Virtual COM Port (VCP)進行通訊,一方面對於上位機來說顯示出來的就是個串口,所有操作都還是對串口的操作;另一方面實際數據傳輸是基於USB的,數據傳輸速度得到大大提升。本文將對STM32作為從設備使用USB的CDC類虛擬串口(VCP)進行通訊的相關內容做個說明。 USB簡介 從USB版本來說目前STM32系列MCU可以認為都是USB2.0的(現在還有了UCPD,對外接口外形可以是Type-C的,但是這個是只能用於PD3.0充電使用的,無法用於數據通訊)。對於STM32系列MCU而言,USB FS的使用只要使用 DM / D- 和 DP / D+ 這兩個引腳就行了,最多也就加上ID、SOF、VBUS這三個引腳。而使用USB HS大多數還需要外接PHY芯片(比如USB3300),這樣使用的引腳就多了,至少也要用到12個引腳。STM32系列MCU在使用USB功能的時候建議使用外部時鐘,外部無源晶體或有源晶振這些,因為USB對時鐘精度要求比較高。STM32 CDC VCP對於win10和較新版本的linux來說是免驅的,對於低版本的windows系統需要安裝驅動,驅動下載地址如下:STSW-STM32102 STM32 Virtual COM Port Driver STM32CubeMX建置 #注意這邊VCP USB中斷必須要開啟USB才能被電腦認到 Code結構 上述配置生成的代碼中,對於用戶來說USB使用相關的代碼都在 USB_DEVICE > App 中,這其中最重要的就是 usbd_cdc_if.c 文件,大多數時候我們只要改寫這個文件就可以實現相關需求了,該文件主要結構與說明如下: 參考

STM32 USB_Device(CDC_Standalone) Read More »

STM32 USB_Device(DFU_Standalone)

前言 目前,ST的USB驅動有兩套,一套是早期的獨立版USB驅動,官方培訓文件中稱為Legacy library;一套為針對其Cube系列的驅動,根據晶片不同可能有區別,具體見對應晶片的Cube驅動包,官方培訓文件中稱為Cube library。 USB結構 下圖為USB應用整體系統架構 USB device library USB驅動的整個驅動庫的架構如下圖: USB device library process USB device library 使用方法 第二步: 在usb_bsp.c/h文件中,實現 USB 需要使用的底層硬件資源。具體函數見上文及附件源碼文件的註釋。第三步: 在文件usbd_desc.c/h文件中,實現USB Device的各種描述符。具體函數見上文及附件源碼文件的註釋。第四步: 根據需要修改usbd_usr.c/h文件。第五步: 根據源代碼進行各種配置 第六步: 實現USB Device所使用的類的源文件。例如本文使用了USB Device 的CDC類,所以上圖中出現了usbd_cdc_vcp.c/h文件。第七步: 在自己芯片對應的stm32f4xx_it.c文件中添加USB中斷處理函數。第八步: 在main.c文件中,定義USB_OTG_CORE_HANDLE USB_OTG_dev全局變量,然後調用如下函數初始化USB Device 即可 參考

STM32 USB_Device(DFU_Standalone) Read More »

STM32WB LPTIM counter(Timing) API

前言 在STM32中,相對較新的MCU部分型號配有LPTIM定時器。 比如:STM32F7、H7高性能MCU,STM32L0、 L4低功耗MCU,以及新推出的G0、G4系列中都配有這種LPTIM定時器。 具體哪些MCU配有LPTIM,大家可以下載對應的數據手冊查看。 本文圍繞STM32WB講述其中的LPTIM定時器。 LPTIM block diagram LPTIM的RCC和其他定時器相比較,其RCC功能更加豐富。通過上面框圖可以發現,LPTIM 可通過多個時鐘源提供時鐘。它可以由內部時鐘信號提供時鐘,內部時鐘信號可通過復位和時鐘控制器 (RCC) 在 APB、 LSI、 LSE 或 HSI 時鐘源中進行選擇。 低功耗定時器時鐘選擇問題(重要) 1、lptim_ker_ck接口內核時鐘,供lptim使用。 lptim_ker_tim接入到CLKMUX雙路選擇器的一個輸入端,另一個輸入端是LPTIM_IN1或者LPTIM_IN2的輸入。也就是說LPTIM的計數器可以選擇lptim_ker_ck,也可以選擇LPTIM_IN1或者LPTIM_IN。2、最關鍵的地方來了(1) CLKMUX多路選擇器對應的是CFGR寄存器的bit0:CKSEL用於控制內核時鐘選擇由內部時鐘源(APB時鐘或LSE、LSI和HSI等任何其他內置振盪器)提供時鐘。也可以選擇由外部時鐘源通過 LPTIM 外部 Input提供時鐘。(2) Count mode對應的是CFGR寄存器的bit23:COUNTMODE計數模式位,用於選擇 LPTIM 使用哪個時鐘源來為計數器提供時鐘。可以選擇計數器在每個內部時鐘脈衝後遞增。或者在 LPTIM 外部 Input上的每個有效時鐘脈衝後遞增。3、應用的時候,我們可以選擇(1) CKSEL = 0 , COUNTMODE = 0表示LPTIM內核時鐘使用的內部時鐘源,計數器通過內部時鐘脈計數。(2) CKSEL = 0 , COUNTMODE = 1表示LPTIM內核時鐘使用的內部時鐘源,計數器通過外部輸入脈衝計數。(3) CKSEL = 1 , COUNTMODE = x表示LPTIM內核時鐘使用的外部時鐘源,計數器通過外部輸入脈衝計數。 定時器句柄結構體LPTIM_HandleTypeDef

STM32WB LPTIM counter(Timing) API Read More »

STM32WB IWDG Function Introduction

獨立看門狗(IWDG) 上一章說到待機模式可以通過IWDG喚醒,獨立看門口功能框圖如下。實際上獨立看門口狗就是一個遞減計數器,當計時器的值減到0時,IWDG會產生一個複位信號,系統復位重新啟動。為避免產生看門狗復位,則需在計數器減到0之前重載計數器,即“餵狗”。當程序出錯時沒有刷新計數器,計數器遞減到0,系統復位重新啟動,避免程序繼續錯誤運行。PS:Since its clock is an independent 32-kHz low-speed internal RC oscillator (LSI), it remains active even if the main clockfails. IWDG STM32CubeMX設定 超時時間 Tout = (4*2^prv) / LSI * rlv (s) prv是預分頻器寄存器的值,rlv是重裝載寄存器的值 由圖知 LSI 為 32 KHz,當 prv 取 IWDG_ PRESCALER_32 ,rlv 取 1000時,Tout=32/32*1000=1s。即設置 1s 的超時溢出。 因為設置超時溢出為 1 秒,所以這裡每隔 800 毫秒餵狗一次 HAL_IWDG_Refresh(&hiwdg); 參考

STM32WB IWDG Function Introduction Read More »

Shopping Cart