在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32定時器BURST傳輸介紹及示例

茶話MCU ? 來源:ST MCU 信息交流 ? 2020-05-14 09:15 ? 次閱讀

STM32定時器應用中,我們有時希望基于某定時器事件同時對定時器的多個寄存器進行讀寫訪問。為此,STM32芯片設計了專門應對定時器的多寄存器訪問應用的DMA Burst傳輸。

高級定時器和部分通用定時器都支持針對定時器寄存器訪問的BURST傳輸。所謂定時器的BURST傳輸,就是指當產生某定時器事件時,可以產生多個DMA請求,并觸發多次DMA傳輸,訪問多個定時器寄存器實現從內存到寄存器或從寄存器到內存的數據傳輸。這里的定時器事件可以是更新事件、比較匹配事件、換相事件以及觸發事件。

我們知道,各定時器的所有寄存器都存放在片內某一固定地址開始的連續空間內。下圖是我從STM32G4系列定時器地址分布圖中截取的一部分,不同的定時器所擁有的寄存器個數可能有差異,但每個定時器的寄存器地址映射表的第一個寄存器一定是TIMx_CR1,所有寄存器在內存空間以字對齊的方式按順序依次存放。【后面都以TIM2為例來說】

顯然,我們在做定時器的DMA BURST傳輸時,除了配置基本的源地址、目的地址等DMA傳輸所需的通用配置信息外,還得告知DMA BURST傳輸模塊每次傳輸時從哪個寄存器開始,連續訪問幾個寄存器,比方訪問上圖中圈出來的從TIMx_CCR1開始的連續4個寄存器。

這里有兩個專門用于定時器BURST傳輸的寄存器,分別是TIM2_DCR和TIM2_DMAR. 其中TIM2_DCR就是用來配置從哪個定時器寄存器開始訪問、連續訪問幾個寄存器的問題。【下面截圖來自STM32G4參考手冊】

DBA:被訪問的第一個定時器寄存器相對于定時器地址映射表中的TIMx_CR1的地址偏移量【偏移量從0開始計算】。

DBL:每組BURST訪問的寄存器個數【從0開始計算】。

仍然按照上面所說,訪問從TIM2_CCR1開始的連續4個寄存器,可得知TIM2_CCR1位于寄存器地址映射表中的第14號位置,則DBA= 14-1;用于BURST分組訪問的寄存器個數為4個,則DBL=4-1。

另外一個寄存器就是TIM2_DMAR。那它是干什么的呢?上面TIM2_DCR寄存器只是配置了被訪問的首個定時器寄存器地址相對于TIMx_CR1的地址偏移量和每組要訪問的寄存器個數。其中地址偏移量還只是個相對數,DMA訪問最終是需要絕對地址的,而TIM2_DMAR就是來解決DMA訪問時所需的絕對地址的。

DMA訪問DMAR寄存器時,按照如下算式得到絕對地址實現對寄存器的逐個訪問。(TIM2_CR1address) + (DBA + DMA index)x 4

