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

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

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

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

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

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

STM32用戶開(kāi)發(fā)產(chǎn)品,用到ADC模塊,通過(guò)定時(shí)器更新事件觸發(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)用代碼對(duì)該標(biāo)志進(jìn)行監(jiān)視。

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

因?yàn)闆](méi)見(jiàn)到用戶具體的代碼,他說(shuō)過(guò)在DMA做完第一次傳輸后,還對(duì)定時(shí)器做了復(fù)位。那我們不妨在第一次DMA傳輸結(jié)束后,增加對(duì)定時(shí)器的復(fù)位操作,看看結(jié)果會(huì)怎么樣。

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

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

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

我們不妨先理一理:

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

看起來(lái)的確有點(diǎn)奇怪,怎么感覺(jué)有個(gè)DMA請(qǐng)求,用客戶的話說(shuō),好像潛伏在哪里一樣?

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

因?yàn)檐浖绞綄?duì)定時(shí)器進(jìn)行復(fù)位也可以產(chǎn)生更新事件,它正好能啟動(dòng)AD轉(zhuǎn)換【AD轉(zhuǎn)換功能一直都沒(méi)關(guān)閉過(guò)】從而產(chǎn)生EOC事件。如果EOC標(biāo)志沒(méi)有及時(shí)清除的話,就可以在下次DMA傳輸剛被使能,即使計(jì)數(shù)器還沒(méi)被啟動(dòng)的條件下觸發(fā)一次DMA傳輸。

分析到這里,感覺(jué)找到問(wèn)題原因了。但是,似乎還是有點(diǎn)不對(duì)勁。因?yàn)榧词苟〞r(shí)器復(fù)位動(dòng)作產(chǎn)生更新事件而觸發(fā)ADC轉(zhuǎn)換,進(jìn)而產(chǎn)生EOC事件, 但我們?cè)诙〞r(shí)器復(fù)位動(dòng)作之后還特意做過(guò)對(duì)EOC標(biāo)志的清除?!鞠聢D中的第二個(gè)紅圈內(nèi)的代碼】

難道說(shuō)這個(gè)清除EOC標(biāo)志的操作有問(wèn)題?

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

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

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

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

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

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

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

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

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

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

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

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

    關(guān)注

    99

    文章

    6533

    瀏覽量

    545537
  • STM32
    +關(guān)注

    關(guān)注

    2271

    文章

    10923

    瀏覽量

    357247
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3255

    瀏覽量

    115237

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    雅特力AT32F402/F405 DMA使用指南

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

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

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

    求助,關(guān)于STM32G473 TIM8 DMA burst模式問(wèn)題求解

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

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

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

    請(qǐng)問(wèn)STM32L4R5ZI的DMA/DMAMUX是怎么管理請(qǐng)求

    原來(lái)的STM32系列,比如F1,是沒(méi)有DMAMUX這個(gè)東西的,DMA1的1通道2通道具體對(duì)應(yīng)什么樣的請(qǐng)求,有一個(gè)專門的對(duì)應(yīng)表。但是現(xiàn)在的DMAMUX加進(jìn)來(lái)以后,對(duì)于89個(gè)外設(shè)請(qǐng)求,并沒(méi)有地方說(shuō)明什么
    發(fā)表于 04-28 06:19

    求助,STM32F030 ADC_CFGR1中DMACFG的使用問(wèn)題求解

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

    定時(shí)器TIM2輸出TRGO信號(hào),DMA使用DMA_REQUEST_TIM2_UP請(qǐng)求可以實(shí)現(xiàn)嗎?

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

    請(qǐng)問(wèn)STM32F030K6T6使用DMA的one shot模式采樣AD如何再次啟動(dòng)?

    我想通過(guò)DMA采集ADC數(shù)據(jù),使用的芯片具體型號(hào)是STM32F030K6T6,發(fā)現(xiàn)DMA有one shot mode和circular mode。若使用one shot mode則只能觸發(fā)一次
    發(fā)表于 04-10 06:54

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

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

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

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

    STM32U575定時(shí)器PWM觸發(fā)DMA搬運(yùn)內(nèi)存時(shí),為什么程序在DMA中斷里出不來(lái)?

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

    DMA Request不是DMA觸發(fā)源嗎?為什么沒(méi)反應(yīng)?

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

    雅特力AT32F423 DMA使用指南

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

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

    我正在做一個(gè)項(xiàng)目,在這個(gè)項(xiàng)目中,我必須在 DMA 模式下通過(guò) SPI 定期傳輸數(shù)據(jù)。 為了避免 CPU 干預(yù),我想使用計(jì)時(shí)器觸發(fā)觸發(fā) SPI DMA 傳輸。 請(qǐng)為此提供建議。
    發(fā)表于 01-30 08:08
    主站蜘蛛池模板: 日韩美a一级毛片 | 中文字幕一区在线观看视频 | 欧美在线视频一区二区三区 | 大学生毛片 | 亚1洲二区三区四区免费 | 日本黄大片在线观看 | 天天狠狠弄夜夜狠狠躁·太爽了 | 西西午夜影院 | 欧美一级欧美三级 | 日本黄色免费网址 | 亚洲欧美高清在线 | 五月天婷婷一区二区三区久久 | 四虎国产精品永久在线看 | 国产精品片 | 日本大片在线看 | 午夜三级毛片 | 亚洲男人天堂岛 | 久久久久国产一级毛片高清板 | 美女被网站免费看九色视频 | 午夜想想爱午夜剧场 | 国产香蕉一区二区精品视频 | 激情五月婷婷综合 | 好男人www社区影视在线 | 色戒真做gif动图 | 色天天天天 | 在线成人免费 | 国产成人综合网 | 免费在线观看一区二区 | 潘金莲国产三级视频在线 | 五月丁香啪啪 | 久久精品国产夜色 | 国产精品美女一区二区三区 | 深夜免费视频 | 特级黄色免费片 | 亚洲天堂免费 | 他也色在线视频 | 立即播放免费毛片一级 | 一级特色黄色片 | 伊人久久综合网站 | 2017天天天天做夜夜夜做 | 五月天停婷基地 |