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

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

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

3天內不再提示

DMA觸發(fā)請求異常之案例分享

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

STM32用戶開發(fā)產品,用到ADC模塊,通過定時器更新事件觸發(fā)AD轉換,轉換結果由DMA搬運到指定的內存區(qū)域。DMA工作在正常模式(即非循環(huán)模式),每當傳輸完畢一批數(shù)據(jù)后在傳輸完成中斷里設置傳輸結束標志,應用代碼對該標志進行監(jiān)視。

當檢查到該有效標志時,說明采集到了預定的轉換數(shù)據(jù)。將數(shù)據(jù)處理后,軟件產生TIMER更新事件,以保證計數(shù)器從0開始計數(shù)【注:這里選用的向上計數(shù)模式】。然后清除更新事件標志、ADC轉換完成標志位EOC ,關閉DMA后對DMA進行再配置,然后重新使能DMA進行第二次傳輸。


調試中發(fā)現(xiàn),對于第二次DMA傳輸,每次一使能DMA 就立即搬運一個數(shù)據(jù)。按理說應該延時一個定時器更新周期后才會搬運首次數(shù)據(jù)才對。因為軟件置位UG位后,用來觸發(fā)ADC的TIMer是從0開始計數(shù)的,需要計數(shù)到溢出才會觸發(fā)AD轉換。他想不明白的是TIM已經復位從0開始計數(shù)了,該清的標志位都清除了,還有什么原因導致DMA不等TIMER觸發(fā)就立即先行搬運一個數(shù)據(jù)呢。

該問題源于某STM32論壇,但用戶沒有貼出任何代碼。這里模擬他的應用場景做個測試驗證,并試圖找出相關原因。

我這里也設計了兩輪DMA傳輸,照樣使用TIMER更新事件觸發(fā)ADC轉換。第一輪DMA傳輸傳輸3個AD轉換結果到某內存地址,第二輪傳輸5個轉換結果到另一內存位置。

先使用Stm32CubeMx基于STM32F411Discovery板進行基本的初始化配置。配置都很簡單。

ADC配置,這里只選擇1個常規(guī)通道用于測試,選擇TIM2的觸發(fā)輸出啟動AD轉換,并開啟ADC的DMA傳輸功能,DMA工作在Normal模式。【硬件上ADC輸入通道我直接連VDD了】

TIMER配置,這里選擇TIM2,其更新事件做為觸發(fā)輸出用來啟動ADC。

配置完畢后生成初始化代碼,然后添加用戶代碼。

這里準備了幾個內存變量.

我在第一次DMA傳輸完成后立即關閉定時器,在開啟第二輪DMA傳輸前,不讓定時器有機會再次觸發(fā)ADC產生EOC事件。看看有無他說到的情形發(fā)生。

我把用戶代碼分成兩部分,分別用紅框、綠框區(qū)分。

第一部分由基本的初始化函數(shù)、開啟ADC外設及其DMA功能、對第一次DMA傳輸做配置并使能DMA、等待3次ADC轉換結束。

第二部分代碼的功能主要關閉定時器、關閉DMA,第二次對DMA進行配置,再開啟DMA功能并啟動定時器。【我把斷點打在箭頭所指的地方,即待啟動計數(shù)器的那句代碼處】

基于上述代碼測試,沒有發(fā)現(xiàn)一使能第二次DMA傳輸就先傳一個數(shù)據(jù)的現(xiàn)象。這時定時器也沒被啟動,DMA處于就緒待命狀態(tài)。【結果如下圖】

那客戶反饋的情況到底是怎么回事呢?

因為沒見到用戶具體的代碼,他說過在DMA做完第一次傳輸后,還對定時器做了復位。那我們不妨在第一次DMA傳輸結束后,增加對定時器的復位操作,看看結果會怎么樣。

我將第二部分代碼稍作修改如下【見下圖中A處代碼】:

