ARM Cortex-M3 MCU的I2C&DMA操作被頻繁的中斷打掛了

来源:http://www.cnblogs.com/ironx/archive/2016/02/16/5192120.html
-Advertisement-
Play Games

在項目開發的過程中,發現程式總是死在判斷DMA一次傳輸是否完成這個標誌位上。進一步回退分析,發現是在I2C讀的過程中,有使用到DMA去取外部I2C設備的data。 但是data並沒有讀完,Data為32bits,DMA在讀到18bits時,就出現讀不到data bit了。導致I2C硬體模塊不能進一步


在項目開發的過程中,發現程式總是死在判斷DMA一次傳輸是否完成這個標誌位上。進一步回退分析,發現是在I2C讀的過程中,有使用到DMA去取外部I2C設備的data。

但是data並沒有讀完,Data為32bits,DMA在讀到18bits時,就出現讀不到data bit了。導致I2C硬體模塊不能進一步動作,SCK一直被拉低,沒有clock輸出,SDA也是如此。

下麵是通過示波器抓到的波形:

I2C波形圖

 

在上面的波形圖中,綠色的是SCK,藍色的是SDA。

在第一幅波形圖中,有2段波形,第一段連續的I2C波形,經過確認I2C硬體和DMA配合是正常的。第二段則是有一段I2C波形,然後就SCK和SDA就都被拉低了。

將第一幅圖的第2段波形放大,就是第二副圖看到的情況。可以很明顯的看到SCK輸出有被其他因素打斷。I2C吐出幾個clock,被其他因素打斷了,clock線即SCK被拉低一段時間,然後clock線再繼續吐出幾個clock。

直到I2C被頻繁中斷,clock吐不出來為止,SCK和SDA都被拉低,此時明顯的I2C和DMA的配合過程被其他因素頻繁的干擾打死了。

 

通過示波器抓到的波形驗證了這一點,然後再來分析代碼和串口輸出,發現是外部GPIO一直有中斷輸入,Cortex-M3 MCU頻繁的響應中斷,導致I2C&DMA操作被打掛了。

有什麼辦法來解決這個問題?

方法就是在I2C和DMA操作的過程開始處關閉所有中斷,而在操作結束的時候重新打開中斷,以免I2C&DMA操作被其他中斷打斷。

ARM MDK編譯環境自帶的編譯器ARMCC,含有內置的c函數,可供操作中斷用:

__enable_irq();

__disable_irq();

不過debug發現這兩個函數只會在privileged mode使用。也就是說需要Cortex-M3 MCU先進入privileged mode,才能調用這兩個函數。

 

用什麼方法讓MCU從user mode切換到privileged mode呢,exception handler!

可以用SVC啦,軟體可以利用SVC製造一個exception,然後在exception handler中利用MCU的privileged mode來完成自己的任務。有點類似於linux裡面的系統調用。

SVC exception可以調用SVC函數,而SVC函數可以傳入參數,也可以返回參數。轉為系統調用而設計。

舉個例子,用戶程式調用read()這個系統調用,read()會引發SVC exception,進而調用SVC函數,read()函數的參數傳遞給SVC函數,SVC在內核態執行硬體動作,並將SVC函數的返回結果,作為read()函數的返回,返回給用戶程式。當然linux裡面並不一定是SVC,這裡只是做個類比。

也就是說SVC可以完成從用戶態到內核態的轉變,不讓用戶直接操作硬體。用戶只需要記住系統調用API的名字和函數即可,而不用管硬體的具體實現。

 

所以這裡我們就把I2C讀的操作放在一個SVC函數裡面去實現,並且在SVC函數的開始處調用__disable_irq();在函數的結束處,調用__enable_irq()。

 

經過驗證,I2C&DMA操作再也不會被中斷打斷了。

 

參考資料:

  1. http://www.keil.com/pack/doc/cmsis/Core/html/group___core___register__gr.html#details
  2. cortex-M3權威指南

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 現象:某個架構始終不能更新 VS中使用SSDT很方便,進行架構比對時,可以選擇性的更新。但在排除操作上,要相當謹慎。往往排除的並不是一個差異項。 如下圖,表或視圖的差異,如果有多處,可以選擇某個差異排除,也可以基於整表排除。以此類推,如果上面的"架構"也選擇了整體排除,結果是災難的,整個架構都不能更...
  • SQL Server代理是所有實時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。 如我們在這個系列的前幾篇文章所見,SQL Server代理是由一系列的作業步驟組成,每個步驟是不同類型將要進行的工作。如果你在第4篇所見,SQ
  • 一、$type操作符 $type操作符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。 MongoDB 中可以使用的類型如下表所示: 類型數字備註 Double 1 String 2 Object 3 Array 4 Binary data 5 Undefined 6 已廢棄。 Objec
  • 基本信息:節點一:ip:192.168.8.166 主機名:hadrtest01節點二:ip:192.168.8.250 主機名:hadrtest02 1、兩節點分別安裝rsh,rsh-server包是否已經安裝 yum -y install rsh rsh-server 2、修改/etc/xine
  • 本文轉載自:http://www.ibm.com/developerworks/cn/linux/1407_liuming_init1/index.html (本人學習使用添加了個人成分) 近年來,Linux 系統的 init 進程經歷了兩次重大的演進,傳統的 sysvinit 已經淡出歷史舞臺,新
  • 下麵貼出的是centos6.5 /etc/rc.sysinit文件內容 #!/bin/bash # # /etc/rc.d/rc.sysinit - run once at boot time # # Taken in part from Miquel van Smoorenburg's bchec
  • 在CentOS 6.5上安裝python2.7
  • linux與Windows共用文件配置: 1.進入超級用戶:$su root 2.啟動tftp伺服器:#netstat -a | grep tftp,出現如圖所示的消息表示tftp伺服器已安裝成功; 3.安裝NFS伺服器: #rpm –q nfs-utils,如果有下圖的信息出現說明已經安裝: 4.
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...