chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

茶話MCU ? 來源:ST MCU 信息交流 ? 2020-05-14 09:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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


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

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

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

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

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

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

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

這里準(zhǔn)備了幾個內(nèi)存變量.

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

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

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

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

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

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

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

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

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

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

我們不妨先理一理:

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

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

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

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

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

難道說這個清除EOC標(biāo)志的操作有問題?

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

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

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

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

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

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

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

到此,本應(yīng)用案例分享結(jié)束。最后,稍作小結(jié)并做些提醒:

1、針對STM32定時器的軟件復(fù)位操作可以產(chǎn)生更新事件,其效果等同于定時器溢出導(dǎo)致的更新事件。

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

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

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

    關(guān)注

    100

    文章

    6863

    瀏覽量

    552733
  • STM32
    +關(guān)注

    關(guān)注

    2301

    文章

    11096

    瀏覽量

    369966
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3350

    瀏覽量

    121260

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    NVMe高速傳輸擺脫XDMA設(shè)計29: TLP 請求處理流程

    當(dāng)請求類型為 MEM 讀寫請求時使用地址路由的方式。 如果請求地址在此設(shè)備 BAR 空間內(nèi), 則對 BAR 空間進(jìn)行讀寫操作,讀操作將生成 CplD, 從對應(yīng)請求端口的輸出端口發(fā)出;
    的頭像 發(fā)表于 09-23 09:05 ?317次閱讀
    NVMe高速傳輸<b class='flag-5'>之</b>擺脫XDMA設(shè)計29: TLP <b class='flag-5'>請求</b>處理流程

    NVMe高速傳輸擺脫XDMA設(shè)計18:PCIe請求模塊設(shè)計(上)

    請求模塊的具體任務(wù)是將系統(tǒng)的請求轉(zhuǎn)換成為axis接口形式的TLP或配置管理接口信號。這些請求主要包含初始化配置請求和門鈴寫請求,初始化配置
    的頭像 發(fā)表于 08-09 14:52 ?4155次閱讀
    NVMe高速傳輸<b class='flag-5'>之</b>擺脫XDMA設(shè)計18:PCIe<b class='flag-5'>請求</b>模塊設(shè)計(上)

    NVMe高速傳輸擺脫XDMA設(shè)計13:PCIe請求模塊設(shè)計(下)

    在接收到請求總線接口的請求事務(wù)后,當(dāng)請求類型的值為0時,表示通過PCIE硬核的配置管理接口發(fā)送請求,由于請求接口的接口和時序與配置管理接口基
    的頭像 發(fā)表于 08-04 16:35 ?303次閱讀
    NVMe高速傳輸<b class='flag-5'>之</b>擺脫XDMA設(shè)計13:PCIe<b class='flag-5'>請求</b>模塊設(shè)計(下)

    NVMe高速傳輸擺脫XDMA設(shè)計12:PCIe請求模塊設(shè)計(上)

    請求模塊負(fù)責(zé)將系統(tǒng)請求轉(zhuǎn)換為AXIS接口的TLP信號或配置管理接口信號,處理初始化配置請求和門鈴寫請求。初始化請求根據(jù)總線號選擇Cfg_mg
    的頭像 發(fā)表于 08-04 09:52 ?465次閱讀
    NVMe高速傳輸<b class='flag-5'>之</b>擺脫XDMA設(shè)計<b class='flag-5'>之</b>12:PCIe<b class='flag-5'>請求</b>模塊設(shè)計(上)

    STM32F405RGT6 ADC2+TIM4觸發(fā)+DMA(DMA2_Stream2_CH1)+DMA中斷會死機(jī),怎么解決?

    ADC1+TIM4觸發(fā)+DMA(DMA2_Stream0_CH0)+DMA中斷完全正常更改為ADC2+TIM4觸發(fā)+
    發(fā)表于 08-04 07:16

    無法配置 ADC1 來觸發(fā) DMA 傳輸,怎么解決?

    啟動。 您能幫我設(shè)置 DMA 通道的觸發(fā)源嗎? 此外,我在 ADC1 章節(jié)中讀到以下聲明: [i]比較通道有 8 個事件(CMPUPx 和 CMPLOx),可以請求 DMA,參見圖 1
    發(fā)表于 07-21 06:57

    harmony-utilsCrashUtil,異常相關(guān)工具類

    harmony-utilsCrashUtil,異常相關(guān)工具類
    的頭像 發(fā)表于 07-04 16:33 ?257次閱讀

    NVMe IP高速傳輸卻不依賴XDMA設(shè)計五:DMA 控制單元設(shè)計

    寄存器組包含 DMA 操作寄存器、 DMA 長度寄存器、 DMA 源目的地址寄存器和 DMA 狀態(tài)寄存器。 DMA 操作寄存器定義了
    發(fā)表于 07-02 19:45

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

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

    如何使用EXIT0來觸發(fā)DMA實(shí)現(xiàn)SPI發(fā)送數(shù)據(jù)?

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

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

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

    STM32使用外部中斷觸發(fā)ADC采樣DMA搬運(yùn)出現(xiàn)兩次進(jìn)入DMA中斷的異常情況,怎么解決?

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

    CKS32F107xx系列的DMA控制器簡介

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

    雅特力AT32F402/F405 DMA使用指南

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

    DMA是什么?詳細(xì)介紹

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