STM32 I/O

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種模式範例提供選擇依照客戶需求確認即可 參考

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傳輸參考程式 這邊可以參考輸出如下 讀取如下 參考

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表示需要填充的顏色: 參考

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個來使用讀取出系統時間 參考

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); 參考

GPIO Setting for Different Speed

前言 這邊因在操作SPI,但SPI速度提升超過10MHz會出現CPOL/CPHA錯位的怪異現象,後來查詢許多方式,發現貓膩在GPIO設定上面,這邊針對踩雷部份GPIO SPEED SETTING做詳細設定說明,不限定在SPI上面所有通訊協定皆通用。  STM32 GPIO Ports  在STM32上面GPIO結構如下圖  STM32 GPIO Speed STM32CubeMX配置GPIO 輸出引腳,都會有速度GPIO_InitStruct.Speed 不同MCU型號,速度選項,有些有3個,有些有4個。一般定義在xxx_gpio.h文件中 STM32CubeMX配置,這邊default為設置最低因此如果要更動到其他高傳輸速度需要更動設定 PS:如果输出速度和配置速度不匹配,會明顯看到波形不正常這邊選用高低速差異如下 參考

STM32 Watchdog Introduction

前言 IWDG(Independent watchdog)獨立看門狗,可以用來檢測並解決由於軟體錯誤導致的故障,當計數器到達給定的超時值時,會觸發一箇中斷或產生系統復位獨立看門狗的時鐘是它專用的低速時鐘(LSI),所以它能保持工作及時主時鐘出現問題。視窗看門狗的時鐘是有APB1時鐘分頻得到得到,通過可配置的時間視窗來檢測應用程式非正常的過遲或過早的操作。 視窗看門狗(Window watchdog)通常被用來監測,由外部干擾或不可預見的邏輯條件造成的應用程式背離正常的執行序列而產生的軟體故障。除非遞減計數器的值在 T6 位變成 0 前被重新整理,看門狗電路在達到預置的時間週期時,會產生一個 MCU 復位。如果在遞減計數器達到視窗暫存器值之前重新整理控制暫存器中的 7 位遞減計數器值,也會產生 MCU 復位。這意味著必須在限定的時間視窗內重新整理計數器 獨立看門狗功能描述 Note:(IWDG_KR)寫入0XCCCC,獨立看門狗就會啟動,計數器開始下降從復位值0XFFF。當計數器值到達0,會產生一個復位訊號(獨立看門狗復位)無論何時向關鍵字暫存器寫入0XAAAA,IWDG_RLR的數值會過載進計數器,避免看門狗復位 暫存器訪問保護 IWDG_PR 和 IWDG_RLR 暫存器具有寫訪問保護。若要修改暫存器,必須首先對 IWDG_KR暫存器寫入程式碼 0x5555。而寫入其他值則會破壞該序列,從而使暫存器訪問保護再次生效。這意味著重灌載操作(即寫入 0xAAAA)也會啟動防寫功能。狀態暫存器指示預分頻值和遞減計數器是否正在被更新 除錯模式 當微控制器進入除錯模式時( Cortex™-M3 核心停止), IWDG 計數器會根據 DBG 模組中的 DBG_IWDG_STOP 配置位選擇繼續正常工作或者停止工作。下圖是LSI在不同分頻情況下IWDG超時週期的最小值和最大值。 視窗看門狗功能描述 如果視窗看門狗啟動(WWDG_CR暫存器的WDGA位置1),7位向下計數器從0X40向0x3F滾動(T6已經清零),會導致一個復位。如果軟體過載計數器,當計數器值大於視窗所儲存的值時,就會產生復位 應用程式必須在正常操作期間寫WWDG_CR暫存器去組織MCU復位。這個操作必須發生在計數器值小於視窗暫存器值。視窗暫存器值儲存在WWDG_CR暫存器,必須在0XFF和0XC0之間。 Note:(看門狗中斷高階特性)如果在產生實際復位之前必須執行特定的安全操作或資料記錄,則可使用提前喚醒中斷(EWI)。通過設定 WWDG_CFR 暫存器中的 EWI 位使能 EWI 中斷。當遞減計數器的值為0x40 時,將生成 EWI 中斷。在復位器件之前,可以使用相應的中斷服務程式 (ISR) 來觸發特定操作(例如通訊或資料記錄)。在某些應用中,可以使用 EWI 中斷來管理軟體系統檢查和/或系統恢復/功能退化,而不會生成 WWDG 復位。在這種情況下,相應的中斷服務程式 (ISR) …

STM32 Watchdog Introduction Read More »

STM32 DMA Introduction On STM32WB

DMA的基本介紹 DMA,全名Direct Memory Access,即直接暫存器訪問。DMA傳輸將數據從一個地址空間複製到另一個地址空間,提供在外存器之間或者暫存器和暫存器之間的高速數據傳輸。無須CPU的介入,透過DMA數據可以快速地移動 DMA mapping 因WB系列是L4系列+Core-M0+因此這邊直接參考L4的Mappong圖表,且由圖表可以知道那些通道支援什麼類型資料存取 DMA事務 DMA傳輸事務包含一系列的给定數目的數據傳輸序列。傳輸的數目可以透過軟體設定,8位,16位或32位。每一次DMA傳輸包含3个操作 透過 DMA_SxPAR 或 DMA_SxM0AR 暫存器,外部數據暫存器或存儲器單元中加載數據。 透過 DMA_SxPAR 或 DMA_SxM0AR 暫存器,將加載的數據存儲到外部數據暫存器或存儲器內 DMA_SxNDTR 計數器在數據存儲结束後遞減,該計數器中包含仍需执行的事務數 DMA Function介紹 表格為F10X系列在WB系列可以參考Description of STM32WB HAL and low-layer drivers (P181 DMA Firmware driver API description)在部分function上有更動 DMA使用 1、查询方式查询方式可以不使能DMA中斷,透過DMA_GetFlagStatus函数判斷旗標位來辨别是否傳輸完成或過半以及出错,然後關閉DMA通道,用DMA_SetCurrDataCounter函数重設缓存大小,完成相應操作後清除旗標位再使能DAM通道。2、中斷方式DMA中斷一般用於定長數據傳輸,以傳輸完成中斷為例。(1)當產生DMA傳輸完成中斷後,清除中斷旗標位、傳輸完成旗標位;(2)關閉DMA通道;(3)處理數據(4)重新設定DMA通道的DMA缓存的大小(可以省去);(5)開啟DMA通道3、不定長度數據傳輸以串口為例,不定長度數據傳輸的時候,可以透過串口空閒中斷来判斷傳輸是否完成(傳輸缓存大小要大於傳輸的數據大小),數據長度可以透過DMA_GetCurrDataCounter函数来計算,然後關閉DMA通道,重設DMA缓存的大小,再開啟DMA通道。4、雙緩衝方式設定2個緩衝區,設定一個緩衝區flag(用來區分當前是處在哪個緩衝區),每完成一次傳輸就透過重新配置DMA_MemoryBaseAddr的緩衝區地址,下次傳輸數據就會保存到新的緩衝區中,可以透過自定暫存區flag来判斷和切換(。 參考 【STM32】 DMA原理,步骤超细详解,一文看懂DMA RM0473 Reference manual RM0434 Reference manual STM32 DMA详解 STM32 | DMA配置和使用如此简单(超详细) Description of STM32WB …

STM32 DMA Introduction On STM32WB Read More »

Shopping Cart