通過TIM+DMA Burst 實現STM32輸出變頻且不同脈沖數量的PWM波形

Burst介紹:

DMA控制器可以生成單次傳輸或增量突發傳輸,傳輸的節拍數為4、8或16。

為了確保數據一致性,構成突發傳輸的每組傳輸都是不可分割的:AHB傳輸被鎖定,AHB總線矩陣的仲裁器在突發傳輸序列期間不會撤銷DMA主設備的授權。

作用:

可以通過Burst進行多個寄存器的同時修改,在M2P時同時配置多個定時器。

burst會占用總線直到數據發完為止,此期間CPU打斷不了,但是不連續的節拍之間CPU依然可以打斷

問題剖析:

需要STM32輸出變頻且不同脈沖數量的PWM波形,具體要求如下:

交替輸出兩組參數:

參數組1:頻率較高(ARR=1000),輸出3個脈沖(RCR=2)。

參數組2:頻率較低(ARR=5000),輸出2個脈沖(RCR=1)。

實現方式:通過DMA Burst功能,在一次定時器事件中批量修改多個寄存器(ARR、RCR、CCR),無需CPU干預。

STM32的TIM模塊支持DMA Burst功能,允許通過單次定時器事件觸發多次DMA傳輸,從而批量更新多個寄存器。其核心硬件模塊如下:

(1) 關鍵寄存器

TIMx_DCR(DMA控制寄存器):

DBSS (DMA Burst Source Selection):選擇觸發DMA Burst的事件源(如定時器更新事件)。

DBL (DMA Burst Length):設置一次DMA Burst傳輸的數據個數(例如3次傳輸,對應修改ARR、RCR、CCR)。

DBA (DMA Burst Address):設置DMA傳輸的起始寄存器地址偏移(例如ARR寄存器的地址偏移為0x2C)。

TIMx_DMAR(DMA地址寄存器):

DMA通過訪問此寄存器,將數據寫入目標寄存器(如ARR、RCR、CCR)。

(2) 工作原理

觸發事件:定時器產生指定事件(如更新事件TIM_UPDATE)。

DMA請求:事件觸發DMA Burst傳輸,DMA控制器根據TIMx_DCR配置的傳輸次數(DBL)和起始地址(DBA),將內存中的數據連續寫入多個寄存器。

自動更新參數:寄存器值被修改后,定時器立即使用新參數生成PWM波形。

理解關鍵參數:

Burst Size與傳輸次數的關系

在STM32的DMA Burst模式中,Burst Size 表示 單次突發傳輸(Burst)中連續傳輸的數據單元個數,而 傳輸總次數 由以下兩個參數共同決定:

Burst Size(突發傳輸單元數):例如設置為4,表示一次突發傳輸4個數據單元。

Data Width(數據寬度):每個數據單元的大小(字節、半字或字)。

NDTR(Number of Data):DMA傳輸的總數據單元數(需在代碼中動態設置)。

公式:

總傳輸次數 = NDTR / Burst Size

例如:若NDTR=12,Burst Size=4,則總傳輸次數為3次(每次突發傳輸4個單元)。

這里我們讓DMA Burst輸出一次,一次傳四個數據單元的值(實際上只用三個,但是mx中只可以配4increment,第四個數據傳0即可),輸出的脈沖個數通過傳入的四個單元值中RCR 的值決定;

PWM參數定義

ARR (Auto-Reload Register):決定PWM頻率。

頻率公式:PWM頻率 = 定時器時鐘 / (ARR + 1)

示例:

pulse1[0] = 1000 → 頻率 = 100MHz / 1001 ≈ 99.9 kHz

pulse2[0] = 5000 → 頻率 = 100MHz / 5001 ≈ 20 kHz

RCR (Repetition Counter Register):控制脈沖個數。

脈沖個數公式:脈沖數 = RCR + 1

示例:

pulse1[1] = 2 → 輸出3個脈沖

pulse2[1] = 1 → 輸出2個脈沖

CCR (Capture/Compare Register):決定占空比。

占空比公式:占空比 = CCR / (ARR + 1)

示例:

pulse1[2] = 500 → 占空比 ≈ 50%

pulse2[2] = 2500 → 占空比 ≈ 50%

參數結構:

uint32_t pulse1[3] = {1000, 2, 500};  // ARR=1000, RCR=2, CCR=500
uint32_t pulse2[3] = {5000, 1, 2500}; // ARR=5000, RCR=1, CCR=2500

CubeMX設置:

在CubeMX中配置Burst Size

打開DMA Settings標簽頁,選擇對應的DMA通道。

設置 Burst Size 為 4 Increment(根據需求選擇1/4/8/16)。

設置 Data Width 為 Word(32位,與TIM寄存器位寬一致)。

勾選 Increment Address(內存地址遞增)。

選擇 Mode 為 Normal 或 Circular。(若需持續傳輸,選擇Circular模式并且設置足夠大的NDTR)

每次DMA Burst需傳輸3個寄存器值(ARR、RCR、CCR)。

每個寄存器為32位(4字節),共需傳輸12字節。

