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

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

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

3天內不再提示

DMA觸發請求異常之案例分享

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

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

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


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

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

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

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

ADC配置,這里只選擇1個常規通道用于測試,選擇TIM2的觸發輸出啟動AD轉換,并開啟ADC的DMA傳輸功能,DMA工作在Normal模式?!居布螦DC輸入通道我直接連VDD了】

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

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

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

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

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

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

第二部分代碼的功能主要關閉定時器、關閉DMA,第二次對DMA進行配置,再開啟DMA功能并啟動定時器?!疚野褦帱c打在箭頭所指的地方,即待啟動計數器的那句代碼處】

基于上述代碼測試,沒有發現一使能第二次DMA傳輸就先傳一個數據的現象。這時定時器也沒被啟動,DMA處于就緒待命狀態?!窘Y果如下圖】

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

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

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

基于調整過的代碼進行測試,還真發現了一使能第二次DMA傳輸時就先傳一個數據的現象??墒谴藭r定時器仍未啟動,DMA怎么就開始傳輸數據了呢?!窘Y果如下圖所示】

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

我們不妨先理一理:

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

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

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

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

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

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

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

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

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

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

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

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

就修改過的代碼進行驗證,那個現象徹底消失。后續的第二輪DMA傳輸也規規矩矩了。

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

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

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

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

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

    關注

    99

    文章

    6648

    瀏覽量

    548359
  • STM32
    +關注

    關注

    2290

    文章

    11017

    瀏覽量

    362649
  • 定時器
    +關注

    關注

    23

    文章

    3289

    瀏覽量

    117335

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    泰克示波器高級觸發功能捕獲異常信號的5種方法

    在電子工程領域,示波器是調試和分析信號的核心工具,而泰克示波器憑借其強大的高級觸發功能,能夠精準捕獲異常信號,幫助工程師快速定位問題。本文將詳細介紹五種利用泰克示波器高級觸發功能捕獲異常
    的頭像 發表于 05-29 09:38 ?88次閱讀
    泰克示波器高級<b class='flag-5'>觸發</b>功能捕獲<b class='flag-5'>異常</b>信號的5種方法

    如何使用EXIT0來觸發DMA實現SPI發送數據?

    請問一下,我想使用EXIT0來觸發DMA實現SPI發送數據。我現在使用PB0作為EXIT0的觸發源,我把PB0配置為外部中斷模式,DMAMUX同步模式使能,選擇EXIT0作為同步信號源,這種情況下
    發表于 04-23 07:31

    XMC4300 SPI-DMA從屬模式行為異常的原因?

    XMC4300 SPI-DMA 從屬模式行為異常
    發表于 04-18 06:33

    STM32使用外部中斷觸發ADC采樣DMA搬運出現兩次進入DMA中斷的異常情況,怎么解決?

    STM32使用外部中斷觸發ADC采樣DMA搬運出現兩次進入DMA中斷的異常情況,使用的HAL庫+MX配置的,示波器觀察波形ADC中斷進入一次,DMA
    發表于 03-14 12:46

    CKS32F107xx系列的DMA控制器簡介

    (DMA1有7個通道,DMA2有5個通道),每個通道專門用來管理來自于一個或多個外設對存儲器訪問的請求。還有一個仲裁器來協調各個DMA請求
    的頭像 發表于 02-18 17:24 ?811次閱讀
    CKS32F107xx系列的<b class='flag-5'>DMA</b>控制器簡介

    如何調試 HTTP 請求和響應

    調試HTTP請求和響應是Web開發和網絡編程中的一個重要技能。以下是一些步驟和工具,可以幫助你調試HTTP請求和響應: 1. 使用瀏覽器開發者工具 大多數現代瀏覽器都內置了開發者工具,這些工具可以
    的頭像 發表于 12-30 09:28 ?1140次閱讀

    雅特力AT32F402/F405 DMA使用指南

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

    DMA是什么?詳細介紹

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

    HTTP相關返回值異常如何解決(上篇)

    ? 今天我們講講HTTP相關返回值異常如何解決(實例持續更新中) HTTP介紹 HTTP(超文本傳輸協議,Hypertext Transfer Protocol)是用于在網絡上進行數據交換的應用層
    的頭像 發表于 10-20 16:40 ?815次閱讀
    HTTP相關返回值<b class='flag-5'>異常</b>如何解決(上篇)

    2k1000LA中關于IODMA請求的描述

    在2k1000的用戶手冊中,有對IO互連網絡的DMA請求路由方式進行闡述,如圖。 其中提到窗口命中需要兩個條件,一是地址經過掩碼后與base相等,二是DMA訪存屬性和mmap[5]共同決定是否命中
    發表于 08-15 21:52

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

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

    stm32f103的spi+dma可以用IO模擬spi+dma觸發讀寫嗎?

    IO口模擬spi網上有很多例程,學習后已經搞定了,但是dma這個功能我掌握的比較淺,我不知道該什么時候做什么讓dma觸發讀寫 如果能行的話麻煩請告訴我一下大體流程,如果不行的也請說明一下原因,好讓我死心
    發表于 07-23 06:13

    STM32G474如果使用HRTIM A觸發ADC,使用ADC的DMA中斷接受數據,該怎么處理呢?

    HRTIM A設置comp3作為ADC觸發源;ADC啟動DMA,并使用DMA中斷來處理ADC數據和環2路計算。 問題:當開啟HRTIMA 的中斷和DMA ADC中斷后,
    發表于 07-18 08:10

    esp8266使用etharp_request() 的ARP請求異常怎么解決?

    這是關于 esp8266 的 ARP 的問題。我意識到這可能是一個相當低級的 SDK 問題,所以我將解釋一下我試圖實現的目標。 如果我們假設我有一個已知的MAC地址或IP地址,我想知道有問題的設備是否連接到網絡。ESP8266處于 STATION 模式,因此設備可能在 WiFi 上或可能在以太網上,但這并不重要。我正在使用 ESP07 和 Arduino SDK/平臺。 My understanding is that the ARP table in the ESP needs to have sent/received a packet from a device for the MAC and IP pair to be stored. If I do an ARP lookup for a known IP address using etharp_find_addr(STATION_IF, &_ip, &_arp_mac, &_arp_ip), then assuming the device is know, I get the index of the result and the associated MAC address. 搜索 IP 的 ARP 記錄 int8_t result = etharp_find_addr(STATION_IF, &_ip, &_arp_mac, &_arp_ip) 我讓流量被“看到”的一種方法是對設備執行 ping(使用內置的 ping.h)——這似乎對結果的準確性有很大幫助。事實上,如果我不執行 ping,那么大多數時候我都不會得到任何結果。我認為這遵循以下理論:只有在看到流向 IP/MAC 的流量時才會填充 ARP 表。到目前為止一切都很好。 但是,并非所有設備都響應 ping(如果它們處于休眠狀態等),因此這并不總是可靠的。相當可靠,但不是防彈的。 Other tools for desktop systems can use ARP to force a request to the network / device to get a reply. Using such tools gives a much more reliable answer to the question \"is device with IP address active?\". There appears to be some functionality within etharp.h, but if I even think about using them, such as etharp_request(STATION_IF, &_ip), then I get an exception and the ESP reboots. 測試 IP 地址 ip_addr_t test_ip; IP4_ADDR(&test_ip, 192,168,0,111); 進行搜索 int8_t result = etharp_request(STATION_IF, &test_ip); 我在這個論壇和谷歌上搜索了很長時間,以尋找這個問題的答案,但都失敗了。有沒有人有線索(甚至更好的是,一些有效的示例代碼)可以幫助我做我所追求的事情?
    發表于 07-10 06:00

    G431定時器無法觸發DMA更新DAC值要怎么辦?

    如圖進行初始化配置: DAC配置為TIM2觸發信號觸發DMA配置: 定時器配置: 在初始化后,調用如下函數,啟動DAC與DMA: HAL_DAC_Start( hdac1
    發表于 07-02 06:50
    主站蜘蛛池模板: 91操碰| 国产精品区在线12p 国产精品任我爽爆在线播放6080 | 色香首页| www射射一区| 在线看av网址 | 欧美艹逼视频 | 亚洲国产精品综合久久久 | 色婷婷色99国产综合精品 | 国产综合视频 | 色www永久免费视频 色y情视频免费看 | 亚洲大香伊人蕉在人依线 | 1024手机在线观看视频 | 天天操天天舔天天干 | 色婷婷激情五月 | 成人欧美精品久久久久影院 | 中文字幕久久精品波多野结 | 手机看片国产高清 | 午夜小视频免费观看 | 欧美人与动另类在线 | 欧美顶级xxxxbbbb| 欧美激情综合亚洲五月蜜桃 | 人人操天天射 | 国产精品激情综合久久 | www九色| 轻点灬大ji巴太粗太长了h | 岛国片欧美一级毛片 | 亚洲 欧美 丝袜 制服 在线 | 极品啪啪 | 久久国产精品永久免费网站 | 曰韩欧美 | 色爱区综合激情五月综合激情 | 亚洲国产精品久久网午夜 | 一本到卡二卡三卡视频 | 五月欧美 | 激情五月深爱五月 | 四虎影院永久免费观看 | 久久草精品| 亚洲va久久久噜噜噜久久男同 | www.黄网站 | 尻逼久久 | 国产综合在线观看视频 |