<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關 閉

          新聞中心

          EEPW首頁 > 工控自動化 > 設計應用 > STM32中采用DMA實現(xiàn)方波的產生和捕獲

          STM32中采用DMA實現(xiàn)方波的產生和捕獲

          作者: 時間:2011-11-05 來源:網絡 收藏

          4 +TIMx多路
          假設有一個需要記錄并分析。一種方案是設置CPU引腳在上升沿和下降沿中斷,然后在中斷中記錄該時刻。這種處理方式的實時性和效率會差一些,因為進出中斷本身就需要一定的指令周期(Cortex-M3為12+12或6+12個系統(tǒng)周期),而且需要考慮多個中斷同時發(fā)生的最壞情況,對可檢測的最大頻率有一定的限制。另一種方案是輪詢的方式不斷查詢該引腳的狀態(tài)并記錄上升沿和下降沿的時刻,這種方式下系統(tǒng)幾乎不能處理其他的任務了。
          +TIMx的方式來上升沿和下降沿時刻,有利于提高系統(tǒng)的實時性和執(zhí)行效率。通過TIMx的功能將方波的電平跳變時刻記錄在比較/捕獲寄存器中,然后將該值自動傳輸?shù)絻却?,只有當DMA觸發(fā)半滿或全滿事件時CPU才需要進入中斷處理數(shù)據。通過記錄方波的上升沿和下降沿時刻,然后將兩個時刻相減,進而就能得到所有低沿和高沿的寬度,最后進行后續(xù)的分析處理。這種方式下中斷頻率僅為方波頻率的4/N(N為緩沖區(qū)大小)。
          圖1為TIMx工作在捕獲模式下一個通道的示意圖。

          本文引用地址:http://www.ex-cimer.com/article/161424.htm

          d.jpg


          其中TI1為CPU引腳的輸入,經過濾波(新的電平必須保持一定時間才認為有效,以防止高頻噪聲的干擾)后進入后繼的邊沿極性選擇,最后經過分頻作為捕獲信號的輸入。這里TI2F為相鄰通道經過濾波后的信號,也就是說一個引腳的信號可作為TIMx兩個通道的輸入捕獲信號,這樣信號只需要接一個CPU引腳就可以觸發(fā)兩個時鐘通道了。
          將輸入方波接到CPU一個引腳上,假設該引腳對應于圖上的TI1,設定其在下降沿觸發(fā)通道1的捕獲事件,而其在上升沿觸發(fā)通道2的捕獲事件,事件發(fā)生后申請DMA將捕獲的比較/捕獲寄存器的值保存起來。示例代碼如下:
          c.jpg
          其他部分與第3節(jié)中比較輸出的代碼基本一致。

          5 總結
          測試中系列微控制器工作在36 MHz,可出1路最高1.5 MHz的方波,可捕獲1 MHz的方波,而此時CPU的執(zhí)行幾乎不受影響。這里采用DMA來方波的和捕獲,極大地提高了系統(tǒng)的實時性和執(zhí)行效率,減少了中斷次數(shù),節(jié)省了寶貴的資源。這種方案也可以用來高效的模擬串口。
          DMA的傳輸需要多個系統(tǒng)周期的,例如采用DMA實現(xiàn)內存到內存的搬移,每次傳輸需要5個系統(tǒng)周期,而內存到外圍的一次傳輸需要2個APB周期+5個AHB周期。這樣用上述方法的方波最小沿(低沿或高沿)為14個周期(包括比較/捕獲寄存器到內部影子寄存器的傳輸?shù)?。若有更高的需求,應考慮其他的實現(xiàn)方案。另外,若有多個DMA同時工作,應考慮最壞情況下DMA的響應時間,以避免錯誤發(fā)生。

          塵埃粒子計數(shù)器相關文章:塵埃粒子計數(shù)器原理

          上一頁 1 2 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();