色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

基于STM32定時器的DMA BURST傳輸為什么實現不了呢?

茶話MCU ? 來源:茶話MCU ? 2023-05-05 09:37 ? 次閱讀

有人使用STM32F4系列開發產品,程序運行過程中需要不時地對外輸出一串驅動脈沖,并要求這幾串脈沖的頻率可變、占空比固定。他想到使用基于STM32定時器DMA BURST傳輸。具體點說,他期望不時地通過TIM3的CH1輸出一串頻率可變、占空比固定的脈沖然后停下來。這個思路在原理上是沒問題的,可是他在測試過程中發現怎么也折騰不出預期的效果。

他目前使用的芯片是STM32F401,雖有點老舊,但我查看了手冊,確認該芯片的TIM3是支持基于TIMER事件實現TIME寄存器與內存間的DMA BURST傳輸的。即每個TIMER事件可以申請多個DMA請求從而實現定時器寄存器與內存間的批量數據傳輸。要知某個STM32 TIMER是否支持上述功能,只需查看STM32參考手冊的相關定時器的寄存器中有無TIMx_DCR和TIMx_DMAR寄存器的介紹。

1add2fa6-eae4-11ed-90ce-dac502259ad0.png

既然支持,為什么實現不了呢?關于這個功能我們還需要注意幾點:

1、所選擇的TIMER必須支持基于定時器事件的DMABURST傳輸功能。

2、觸發事件必須是來自參與DMA傳輸的定時器事件,不能是別的定時器事件。比方說你想實現TIM1的寄存器與內存間的DMA BURST傳輸,觸發事件不能是來自TIM2、TIM3這些非TIM1的事件。

3、定時器DMA Burst傳輸時,用來被BURST訪問的定時器寄存器應該是同一定時器的而且是地址連續的寄存器,不可跳躍訪問。比方說像下面某TIMER的4個比較寄存器物理地址是安排在一起的,而CH2恰好因為某些原因沒有被用上。

1af4b5cc-eae4-11ed-90ce-dac502259ad0.png

如果你僅對CH1/CH3/CH4三個通道的比較寄存器的值做BURST訪問,此時盡管CH2沒有被用上,BURST訪問的傳輸個數應該是4而不是3。

4、STM32 HAL庫里的例程或函數重點在演示相應的功能或特性,但它不能包羅萬象或保證適用于任何場景。有些時候我們可能需要在現有庫函數的前提下適當地做些調整來滿足需求。

結合這幾點,我們一起排查下。第1點、第2點已經核對過了,沒問題??纯吹?點,即設置BURST傳輸個數。下圖是F40x系列TIM2~TIM5的內存地址映射圖。

1b166244-eae4-11ed-90ce-dac502259ad0.png

現在使用者真正需要用到的寄存器只有TIM3->ARR和TIM3->CCR1兩個寄存器,但二者中間還有個預留空位【其它高級定時器的RCR寄存器的位置】也必須算進來,即這里BURST傳輸個數應該是3而不是2。

再看看上面提到的第4點要注意的地方。這點我就不過多解釋了,ST提供的HAL庫例程及相關函數只能實現1次BURST傳輸的功能,如果要實現多次BURST傳輸就得在其代碼基礎上做些調整,更多細節可以參考我之前分享的那篇《STM32定時器BURST傳輸介紹及示例》。不過,在那篇的演示例程里我使用的是DMA Circular模式,現在的用戶則要使用DMA Normal模式。采用Normal模式和采用Circular模式基于現有HAL庫函數組織代碼還略有差異,若沒處理好這點小差異,可能讓你完全出不來想要的結果。

下面我使用STM32G4芯片的TIM3-CH1演示上面用戶的功能。每次輸出5個脈沖,3次輸出為一個循環,同一循環中的3次輸出的頻率各不相同,占空比一樣。【為什么沒用STM32F401芯片,是因為此時手上沒有帶該芯片的開發板。不過演示功能的配置及代碼基本一樣。】

我使用CubeMx對TIM3進行配置,參考配置如下:

1b38b06a-eae4-11ed-90ce-dac502259ad0.png

開啟TIM3基于更新事件的DMA傳輸功能并做相關配置。

1b62f14a-eae4-11ed-90ce-dac502259ad0.png

配置完成,生成初始化工程,添加用戶代碼。

我準備了3串脈沖的ARR/CCR1的值,分別以數組PulseData1[]、PulseData2[]、PulseData3[]來存放,占空比都設置為50%。顯然數組行中間的0值用于前面提到過的預留字,此處無實際作用。另外,每個數組中的第6行數據其實是關閉當前通道PWM輸出,具體應用時注意結合所選擇的PWM模式及極性選擇。