基于調整過的代碼進行測試,還真發(fā)現(xiàn)了一使能第二次DMA傳輸時就先傳一個數(shù)據(jù)的現(xiàn)象。可是此時定時器仍未啟動,DMA怎么就開始傳輸數(shù)據(jù)了呢。【結果如下圖所示】

當然,單純從DMA傳輸功能來講,它跟定時器是否啟動并沒有必然聯(lián)系。對于被使能了的DMA,只要有合適的DMA請求出現(xiàn),它就行使職能。具體到這里,應該是有EOC事件出現(xiàn)了才會發(fā)生DMA傳輸?shù)摹D沁@個EOC事件從哪里來的呢?

我們不妨先理一理:

第一次DMA傳輸完成后不可能還有待處理EOC事件存在。在第一次DMA傳輸過程中,每次DMA讀取ADC數(shù)據(jù)就保證EOC被清零了,DMA傳輸完成后又立即關閉了定時器,本案例里也沒有別的事情影響定時器的迅速關閉。按理說在兩次DMA傳輸之間不會有定時器更新事件觸發(fā)AD轉換,更何況在使能第二次DMA前還專門做了EOC的清除操作。

看起來的確有點奇怪,怎么感覺有個DMA請求,用客戶的話說,好像潛伏在哪里一樣?

目前的代碼跟剛開始的比,多了個定時器的復位操作。難道這個復位操作會導致ADC轉換而生成EOC事件?說到這,它還真有這本事。

因為軟件方式對定時器進行復位也可以產生更新事件,它正好能啟動AD轉換【AD轉換功能一直都沒關閉過】從而產生EOC事件。如果EOC標志沒有及時清除的話,就可以在下次DMA傳輸剛被使能,即使計數(shù)器還沒被啟動的條件下觸發(fā)一次DMA傳輸。

分析到這里,感覺找到問題原因了。但是,似乎還是有點不對勁。因為即使定時器復位動作產生更新事件而觸發(fā)ADC轉換,進而產生EOC事件, 但我們在定時器復位動作之后還特意做過對EOC標志的清除。【下圖中的第二個紅圈內的代碼】

難道說這個清除EOC標志的操作有問題?

先確認代碼寫法本身,沒有問題。再看邏輯和時序上問題。

通過進一步的調試,在下圖所示代碼處放了3個斷點單步運行,的確發(fā)現(xiàn)定時器復位事件觸發(fā)了ADC轉換,EOC被置位。在后續(xù)代碼中也發(fā)現(xiàn)EOC被清零了。有意思的是,當開著下圖所示3個斷點來運行時,那個奇怪的現(xiàn)象就消失了,那潛伏的DMA請求似乎遁形了。

如果取消上面的第1、第2個斷點后運行代碼,那個現(xiàn)象立即又重現(xiàn),潛伏的又激活了。

反復驗證到這里,基本上明白是怎么回事了。

毫無疑問,定時器的復位操作導致AD轉換而產生了EOC事件。代碼里雖然有對EOC的清除操作,但該操作相對ADC而言,太早了點。即在針對EOC做刪除操作時,ADC可能還在忙著轉換,離產生EOC事件還早呢。這正好可以解釋為什么在復位操作代碼后放個斷點再刪除EOC就有效的情形。

既然這樣,我在清除EOC操作代碼的前面加一句EOC標志查詢等待,以保證后續(xù)的清除操作可靠有效。我將代碼再次做了調整。見下圖中方框內代碼。

就修改過的代碼進行驗證,那個現(xiàn)象徹底消失。后續(xù)的第二輪DMA傳輸也規(guī)規(guī)矩矩了。

到此,本應用案例分享結束。最后,稍作小結并做些提醒:

1、針對STM32定時器的軟件復位操作可以產生更新事件,其效果等同于定時器溢出導致的更新事件。

2、我們編寫代碼,尤其這種嵌入式代碼時,除了保證代碼基本的正常邏輯外,各個硬件本身操作時序、響應時間參數(shù)等也須多加關注。