Burst Size = 4 Increment(每次傳輸4個數據單元,但實際僅用3個,最后一個填充0)。

Data Width = Word(32位)。

NDTR = 3(傳輸3個數據單元)。

HAL_DMA_Start_IT()函數原型:

HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)

?代碼實現:

uint32_t pulse_data[4] = {1000, 2, 500, 0}; // 第4個數據填充0
HAL_DMA_Start_IT(&hdma_tim1, (uint32_t)pulse_data, (uint32_t)&TIM1->DMAR, 3);// NDTR=3

交替輸出的實現

(1) 中斷切換模式

第一次傳輸:DMA傳輸pulse1到TIM寄存器。

傳輸完成中斷:在中斷回調函數中重新配置DMA,傳輸pulse2。

循環觸發:重復上述過程,實現交替輸出。

(2) 雙緩沖模式

配置雙緩沖:使能DMA雙緩沖,設置兩組內存地址(pulse1和pulse2)。

自動切換:DMA傳輸完當前緩沖區后,自動切換到下一組參數,無需CPU干預。

關鍵代碼片段(基于HAL庫)

// 1. DMA傳輸完成中斷回調函數
void HAL_TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma) {// 切換參數組static uint8_t is_pulse1 = 0;if (is_pulse1) {HAL_DMA_Start_IT(&hdma_tim1, (uint32_t)pulse1, (uint32_t)&TIM1->DMAR, 3);} else {HAL_DMA_Start_IT(&hdma_tim1, (uint32_t)pulse2, (uint32_t)&TIM1->DMAR, 3);}is_pulse1 = !is_pulse1;
}// 2. 主函數初始化
int main(void) {// 初始化定時器和DMAHAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);HAL_DMA_Start_IT(&hdma_tim1, (uint32_t)pulse1, (uint32_t)&TIM1->DMAR, 3);while (1) {// 其他任務}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/74042.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/74042.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/74042.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙學習手冊(HarmonyOSNext_API16)_數據持久化③:關系型數據庫

概述 關系型數據庫:像“Excel表格聯合作戰”的管家 關系型數據庫就像一個超級智能的表格管理系統,專門處理數據之間有復雜關聯的情況。比如學生和成績、訂單和商品、用戶和評論——這些數據像蜘蛛網一樣相互連接,用鍵值數據庫的“獨立抽屜”…

Windows 11 VS Code C/C++ 開發環境搭建——一種盡量“綠色”的方法

我的電腦是Windows 11 系統,安裝了Visual Studio Code,在上面搭建C/C開發環境,當然,這需要用到MinGW之流了。作為一個綠色愛好者(帽子除外),我也盡量綠色地架設這樣一個環境…… 第一步&#x…

mysql-分區和性能

mysql自身只支持表的橫向分區。 常聽到開發人員說“”對表做個分區“,然后數據的查詢就會快了。這是真的嗎?實際上可能跟根本感覺不到查詢速度的提升,甚至會發現查詢速度急劇下降。因此,在合理使用分區之前,必須了解分…

DeepSeek協助優化-GTX750Ti文物顯卡0.65秒卷完400MB float 音頻512階時域FIR

文章目錄 1. 學習目的2. 階段成果2.1 NVVP 性能探查2.2 測試編譯環境2.3 測試樣例 3 學習過程3.1 提問DeepSeek3.2 最終代碼 4. 體會 1. 學習目的 最近在學習cuda,準備給我的taskBus SDR添加CUDA的模塊支持,以便可以用PC機壓榨山寨 B210那56M的帶寬。 因…

RabbitMQ高級特性--TTL和死信隊列

目錄 1.TTL 1.1設置消息的TTL 1.1.1配置交換機&隊列 1.1.2發送消息 1.1.3運行程序觀察結果 1.2設置隊列的TTL 1.2.1配置隊列和交換機的綁定關系 1.2.2發送消息 1.2.3運行程序觀察結果 1.3兩者區別 2.死信隊列 2.1 聲名隊列和交換機 2.2正常隊列綁定死信交換機 …

【JavaEE】UDP數據報套接字編程

目錄 網絡編程基礎 基本概念 發送端和接收端 請求和響應 客戶端和服務端 常見的客戶端服務端模型 Socket套接字 TCP/UDP特點 Java數據報套接字通信模型(UDP通信) UDP數據報套接字編程 DatagramSocket 1.類定義 2.構造方法 3.核心方法 4.特性說明 DatagramPacke…

Spring Boot 3.4.3 基于 SpringDoc 2 和 Swagger 3 實現項目接口文檔管理

在現代企業級應用開發中,前后端分離已成為主流模式,前端負責界面呈現,后端專注提供 RESTful API 接口。然而,接口文檔的編寫和維護往往是開發過程中的痛點。Spring Boot 3.4.3 結合 SpringDoc 2 和 Swagger 3,為開發者…

構建大語言模型應用:數據準備(第二部分)

本專欄通過檢索增強生成(RAG)應用的視角來學習大語言模型(LLM)。 本系列文章 簡介數據準備(本文)句子轉換器向量數據庫搜索與檢索大語言模型開源檢索增強生成評估大語言模型服務高級檢索增強生成 RAG 如上…

Linux 隨機數據生成

目錄 一. /dev/urandom1.1 dd 命令1.2 head命令1.3 隨機字母 二. openssl 命令三. yes命令 一. /dev/urandom ?/dev/urandom 是 Linux 和 Unix 系統中的一個特殊文件,它是一個偽隨機數生成器,用于提供高吞吐量的隨機數據。 1.1 dd 命令 bs1M count10…

項目如何安裝本地tgz包并配置局部registry

一、判斷包來源是否正確 1. 檢查url curl <registry_url>2. 查看包是否存在 npm view <package_name> --registry<registry_url>二、局部registry配置步驟&#xff1a; 1. 全局配置 如果你希望對所有項目生效&#xff0c;可以將這行配置添加到全局.npmr…

QCustomPlot入門

QCustomPlot 是一個基于 Qt 的 C++ 繪圖庫,專注于高效、美觀的 2D 數據可視化。進入QCustomPlot下載頁,下載最新的完整包(包含:源碼、文檔、示例)。 一、核心架構設計 1. 分層架構模型 層級主要組件職責說明用戶接口層QCustomPlot 類提供頂層API,管理所有子組件邏輯控制…

C語言快速入門-C語言基礎知識

這個c語言入門&#xff0c;目標人群是有代碼基礎的&#xff0c;例如你之前學過javaSE&#xff0c;看此文章可能是更有幫助&#xff0c;會讓你快速掌握他們之間的差異&#xff0c;文章內容大部分都是泛談&#xff0c;詳細的部分我會在之后時間發布&#xff0c;我也在慢慢學習&am…

【商城實戰(91)】安全審計與日志管理:為電商平臺筑牢安全防線

【商城實戰】專欄重磅來襲!這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建,運用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用戶、商品、訂單等核心模塊開發,再到性能優化、安全加固、多端適配,乃至運營推廣策略,102 章內容層層遞進。無論是想…

信息安全工程師第 1 章

《信息安全工程師教程(第2版)》第一章 一、網絡信息安全基本概念與重要性 網絡信息安全定義 狹義:保障信息系統的機密性(C)、完整性(I)、可用性(A)——CIA三性。廣義:涵蓋國家安全、經濟安全、社會安全等的“大安全”。法律依據:《網絡安全法》定義網絡安全為防范攻…

為什么視頻文件需要壓縮?怎樣壓縮視頻體積即小又清晰?

在日常生活中&#xff0c;無論是為了節省存儲空間、便于分享還是提升上傳速度&#xff0c;我們常常會遇到需要壓縮視頻的情況。本文將介紹為什么視頻需要壓縮&#xff0c;壓縮視頻的好處與壞處&#xff0c;并教你如何使用簡鹿視頻格式轉換器輕松完成MP4視頻文件的壓縮。 為什么…

網絡空間安全(45)PHP入門學習

一、PHP文件與結構 PHP文件擴展名&#xff1a;PHP文件通常以.php作為擴展名&#xff0c;例如index.php。 PHP代碼嵌入&#xff1a;PHP代碼可以嵌入到HTML文件中&#xff0c;通常使用<?php ... ?>標簽包圍PHP代碼。短標簽<? ... ?>在某些配置下也可以使用&…

深入 OpenPDF:高級 PDF 生成與操作技巧

1 引言 1.1 項目背景 在許多企業級應用中,生成和操作 PDF 文檔是一個常見的需求。PDF(Portable Document Format)因其格式統一、易于打印和分發而被廣泛使用。本文將介紹如何使用 OpenPDF 庫在 Java 項目中生成和操作 PDF 文檔。 1.2 技術選型理由 OpenPDF:OpenPDF 是一…

力扣hot100——最長連續序列(哈希unordered_set)

題目鏈接&#xff1a;最長連續序列 1、錯解&#xff1a;數組做哈希表&#xff08;內存超出限制&#xff09; int longestConsecutive(vector<int>& nums) {vector<bool> hash(20000000010, false);for(int i0; i<nums.size();i){hash[1000000000nums[i]]t…

Qt中信號帶參傳值

在我們的Qt信號中是可以進行參數的傳遞的&#xff0c;不過格式上與寫普通函數不同。 這是頭文件中定義一個含參信號和一個含參槽函數 我們再來看它們兩個的綁定 。第一行的clicked()和on_btn_clicked()就是普通無參信號和槽的綁定&#xff1b;第二行就是上圖中兩個帶參信號和槽…

CSS3學習教程,從入門到精通, CSS3 列表控制詳解語法知識點及案例代碼(24)

CSS3 列表控制詳解 CSS 列表控制的語法知識點及案例代碼的詳細說明&#xff0c;包括 list-style-type、list-style-image、list-style-position 和 list-style 的用法。 1. list-style-type 屬性 list-style-type 屬性用于設置列表項標記的類型。 語法 list-style-type: v…