[Index是DMA Burst訪問時硬件自動生成的動態索引號,按0~DBL依次實現對多個寄存器的連續訪問而完成BUSRT傳輸】

也就是說,對于定時器DMA BURST傳輸,外設地址一定是TIM2_DMAR寄存器的地址【或許是源地址,或許是目的地址】,DMA通過訪問它,并根據上面算式實現對實際寄存器的訪問。所以TIM2_DMAR寄存器又可稱之為專門用于定時器DMA Burst傳輸的虛擬寄存器。

總的來講,我們在做基于定時器的DMA BURST傳輸時,除了使用正確的DMAR寄存器地址作為外設地址外,再就是配置好DCR寄存器中的DBA與DBL參數,弄清從哪個寄存器開始訪問,訪問幾個寄存器。其它配置環節跟通用DMA傳輸配置一樣。

下面用個例子來演示相關用法。后面的驗證基于STM32G474 Nucleo板。使用TIM2輸出4路PWM,根據更新事件同步變化占空比,實現PWM占空比呈規律性的寬窄變化。即每次發生更新事件時,DMA到內存區取走4個對應于4個通道的比較寄存器的值賦給對應的比較寄存器[CCR1/CCR2/CCR3,CCR4],如下圖所示,多組數據傳輸完畢后循環重來。

下面使用STM32CubeMx工具進行基本的初始化配置。

配置TIM2_CH1/CH2/CH3/CH4的PWM輸出:

對定時器時基單元進行配置:

對TIM2更新事件的DMA傳輸做基本配置:

這里配置為循環模式,具體應用時可以根據具有應用來選擇模式。將其它時鐘、GPIO配置完畢后即可生成初始化工程文件。

在工程里添加用戶應用代碼。關于定時器BURST傳輸有專門的庫函數可以給我們直接調用。它們分別是:

HAL_TIM_DMABurst_WriteStart() ----(1)

HAL_TIM_DMABurst_ReadStart() ----(2)

第一個函數用于將內存數據以DMA 分組模式寫入寄存器的功能函數;

第二個用于將多個寄存器內容以DMA 分組模式讀取到內存的功能函數;

不過呢,如果我們簡單套用這兩個函數有些時候可能出問題,或者遇到障礙。我們不妨一起來看看。

顯然,我們要用到第一個函數。當我們進一步打開該函數時,發現它只是再調用了另外一個函數。

即它調用了HAL_TIM_DMABurst_MultiWriteStart()函數。這里就該函數用到的幾個變量一起看下。

htim:即指向定時器結構體的地址,就不多說了。

BurstBaseAddress:前面提到過的第一個被訪問寄存器的地址偏移量,即給到DCR寄存器中DBA的值。這里第一個被訪問的是TIM2_CCR1,所在地址偏移量為13.

BurstRequestSrc:即觸發DMA Burst傳輸的定時器事件源。這里是更新事件。

BurstBuffer:這個是存放數據的內存起始地址,如用戶定義的數組地址。

BurstLength:就是前面提到的對應于DCR寄存器中DBL的值,即每組Burst傳輸的數據個數。具體到這里DBL應該是4-1,即3.

上面是固件里對該變量的定義。數據為什么這樣定義,整整往左移了8位。看看上面DCR寄存器中DBL段所處位置就明白了。

最后看看緊隨其后的另外一個數據量 ((BurstLength) >> 8U) + 1U;結合前面BurstLength的數據,該計算結果就是給到DMA的傳輸數據個數,數值等于每組 Burst傳輸的數據個數。具體到這里就是4。換言之,若我們將每組Burst傳輸的數據個數設為6,則這里的值就是6。這就意味著,如果按照該函數的現有用法,無論發生多少次Busrt傳輸只能用到一組數據。如果我希望在Burst傳輸中使用到多組不同數據【可能部分不同或全部不同】,就像上面示例所期望的那樣,那怎么辦呢?

這時我們可以基于現有庫函數,在BURST傳輸需要用到多組不同數據時,直接使用

HAL_TIM_DMABurst_MultiWriteStart()函數并將其最后一個表示DMA傳輸長度的那個變量做適當修改。

比方在應用中每組BURST傳輸m個數據,一輪DMA傳輸過程中對應n個觸發事件,在不同的觸發時刻,每組傳輸的數據內容并不全部相同,這時總的DMA傳輸數據個數就是m*n。具體到這里,我要用到11組不同的數據,每組傳輸4個數據,即一輪DMA傳輸用到4*11個數據。

好,到此基本介紹和分析都差不多了,再看看具體用戶代碼。代碼很簡單,基于STM32HAL庫的。

下面是用來調整不同時刻各個通道PWM占空比的內存數據,共11組。

要添加的用戶參考代碼都在下面,幾行代碼,應該說明白如畫。主要是那個關于定時器DMA分組傳輸的那個函數,上面也已經詳細解釋了。

最后看看運行后的演示結果。

示波器只接了2個通通,目的就是演示同時修改4個通道的占空比,實現pwm占空比由窄到寬的規律性變化。

到此,關于定時器DMA Burst傳輸的介紹及示例就聊到這里。稍事小結:

1、從定時器DMA Burst傳輸原理的理解上講,稍顯小復雜。需要我們對定時器相關原理和DMA基礎知識有較好的了解。在閱讀STM32參考手冊相關章節時,除了看正文部分外,還需細看TIMx_DMAR和TIMx_DCR寄存器的描述。但從實現代碼角度看,使用CubeMx和固件庫,其功能代碼還是很簡單的,將相關變量值對應地填進去即可。

2、STM32固件庫的有些例程或函數側重點在演示相應的功能或特性,但它不能包羅萬象或保證適用于任何場景。有時我們可以在基于現有函數的前提下適當地做些改寫調整,甚至完全重寫代碼以滿足實際需求。

3、在做定時器DMA Burst傳輸時,用來被成組訪問的定時器寄存器應該是同一定時器的而且是地址連續的寄存器,不可跳躍訪問。

4、上面的示例只是個示范,旨在了解該功能的用法和基本特性。實際應用中,往往還要涉及更多細節,比方各個定時器事件的特性、寄存器的預裝功能的開或關、DMA相關知識等,最終結合實際需求加以靈活運用。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5427

    瀏覽量

    123728
  • STM32
    +關注

    關注

    2291

    文章

    11019

    瀏覽量

    363038
  • 定時器
    +關注

    關注

    23

    文章

    3297

    瀏覽量

    117461

原文標題:STM32定時器BURST傳輸介紹及示例

文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    第二十章 TIM——基本定時器

    本章介紹了W55H32基本定時器TIM6、TIM7,16位向上計數,含時鐘源、預分頻等,講解定時計算及初始化結構體。
    的頭像 發表于 06-20 13:51 ?160次閱讀
    第二十章 TIM——基本<b class='flag-5'>定時器</b>

    第十二章 SysTick——系統定時器

    本章介紹了W55MH32的SysTick系統定時器,它是24位遞減計數,含4個寄存,可配置定時、中斷,用于產生時基 等。
    的頭像 發表于 05-22 17:16 ?361次閱讀
    第十二章 SysTick——系統<b class='flag-5'>定時器</b>

    MCU定時器/計數

    RISC-V核低功耗MCU通過靈活的定時器架構、低功耗模式適配及硬件級中斷優化,在工業控制、智能家居等場景中實現高精度計時與能耗控制的協同設計,滿足復雜任務調度與實時響應的雙重需求?。 一、?硬件
    的頭像 發表于 04-27 13:54 ?213次閱讀

    STM32Cube配置RTOS時定時器如何選擇?

    STM32Cube配置RTOS時定時器如何選擇
    發表于 03-07 08:47

    定時器已安排!開發小白看過來~

    本文將為您詳細介紹Air201定時器的基本操作與設置,確保您輕松上手,包教包會! 在Air201模組搭載的LuatOS系統中,定時器(timer)是一項基礎且關鍵的服務。 它允許開發者在特定的時間點
    的頭像 發表于 12-31 14:30 ?408次閱讀
    <b class='flag-5'>定時器</b>已安排!開發小白看過來~

    定時器自動控制開關怎么設置

    定時器自動控制開關是一種常見的自動化設備,廣泛應用于家庭、工業、農業等多個領域。通過定時器,用戶可以預設時間,讓設備在特定時間自動開啟或關閉,從而實現節能、提高效率和便利性。 一、定時器
    的頭像 發表于 09-19 16:19 ?3740次閱讀

    定時器的基本組成和工作模式

    定時器是計算機或電子設備中常見的一個硬件或軟件組件,其主要功能是測量和控制時間的流逝。它在各種應用中起著至關重要的作用,如操作系統調度、多媒體播放、網絡通信、工業自動化控制以及家電設備的定時功能等。定時器的工作原理基于時序控制,
    的頭像 發表于 08-19 18:28 ?2608次閱讀

    stm32定時器編碼模式可以做輸出嗎?

    我想要做正交編碼,但是網上一般只介紹了用編碼對其做解碼,而我需要的是輸出波形。我在一個小網站的解答上看到定時器的編碼模式也可以做輸出,
    發表于 07-31 07:59

    定時器的工作方式介紹

    定時器是計算機和嵌入式系統中常見的一種硬件模塊,用于實現定時和計數功能。定時器的工作方式通常由一組寄存來控制,這些寄存定義了
    的頭像 發表于 07-12 10:29 ?1824次閱讀

    定時器相關的寄存有哪些類型

    在微控制編程中,定時器是一種非常常見的功能模塊,用于實現各種定時和計數功能。定時器的工作原理是通過內部的計數來跟蹤時間的流逝,當計數
    的頭像 發表于 07-12 10:25 ?1615次閱讀

    STM32G4系列芯片定時器的延時輸出問題

    有人使用STM32G4系列芯片內部的多個定時器做PWM輸出,輸出頻率一樣,占空比也一樣,均為50%。可是,當他中途調整各個定時器以相同的工作參數,即改變ARR的值和CCR值后,會發現TIM2和TIM5兩個
    的頭像 發表于 07-01 09:45 ?2545次閱讀
    <b class='flag-5'>STM32</b>G4系列芯片<b class='flag-5'>定時器</b>的延時輸出問題

    鴻蒙開發系統基礎能力:Timer定時器

    設置一個定時器,該定時器定時器到期后執行一個函數。
    的頭像 發表于 06-28 11:33 ?1404次閱讀
    鴻蒙開發系統基礎能力:Timer<b class='flag-5'>定時器</b>

    長持續時間定時器電路圖 時間定時器的工作原理和功能

    時間定時器是一種用于計時和調度任務的工具。它允許我們在特定的時間間隔內執行某個任務,或者在特定的時間點執行某個操作。定時器在計算機系統中的應用非常廣泛,從操作系統的任務調度、網絡傳輸的控制到實時系統
    的頭像 發表于 06-24 17:34 ?4327次閱讀
    長持續時間<b class='flag-5'>定時器</b>電路圖 時間<b class='flag-5'>定時器</b>的工作原理和功能

    使用Arduino的可變定時器繼電器設計

    定時器繼電器,也被稱為時間繼電器,是一種在設定的時間間隔后觸發特定操作的電子元件。它在工業自動化、家庭生活、交通管理等領域具有廣泛的應用。定時器繼電器的主要功能是通過設定特定的時間間隔,來控制電路的通斷,實現設備的自動化操作。
    的頭像 發表于 06-24 16:52 ?1527次閱讀
    使用Arduino的可變<b class='flag-5'>定時器</b>繼電器設計
    主站蜘蛛池模板: 天天干天天添 | 狠狠色噜噜狠狠狠狠91 | 在线天堂中文www官网 | 口述他拿舌头进去我下面好爽 | 日本免费不卡视频一区二区三区 | 特级无码毛片免费视频尤物 | 午夜视频1000部免费看 | bt天堂新版中文在线地址 | 日韩免费毛片 | 久久水蜜桃网 | 人操人人| 亚洲免费成人网 | 日本不卡高清免费v日本 | heyzo在线播放4k岛国 | 日韩一级在线 | 成人亚洲电影 | 四虎国产精品视频免费看 | 久久精品亚瑟全部免费观看 | 天天干天天谢 | 巨骚综合网 | 五月婷在线观看 | 国模私拍在线视频 | 人人爱爱| 久久精品乱子伦免费 | 日本一区二区三区视频在线观看 | 日本污视频在线观看 | 成人亚洲欧美综合 | 天堂资源在线官网资源 | 亚洲成在人天堂一区二区 | 在线视频精品免费 | 天天干天天干天天干天天 | 19xxxxxxxxx日本69 2015xxxx欧美 | 免费在线看片网站 | 国产叼嘿免费视频网站 | 天天拍夜夜操 | 欧美激情第一欧美在线 | 最近在线视频免费观看2019 | 久久国产色 | 玖玖在线国产精品 | 亚洲狠狠网站色噜噜 | 国产午夜人做人视频羞羞 |