下面是參考用戶代碼。代碼在手機模式下可左右滑動。

/* USER CODE BEGIN PD */
#define ARR1 (10000U)
#define ARR2 (20000U)
#define ARR3 (40000U)
#defineCount(18)   //3 * 6


uint16_t PulseData1[]={
 ARR1,0,ARR1*0.5,
 ARR1,0,ARR1*0.5,
 ARR1,0,ARR1*0.5,
 ARR1,0,ARR1*0.5,
 ARR1,0,ARR1*0.5,//
 ARR1,0,0};




uint16_t PulseData2[]={
ARR2,0,ARR2*0.5,
ARR2,0,ARR2*0.5,
ARR2,0,ARR2*0.5,
ARR2,0,ARR2*0.5,
ARR2,0,ARR2*0.5,//
ARR2,0,0,
};


uint16_t PulseData3[]={
ARR3,0,ARR3*0.5,
ARR3,0,ARR3*0.5,
ARR3,0,ARR3*0.5,
ARR3,0,ARR3*0.5,
ARR3,0,ARR3*0.5,//5
ARR3,0,0,
};


/* USER CODE END PD */

主循環測試代碼如下:

int main(void)
{
/* USER CODE BEGIN 1 */


/* USER CODE END 1 */


/* MCU Configuration--------------------------------------------------------*/


/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();


/* USER CODE BEGIN Init */


/* USER CODE END Init */


/* Configure the system clock */
  SystemClock_Config();


/* USER CODE BEGIN SysInit */


/* USER CODE END SysInit */


/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_TIM3_Init();
/* USER CODE BEGIN 2 */
    __HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);
  TIM_CCxChannelCmd(TIM3,TIM_CHANNEL_1,TIM_CCx_ENABLE);
/* USER CODE END 2 */


/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
  {
/* USER CODE END WHILE */


/* USER CODE BEGIN 3 */
htim3.DMABurstState=HAL_DMA_BURST_STATE_READY;
       hdma_tim3_up.State = HAL_DMA_STATE_READY ;


       __HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);


      HAL_TIM_DMABurst_MultiWriteStart(&htim3, TIM_DMABASE_ARR,TIM_DMA_UPDATE,(uint32_t *)PulseData1,
                                       TIM_DMABURSTLENGTH_3TRANSFERS,Count);
      TIM3->EGR = TIM_EGR_UG;
      __HAL_TIM_ENABLE(&htim3);


HAL_Delay(150);//Preparedforthe next5 Pulses
__HAL_TIM_DISABLE(&htim3);
//  HAL_DMA_Abort(&hdma_tim3_up);


      htim3.DMABurstState = HAL_DMA_BURST_STATE_READY;
      hdma_tim3_up.State = HAL_DMA_STATE_READY ;


      __HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);


       HAL_TIM_DMABurst_MultiWriteStart(&htim3, TIM_DMABASE_ARR,TIM_DMA_UPDATE,(uint32_t *)PulseData2,
                                        TIM_DMABURSTLENGTH_3TRANSFERS,Count);
      TIM3->EGR = TIM_EGR_UG;
      __HAL_TIM_ENABLE(&htim3);


      HAL_Delay(150);//Prepared for the next 5 Pulses
__HAL_TIM_DISABLE(&htim3);
//   HAL_DMA_Abort(&hdma_tim3_up);


      htim3.DMABurstState = HAL_DMA_BURST_STATE_READY;
      hdma_tim3_up.State = HAL_DMA_STATE_READY ;


       __HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);


       HAL_TIM_DMABurst_MultiWriteStart(&htim3, TIM_DMABASE_ARR,TIM_DMA_UPDATE,(uint32_t *)PulseData3,
                                        TIM_DMABURSTLENGTH_3TRANSFERS,Count);
      TIM3->EGR = TIM_EGR_UG;
      __HAL_TIM_ENABLE(&htim3);


      HAL_Delay(150);//Prepared for the next 5 Pulses
__HAL_TIM_DISABLE(&htim3);
//   HAL_DMA_Abort(&hdma_tim3_up);


  }
/* USER CODE END 3 */
}

編譯、除錯后,運行程序可以看到我所期望的結果。即我每隔一會兒就發出5個脈沖,3次為1個循環。測試代碼都放在這里,供參考使用。這里不逐句解釋了,具體使用時結合庫代碼來研究即可。

1b779136-eae4-11ed-90ce-dac502259ad0.png

最后,補充一下有關上篇《利用非對稱PWM模式體驗編碼器功能》文中3個變量如何使用ARM MDK IDE自帶邏輯分析儀的配置,我把配置截圖放于此供有需要的人參考。

