STM32 I/O

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:如果输出速度和配置速度不匹配,會明顯看到波形不正常這邊選用高低速差異如下 參考

GPIO Setting for Different Speed Read More »

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 »

Sleep Low Power Modes For STM32L4

前言 現在MCU都會被要求有節約省電,ST針對省電版本MCU推出L系列與最新的U5系列,此章節主要會介紹各個省電模式下的操作,與Sleep mode為例子會使用到的範例程式,配合客戶目前遇到問題,提點說明要點,與注意事項。(此章節也會介紹L4系列MCU) STM32L系列核心 這邊可以看到圖表L4的核心處理器已來到Core-M4能對應的運算效能也大大增加 Low-power modes summary 這邊會以L系列中常使用的L4為主作介紹,下表為L4在各狀態下哪些部分會進入休眠哪些是可以使用的(耗電流是可以達成的但控制條件與注意事項較為嚴苛) Low-power modes transitions STM32L4 Sleep mode實作 在看完上述介紹後,對於Low pow系列有比較深入認知,這邊我們來實作Low Pow Sleep mode模式 硬體注意事項 GPIO漏電問題 焊接問題 GPIO漏電問題 GPIO端口在STM32進入低功耗模式後有電荷流動。这是由於有壓差所造成的,因此在進入低功耗模式前先把各GPIO腳位拉到與外界水位相同我們可以看以下範例來協助了解 案例1:LCD模組連接MCU在進入STOP mode後功耗整板800多uA非1.6uA(代碼是相同的) 問題分析 摘除LCD模組後功耗下降至500uA 個模組都是以GPIO來控制開關 解法:GPIO在進入STOP mode前先把腳位全部拉到HIGH(LCD電為水平相同) 焊接問題 此問題其實也與GPIO問題原理雷同,主要是焊接接觸不良也會有漏電的現象 Coding撰寫 要能達到極為省電關閉部必要的Clock來源與GPIO腳位這2點是極為重要 主程式如下 參考 STM32L高性能低功耗实战设计 实验:低功耗系统设计–基于NUCLEO-L476RG SLEEP Mode in STM32F103 || CubeIDE || Low Power Mode || Current Consumption STM32超低功耗入门之低功耗运行模式

Sleep Low Power Modes For STM32L4 Read More »

Low Power PWM(Timer) API on STM32WB

前言 隨者低功號產品越來越要求,ST就推出Low power應用的MCU與相對應腳位,其中ST MCU中的L系列就是專屬的Low power的MCU,另外部分MCU也有低功耗腳位的MCU 例如F7、H7、G0、G4與WB系列,本章節會針對LPTIM這隻腳位去做詳細解說與用法切換震盪來源 LPTIM功能 LPTIM:Low-power timer,即低功耗定時器(16bit)LPTIM與一般TIM不同處主要是在除了待機模式下全部電源模式保持運行,而且沒有內部時鐘源也能運行下圖我們也可以看到L0與G0不相同,因此不同的系列LPTIM的設置會有不同需要再確認(其中WB系列與G0系列相同) 注意:CLKMUX選擇對應的是CFGR寄存器的bit0:CKSEL,用于控制内核clock選擇由内部時鐘源(APB或LSE、LSI和HSI等任何其他內部震盪器)提供。也可以選擇由外部clock源通過 LPTIM 外部 Input提供。 LPTIM特性 內部clock:LSE、 LSI、 HSI 或 APB LPTIM輸入的外部clock(在沒有LP震盪器情況可以使用脈衝計數器)其中LPTIM具有Glicth濾波器(如下圖) LPTIM_ClockConfigTypeDef定義 Source可以選擇如下 #define LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC  ((uint32_t)0x00U) #define LPTIM_CLOCKSOURCE_ULPTIM             LPTIM_CFGR_CKSEL 第一種表示LPTIM 使用內部clock(APB 或APB 或 LSE、LSI和HSI等)第二種表示LPTIM 由外部Clock通過 LPTIM 外部 Input1 提供Clock。 Timer底層配置(GPIO、Clock、中斷) HAL_LPTIM_Init就會调用HAL_LPTIM_MspInit PS:HAL_LPTIM_DeInit就會调用HAL_LPTIM_MspDeInit基本設置外還需要配置好GPIO、Clock、中斷才能完整使用,以下為配置LPTIM1使用PD13做PWM範例 小結流程 通過函数HAL_LPTIM_Init()做初始化 低功耗定時器的底層配置是通過函数HAL_LPTIM_MspInit()實現 選擇低功耗定時器支持的6種工作模式 PWM模式:使用HAL_LPTIM_PWM_Start()或 HAL_LPTIM_PWM_Start_IT() 單脈衝模式:在此模式下,當滿足條件時,輸出出可以切換高低電壓,使用HAL_LPTIM_SetOnce_Start()或 HAL_LPTIM_SetOnce_Start_IT() Encoder模式:HAL_LPTIM_Encoder_Start()或HAL_LPTIM_Encoder_Start_IT()!!注意非每個LPTIM都支持此模式!! 超時模式:HAL_LPTIM_TimeOut_Start()或 HAL_LPTIM_TimeOut_Start_IT() 計數模式:HAL_LPTIM_Counter_Start()或  HAL_LPTIM_Counter_Start_IT() 停止任何模式:用户可以通過调用相應的API來停止任何模式: HAL_LPTIM_Xxx_Stop

Low Power PWM(Timer) API on STM32WB Read More »

ADC introduction on STM32

前言 ADC簡單說就是類比訊號轉出城數位訊號,下面有幾個基本名詞介紹 解析度:讀出的資料的長度,如8位就是最大值為255的意思,即範圍[0,255],12位就是最大值為4096,即範圍[0,4096] 通道:ADC輸入引腳,通常一個ADC控制器控制多個通道,如果需要多通道的話,就得進行每個通道掃描了 ADC的轉換方式 單次轉換,一次只轉換一個通道 連續轉換,轉換完成一個通道後立即自動執行下一個通道的轉換 掃描模式,開啟一次後,自動的連續讀取多個通道 ADC的三種工作方式 阻塞模式(查詢模式) 中斷模式 DMA模式 PS:這邊有幾點要注意ADC晶片通常有正參考電壓和負參考電壓,通常正參考電壓連線到VCC,負參考電壓連線到GND cubemx基礎配置 PS:Single-ended和Differentialt差異在於比較准位的不同 範例程式 基本上ADC的使用並不困難比照範例即可實現參考詳細篇友介紹其他高階用法,歡迎參考。一般類比的產品在控制上已經比較少見,主要在LED上可能比較常使用 參考 STM32CubeMX学习笔记(8)——ADC接口使用 STM32 ADC詳細篇(基於HAL庫)

ADC introduction on STM32 Read More »

Shopping Cart