STM32 I/O

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 »

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 »

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 »

STM32 FDCAN Introduction difference CAN lib

前言 FDCAN(Flexible Data-Rate CAN)是CAN的升級版。特點包括 FDCAN格式 CAN-FD 與 CAN 2.0 的幀架構比較 在標識符之後,CAN 2.0 和 CAN-FD 有一個不同的操作: CAN-FD 與 CAN 2.0 之間的主要差異 STM32CubeMX Setting 這邊可以參考網路上H7的設定選項,使用G4或G0會缺少Messge Ram分配這區塊設定,其他部分雷同 FDCAN傳輸參考程式 這邊可以參考輸出如下 讀取如下 參考

STM32 FDCAN Introduction difference CAN lib Read More »

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 »

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 »

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