這里的CNT_value連續記錄TIM2計數器的值,這里為Analog量。

Level_PA8記錄GPIOA_PIN8的電平情況,1或0兩個值之一,為Bit量。

Level_PA9跟Level_PA8是完全相同的數據類型,顯示的是GPIOA_PIN9的電平。顯然,邏輯分析儀配置里關于Level_PA9的顯示算式的屏蔽數應該是0x00000200,右移位為9。我是在SYSTICK的毫秒中斷里讀取GPIOA->IDR的值即管腳電平到變量Level_PA8和Level_PA9的?!鞠聢D中Core Clock填寫芯片支持的最高主頻】

1b8f5686-eae4-11ed-90ce-dac502259ad0.png

1ba57cfe-eae4-11ed-90ce-dac502259ad0.png







審核編輯:劉清

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

    關注

    31

    文章

    5390

    瀏覽量

    121901
  • 定時器
    +關注

    關注

    23

    文章

    3259

    瀏覽量

    115890
  • dma
    dma
    +關注

    關注

    3

    文章

    568

    瀏覽量

    101478
  • STM32F4
    +關注

    關注

    3

    文章

    194

    瀏覽量

    28379

原文標題:為何實現不了定時器DMA Burst傳輸?

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

收藏 人收藏

    評論

    相關推薦

    STM32F030的定時器PWM使用設置與ADC的dma代碼

    里面是STM32F030的定時器PWM使用設置與ADC的dma代碼
    發表于 03-21 15:29 ?152次下載

    基于STM32定時器實現毫秒延時函數

    STM32定時器包含基本定時器、通用定時器和高級定時器,其中TIM6和TIM7是STM32當中的
    發表于 10-12 15:54 ?2.5w次閱讀
    基于<b class='flag-5'>STM32</b><b class='flag-5'>定時器</b><b class='flag-5'>實現</b>毫秒延時函數

    STM32定時器觸發DMA數據傳輸失敗的原因如何解決

    有人使用STM32定時器事件觸發DMA,讓其將內存數據傳輸到通信外設的數據寄存進行發送,發現DMA
    的頭像 發表于 11-25 09:21 ?2.2w次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>定時器</b>觸發<b class='flag-5'>DMA</b>數據<b class='flag-5'>傳輸</b>失敗的原因如何解決

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

    這里有兩個專門用于定時器BURST傳輸的寄存,分別是TIM2_DCR和TIM2_DMAR. 其中TIM2_DCR就是用來配置從哪個定時器
    的頭像 發表于 05-14 09:15 ?1.3w次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>定時器</b><b class='flag-5'>BURST</b><b class='flag-5'>傳輸</b>介紹及示例

    基于STM32定時器捕獲測量脈寬的應用示例

    我們知道,利用單片機定時器捕獲功能測量脈沖信號寬度及占空比是種很常見的做法。這里以STM32定時器為例來介紹基于其捕獲功能實現對脈寬的測量的思路及過程。 一般來講,使用
    的頭像 發表于 01-02 18:17 ?1.3w次閱讀
    基于<b class='flag-5'>STM32</b><b class='flag-5'>定時器</b>捕獲測量脈寬的應用示例

    STM32CUBEMX配置教程(十二)STM32定時器觸發的固定頻率ADC采樣(使用DMA

    STM32CUBEMX配置教程(十二)STM32定時器觸發的固定頻率ADC采樣(使用DMA
    發表于 11-24 13:51 ?85次下載
    <b class='flag-5'>STM32</b>CUBEMX配置教程(十二)<b class='flag-5'>STM32</b>的<b class='flag-5'>定時器</b>觸發的固定頻率ADC采樣(使用<b class='flag-5'>DMA</b>)

    STM32CUBEMX配置教程(十三)STM32定時器觸發的固定頻率DAC輸出(使用DMA

    STM32CUBEMX配置教程(十三)STM32定時器觸發的固定頻率DAC輸出(使用DMA
    發表于 11-24 14:06 ?47次下載
    <b class='flag-5'>STM32</b>CUBEMX配置教程(十三)<b class='flag-5'>STM32</b>的<b class='flag-5'>定時器</b>觸發的固定頻率DAC輸出(使用<b class='flag-5'>DMA</b>)

    STM32——高級定時器、通用定時器、基本定時器的區別

    STM32——高級定時器、通用定時器、基本定時器的區別
    發表于 11-26 15:21 ?110次下載
    <b class='flag-5'>STM32</b>——高級<b class='flag-5'>定時器</b>、通用<b class='flag-5'>定時器</b>、基本<b class='flag-5'>定時器</b>的區別

    STM32-通用定時器-定時器中斷

    1STM32定時器STM32F103ZET6一共有8個定時器,其中分別為:高級定時器(TIM1、TIM8);通用
    發表于 11-26 15:36 ?16次下載
    <b class='flag-5'>STM32</b>-通用<b class='flag-5'>定時器</b>-<b class='flag-5'>定時器</b>中斷

    STM32F103定時器觸發ADC+DMA傳輸

    STM32F103定時器觸發ADC+DMA傳輸ADC除了軟件觸發方式之外還有外部觸發模式,我用TIM2定時器觸發ADC,并用
    發表于 11-30 10:36 ?57次下載
    <b class='flag-5'>STM32</b>F103<b class='flag-5'>定時器</b>觸發ADC+<b class='flag-5'>DMA</b><b class='flag-5'>傳輸</b>

    H743定時器觸發ADC轉換DMA傳輸之應用

    學習安富萊的H743的定時器觸發ADC DMA傳輸源碼
    發表于 11-30 11:21 ?11次下載
    H743<b class='flag-5'>定時器</b>觸發ADC轉換<b class='flag-5'>DMA</b><b class='flag-5'>傳輸</b>之應用

    STM32定時器學習---基本定時器

    STM32F1系列的產品,除了互聯網產品外,工作8個,3種定時器,其中一種就是基本定時器。那么STM32單片機的基本定時器如何操作以及編程
    發表于 12-02 14:06 ?28次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>定時器</b>學習---基本<b class='flag-5'>定時器</b>

    stm32 定時器觸發ADC多通道采樣+DMA提取數據

    stm32g0 定時器觸發ADC多通道采樣+DMA提取數據stm32g0 定時器觸發ADC多通道采樣+D
    發表于 12-16 16:56 ?68次下載
    <b class='flag-5'>stm32</b> <b class='flag-5'>定時器</b>觸發ADC多通道采樣+<b class='flag-5'>DMA</b>提取數據

    定時器DMA Burst傳輸無法實現

    有人使用STM32F4系列開發產品,程序運行過程中需要不時地對外輸出一串驅動脈沖,并要求這幾串脈沖的頻率可變、占空比固定。他想到使用基于STM32定時器DMA
    的頭像 發表于 06-21 16:21 ?1186次閱讀
    <b class='flag-5'>定時器</b><b class='flag-5'>DMA</b> <b class='flag-5'>Burst</b><b class='flag-5'>傳輸</b>無法<b class='flag-5'>實現</b>

    運用 DMA 功能實現高級定時器和 ADC 的同步觸發采樣

    運用DMA功能實現高級定時器和ADC的同步觸發采樣在做BLDC電機控制時,需要ADC的采樣時刻和定時器產生的PWM波形相配合,才能獲取準確的采樣值,本文介紹了CW32F030系列芯片通
    發表于 06-06 13:35 ?31次下載
    主站蜘蛛池模板: 亚洲网站视频在线观看 | 青娱乐国产精品视频 | 国产在线精品一区二区网站免费 | 男人的天堂黄色 | 91九色精品国产免费 | 热巴两次用约老师屁股发底线球 | 欧美一区二区影院 | 日日AV夜夜添久久奶无码 | 亚洲 综合 欧美在线 热 | 男人插曲视频大全免费网站 | 亚洲精品偷拍影视在线观看 | 欧美特级午夜一区二区三区 | 好大好爽好深舒服死了 | 在线中文字幕 | 床上色APP下载免费版 | 国产精品久久久久久久久LI无码 | 正在播放国产尾随丝袜美女 | 无套内射在线观看THEPORN | AV久久久囯产果冻传媒 | 免费精品一区二区三区AA片 | 最新国自产拍 高清完整版 最新国产在线视频在线 | 黄色小说在线 | 无码人妻精品一区二区蜜桃色欲 | 亚洲色无码播放 | 99久久麻豆AV色婷婷综合 | 香蕉久久夜色精品国产小优 | 美女胸禁止18以下看 | 4虎影院午夜在线观看 | 91久久偷偷做嫩草影院免 | 国产精品欧美一区二区在线看 | 亚洲国产精品嫩草影院久久 | 国产乱码伦人偷精品视频 | 国产精品亚洲精品影院 | 黄色三级网址 | 国产-第1页-浮力影院 | 伊人久久大线蕉香港三级 | 国产成人a视频在线观看 | 暖暖视频中国在线观看免费韩国 | 99热在线播放 | 日韩人妻无码精品-专区 | av在线色|