別問什么高級不高級了,輸出個波形而已,沒有啥難的。只是給出了一些細節,比如你想輸出自己定制的一些波形,該怎么辦?
這里就是使用了TIM1
可以在各種情況下輸出中斷
在NVIC里面可以看到
里面包含的寄存器就是這幾個
可以按照72MHz來設置
STM32定時器之ARR,PSC倆兄弟,具體的可以看我以前的文章。
關于定時器的函數,開啟定時器需要自己寫
TIM1是掛在APB2上面
在中斷的文件里面最后顯示up這個中斷
update
表面是UP,但其實要送下下個函數里面看看到底是誰的中斷
這個函數的具體作用是判斷中斷是否正常,然后判斷產生的是哪一類定時器中斷(溢出中斷/PWM中斷.....),然后進入相應的中斷回調函數
長這樣
找到觸發的中斷,然后就是觸發回調函數
就是我搞黃了這個
弱定義的回調,要在這里自己去寫邏輯
注意要打開定時器讓其工作,假如是中斷打開要開IT的函數
這個可以重載定時器的值
顯示的__HAL_TIM_SET_AUTORELOAD宏定義是一個常見的用于設置STM32時鐘自動重載寄存器(ARR)的宏。它可以同時更新TIM_HandleTypeDef結構體中的Init.Period字段。
這個宏用于動態更改時鐘周期。如果想在中斷后更改時鐘周期為10ms,可以使用:
__HAL_TIM_SET_AUTORELOAD(&htim1, 100); // 設置下一個周期為10ms
修改的是定時器結構體里面的數據
原理就是你知道1s數一下,你就知道數10下就到時間了,也就是10次中斷,知道了數10s后,做些什么。。當定時器到達預設的周期,它將觸發一個中斷,然后你在中斷服務程序里面切換GPIO的狀態。
在運行時改變定時器的ARR(Auto-Reload Register)值在STM32(以及其他許多微控制器)中是一種常見的做法,用于動態地改變定時器周期或者波形的參數。 這樣做的幾個主要用途和意義如下: 動態波形調整:可以在運行時改變PWM或者其他類型波形的頻率或者占空比。 任務調度:如果使用定時器進行某種形式的多任務調度或者時間切片,動態地改變ARR值可以使你更靈活地控制任務的執行。 事件觸發:通過改變ARR值,可以在特定的時刻或者在某個事件發生后觸發定時器中斷。 精確計時:在需要非常精確控制時間的應用場合(例如,高精度測量或者通信協議),動態地改變ARR值可以在運行時微調定時器行為。 節能:在一些低功耗應用中,可以通過動態調整ARR值來改變微控制器的工作周期,以此來降低功耗。 模式切換:在復雜的系統中,你可能需要定時器在不同的操作模式之間切換。動態地改變ARR值使得這種切換成為可能。 應對不確定性:在某些場合,事先可能不知道定時器需要運行多長時間。動態地設置ARR值允許程序在運行時根據實際需要來配置定時器。 波形由多個高低電平組成,每個電平的持續時間都是通過ARR值來設置的。 這里主要是定時器周期的動態改變。
對定時器周期公式的理解:
T=(arr+1)*(PSC+1)/Tck 其中TCK為時鐘頻率,PSC為時鐘預分頻系數,arr為自動重裝載值。
f=Tck/(psc+1)*(arr+1)
Tck/(psc+1)即為時鐘頻率,1/f為機器周期,乘以(arr+1)即可得出定時器周期。
也就是說這個周期,就是你定的時間,到了什么時間干什么事情的時間。設置好以后,下一次中斷是什么時候,是某某時間,也就是你中斷出場的時候。
if (htim->Instance == TIM1): 這個檢查用于確定哪個定時器觸發了這個回調。因為你可能有多個定時器在你的程序中,這個檢查確保只有TIM1的事件會執行下面的代碼。
這個時候寫一下代碼,可以把要生成的東西設置一個全局的變量,一開始為0,開始運行,比如你現在是高電平,接著你就要設置下次的觸發時間,此時是高電平,下次是什么時候?自己數吧
其實此時對于使用定時器生成波形來講,那就OK了,在while里面都沒有東西。
while (1) { if (some_condition) { // 執行某些動作 } }
檢查變量干什么事情
while (1) { // 低優先級任務 }
緊急的在回調,剩下的就在這里了
一般我們都是生成方波為主,來看看方波的優點。
簡單性和易于生成
方波是最簡單、最易于生成和分析的波形之一。只需要一個簡單的數字邏輯電路即可生成方波。
時間域和頻率域的特性
方波包含了多個奇次諧波,這一點在頻譜分析和信號處理中可能是有用的。
適用于數字和邏輯應用
方波是數字電子學和邏輯電路的基礎,用于表示二進制信息(0和1)。
高能量效率
由于方波在其周期內只有兩個狀態(通常是高和低),因此它能更有效地傳輸能量。
易于檢測和觸發
方波的尖銳邊緣使得它很容易被用作觸發信號,在定時和同步應用中很有用。
易于調制和解調
方波通常更容易用于某些類型的數字調制方案,如頻率偏移鍵控(FSK)和相位偏移鍵控(PSK)。
適用于脈沖寬度調制(PWM)
方波是PWM(脈沖寬度調制)的基礎,這是一種常用于控制電機、LED亮度和其他應用的技術。
高信噪比
在某些應用中,例如數字通信,方波由于其決定性的高和低狀態通常有更高的信噪比。
那我們就來把這個生成的代碼框架完善一下。
使用一個簡單的狀態機邏輯,以及一個數組來保存波形的各個部分(高電平/低電平以及持續時間)。
可以考慮設計成這樣,我們感興趣是就是高低電平和相應的時間長度
使用 #define WAVEFORM_SEGMENTS (sizeof(custom_waveform) / sizeof(WaveformSegment)) 是一種方便的方式來計算波形分段數組的元素數量。
在這種情況下,custom_waveform 應該是一個 WaveformSegment 類型的數組。這種方法的優點是它在編譯時完成計算,不需要運行時計算。
在這里,waveform_enabled 是一個標志,用于確定是否應該生成波形。這個標志可能會在其他代碼段,比如一個按鍵中斷服務例程中被設置。 current_segment 是一個靜態局部變量,用于跟蹤當前波形的哪一部分(或“段”)正在生成。每當這個回調函數被觸發時,它會: 檢查 waveform_enabled 是否被設置以及是否使用了正確的定時器實例。 如果是,則進一步檢查 current_segment 是否小于波形分段數組的長度(由 WAVEFORM_SEGMENTS 定義)。 如果也是,則根據 custom_waveform[current_segment] 的內容設置GPIO的電平并更新定時器的自動重載值。 這種方式是非常靈活和可擴展的。可以很容易地更改 custom_waveform 數組來生成不同的波形,或者動態地更改它來適應不同的應用場景。 由于使用了靜態局部變量 current_segment,這個函數在多線程環境下可能不是線程安全的。如果在其他地方也訪問或修改了這些變量,可能需要添加額外的同步機制。 此外,如果波形生成結束后需要執行其他操作(如通知其他任務或更改硬件狀態),則可以在代碼的相應部分添加這些操作。在這里,一旦波形生成結束,waveform_enabled 被設置為0,以停止波形的進一步生成,直到下一次明確的觸發。
開啟輸出
然后這樣使用
對于一個大的程序框架來說,它還是不夠優雅,讓我來繼續的注入能量、
首先寫一個頭文件
這段代碼定義了一些靜態變量,這些變量在整個C文件(或作用域)內都是可用的,但不能在其他C文件中訪問。這些變量通常用于在不同的函數之間共享狀態或數據。 htim_instance: 用于存儲與波形生成相關聯的TIM_HandleTypeDef結構的指針。 GPIOx_instance: 用于存儲與波形生成相關聯的GPIO端口的指針。 GPIO_Pin_instance: 用于存儲與波形生成相關聯的GPIO端口的引腳號。 current_pattern: 一個指向波形段(WaveformSegment)數組的指針,用于表示當前的波形模式。 pattern_size: 用于存儲當前波形模式(即current_pattern數組)的大小。 current_segment: 一個用于跟蹤當前波形段的索引的變量。 waveform_enabled: 一個標志,用于指示是否應該生成波形。 這些變量主要用于在回調函數(如HAL_TIM_PeriodElapsedCallback)和可能的其他設置或控制函數之間共享狀態。
可以這樣使用,然后,在HAL_TIM_PeriodElapsedCallback中,你就可以使用這些變量來實現波形的生成,而不需要硬編碼或傳遞大量參數。
回調是最終的執行家,跑不了的
別的一些函數
使用的時候就生成一個波形的參數包
然后開啟和關閉就好了
我后面會寫個庫,扔Github上面。
審核編輯:湯梓紅
-
單片機
+關注
關注
6039文章
44583瀏覽量
636530 -
寄存器
+關注
關注
31文章
5357瀏覽量
120697 -
STM32
+關注
關注
2270文章
10910瀏覽量
356623 -
定時器
+關注
關注
23文章
3251瀏覽量
115025 -
波形
+關注
關注
3文章
379瀏覽量
31596
原文標題:使用STM32任意定時器生成動態波形
文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論