3、結合本案例,在第一次DMA傳輸完成后為第二次DMA做準備時,建議先關閉計數(shù)器,否則可能會給我們的應用帶來些隱患,本案例中探討的問題,就是其中隱患之一。限于篇幅和主題,這里就不啰嗦了,后面若有合適案例再行交流。

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

    關注

    99

    文章

    6533

    瀏覽量

    545457
  • STM32
    +關注

    關注

    2270

    文章

    10923

    瀏覽量

    357090
  • 定時器
    +關注

    關注

    23

    文章

    3255

    瀏覽量

    115181

原文標題:DMA觸發(fā)請求異常之案例分享

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

收藏 人收藏

    評論

    相關推薦

    雅特力AT32F402/F405 DMA使用指南

    通道都支持外設的DMA請求映射到任意通道上。圖1.DMA控制器架構DMAMUX簡介對于如何將外設的DMA請求映射到任意的數(shù)據(jù)流通道上,就需要
    的頭像 發(fā)表于 11-20 01:03 ?346次閱讀
    雅特力AT32F402/F405 <b class='flag-5'>DMA</b>使用指南

    DMA是什么?詳細介紹

    系統(tǒng)性能。 DMA(直接內存訪問)概述 1. DMA的定義 直接內存訪問(DMA)是一種硬件特性,允許外圍設備直接讀寫系統(tǒng)內存,而不需要CPU的直接控制。這種技術主要用于高速數(shù)據(jù)傳輸,如磁盤讀寫、網絡通信等。 2.
    的頭像 發(fā)表于 11-11 10:49 ?1w次閱讀

    求助,關于STM32G473 TIM8 DMA burst模式問題求解

    我在配置外部觸發(fā)源定時觸發(fā)TIM8_CH1輸出PWM時,打算使用DMA1_Channel4在每次TIM8 UP時觸發(fā)DMA傳輸來更新ARR、
    發(fā)表于 07-23 06:39

    CW32使用DMA單通道、定時器觸發(fā)ADC實現(xiàn)了多路AD采集

    本測試樣例基于CW32F030C8T6MCU,使用DMA單通道、定時器觸發(fā)ADC實現(xiàn)了12路AD采集。
    的頭像 發(fā)表于 05-24 09:29 ?885次閱讀
    CW32使用<b class='flag-5'>DMA</b>單通道、定時器<b class='flag-5'>觸發(fā)</b>ADC實現(xiàn)了多路AD采集

    STM32f405 SPI DMA接收異常的原因?

    芯片:STM32f405,做的功能是SPI的dma傳輸, st正常接收是這樣的,0xAB 0xBA 0xA0 ~~~~~~ 假如出現(xiàn)異常0x0 0xAB 0xBA 0xA0~~~~~ 出現(xiàn)
    發(fā)表于 05-13 08:01

    請問STM32L4R5ZI的DMA/DMAMUX是怎么管理請求

    原來的STM32系列,比如F1,是沒有DMAMUX這個東西的,DMA1的1通道2通道具體對應什么樣的請求,有一個專門的對應表。但是現(xiàn)在的DMAMUX加進來以后,對于89個外設請求,并沒有地方說明什么
    發(fā)表于 04-28 06:19

    求助,STM32F030 ADC_CFGR1中DMACFG的使用問題求解

    DMA傳輸 30個數(shù)據(jù)后,觸發(fā)DMA傳輸完成中斷,通過DMA_CCR_EN 暫時關閉DMA傳輸。處理完數(shù)據(jù)后,再通過
    發(fā)表于 04-26 07:25

    定時器TIM2輸出TRGO信號,DMA使用DMA_REQUEST_TIM2_UP請求可以實現(xiàn)嗎?

    定時器TIM2輸出TRGO信號,DMA使用DMA_REQUEST_TIM2_UP請求可以實現(xiàn)嗎?
    發(fā)表于 04-10 07:09

    請問如何使用定時器的更新事件觸發(fā)DMA讀取6字節(jié)SPI數(shù)據(jù)?

    想用定時器的更新事件觸發(fā)DMA讀取SPI數(shù)據(jù),現(xiàn)在有個問題是一次更新事件只能觸發(fā)一次DMA傳輸,我想要定時器觸發(fā)一次,
    發(fā)表于 03-29 06:16

    AD7767如何用TIM外部觸發(fā)模式,去觸發(fā)SPI_DMA傳輸?

    用在AD7767(ADC采集芯片)。這個芯片有個數(shù)據(jù)就緒引腳DRDY,DRDY為電平時,SPI可以讀取AD7767數(shù)據(jù)。我原本用的是外部中斷去檢測DRDY引腳,在外部中斷函數(shù)里觸發(fā)SPI_DMA傳輸
    發(fā)表于 03-21 06:55

    STM32U575定時器PWM觸發(fā)DMA搬運內存時,為什么程序在DMA中斷里出不來?

    STM32U575 定時器PWM觸發(fā)DMA搬運內存,為什么程序在DMA中斷里出不來?
    發(fā)表于 03-12 08:33

    DMA Request不是DMA觸發(fā)源嗎?為什么沒反應?

    這個DMA Request不是DMA觸發(fā)源嗎,我想在TIM執(zhí)行完一個周期后,DMA再行將數(shù)據(jù)寫入CCR寄存器,那不是應該選擇TIM_UP的DMA
    發(fā)表于 03-12 08:17

    雅特力AT32F423 DMA使用指南

    通道都支持外設的DMA請求映射到任意通道上。圖1.DMA控制器架構DMAMUX簡介對于如何將外設的DMA請求映射到任意的數(shù)據(jù)流通道上,就需要
    的頭像 發(fā)表于 02-22 08:13 ?765次閱讀
    雅特力AT32F423 <b class='flag-5'>DMA</b>使用指南

    如何使用定時器觸發(fā)器進行SPI DMA傳輸?

    我正在做一個項目,在這個項目中,我必須在 DMA 模式下通過 SPI 定期傳輸數(shù)據(jù)。 為了避免 CPU 干預,我想使用計時器觸發(fā)觸發(fā) SPI DMA 傳輸。 請為此提供建議。
    發(fā)表于 01-30 08:08

    Aurix的DMA硬件請求源自于中斷路由模塊,請問是否支持一個外設請求(中斷)對應多個DMA通道?

    Aurix的DMA硬件請求源自于中斷路由模塊,請問是否支持一個外設請求(中斷)對應多個DMA通道?
    發(fā)表于 01-26 07:15
    主站蜘蛛池模板: 免费三级现频在线观看 | 免费看黄色一级 | 亚洲AV无码专区国产精品麻豆 | 国产原创中文视频 | 国产视频成人 | 两个人的视频hd全免费 | 伊人网综合 | 久久精品日本免费线 | 一个人免费观看在线视频播放 | 欧美性猛交AAA片免费观看 | 国产在线精品亚洲 | 国产深夜福利视频在线 | qvod快播在线观看 | 天天槽任我槽免费 | 97国产成人精品免费视频 | brazzers情欲狂欢 | 国产亚洲精品久久久999蜜臀 | 美女脱18以下禁止看免费 | 高H纯肉NP 弄潮NP男男 | 亚洲国产精品VA在线看黑人 | 火影小南被爆羞羞网站 | 亚洲精品国产品国语在线试看 | 国产精品高清在线观看地址 | 日韩黄色软件 | 久久操热在线视频精品 | RUNAWAY韩国动漫免费官网版 | 天天夜夜草草久久亚洲香蕉 | 久久视频这里只精品6国产 久久视频在线视频观品15 | 日韩一区二区三区视频在线观看 | 日本免费一本天堂在线 | 四虎影院网红美女 | 精品夜夜澡人妻无码AV蜜桃 | 国产亚洲精品第一区香蕉 | 999久久久国产精品蜜臀AV | 污文乖不疼的 | 九九99国产香蕉视频 | 亚洲精品视频在线观看视频 | 亚洲综合免费视频 | 拔萝卜在线高清观看视频 | 野草在线视频完整视频 | 四虎影视永久无码精品 |