資料介紹
在項目開發(fā)的過程中,發(fā)現(xiàn)程序總是死在判斷DMA一次傳輸是否完成這個標志位上。進一步回退分析,發(fā)現(xiàn)是在I2C讀的過程中,有使用到DMA去取外部I2C設備的data。
但是data并沒有讀完,Data為32bits,DMA在讀到18bits時,就出現(xiàn)讀不到data bit了。導致I2C硬件模塊不能進一步動作,SCK一直被拉低,沒有clock輸出,SDA也是如此。
下面是通過示波器抓到的波形:
在上面的波形圖中,綠色的是SCK,藍色的是SDA。
在第一幅波形圖中,有2段波形,第一段連續(xù)的I2C波形,經(jīng)過確認I2C硬件和DMA配合是正常的。第二段則是有一段I2C波形,然后就SCK和SDA就都被拉低了。
將第一幅圖的第2段波形放大,就是第二副圖看到的情況??梢院苊黠@的看到SCK輸出有被其他因素打斷。I2C吐出幾個clock,被其他因素打斷了,clock線即SCK被拉低一段時間,然后clock線再繼續(xù)吐出幾個clock。
直到I2C被頻繁中斷,clock吐不出來為止,SCK和SDA都被拉低,此時明顯的I2C和DMA的配合過程被其他因素頻繁的干擾打死了。
通過示波器抓到的波形驗證了這一點,然后再來分析代碼和串口輸出,發(fā)現(xiàn)是外部GPIO一直有中斷輸入,Cortex-M3 MCU頻繁的響應中斷,導致I2C&DMA操作被打掛了。
有什么辦法來解決這個問題?
方法就是在I2C和DMA操作的過程開始處關閉所有中斷,而在操作結束的時候重新打開中斷,以免I2C&DMA操作被其他中斷打斷。
ARM MDK編譯環(huán)境自帶的編譯器ARMCC,含有內置的c函數(shù),可供操作中斷用:
__enable_irq();
__disable_irq();
不過debug發(fā)現(xiàn)這兩個函數(shù)只會在privileged mode使用。也就是說需要Cortex-M3 MCU先進入privileged mode,才能調用這兩個函數(shù)。
用什么方法讓MCU從user mode切換到privileged mode呢?
exception handler!
可以用SVC啦,軟件可以利用SVC制造一個exception,然后在exception handler中利用MCU的privileged mode來完成自己的任務。有點類似于linux里面的系統(tǒng)調用。
SVC exception可以調用SVC函數(shù),而SVC函數(shù)可以傳入參數(shù),也可以返回參數(shù)。轉為系統(tǒng)調用而設計。
舉個例子,用戶程序調用read()這個系統(tǒng)調用,read()會引發(fā)SVC exception,進而調用SVC函數(shù),read()函數(shù)的參數(shù)傳遞給SVC函數(shù),SVC在內核態(tài)執(zhí)行硬件動作,并將SVC函數(shù)的返回結果,作為read()函數(shù)的返回,返回給用戶程序。當然linux里面并不一定是SVC,這里只是做個類比。
也就是說SVC可以完成從用戶態(tài)到內核態(tài)的轉變,不讓用戶直接操作硬件。用戶只需要記住系統(tǒng)調用API的名字和函數(shù)即可,而不用管硬件的具體實現(xiàn)。
所以這里我們就把I2C讀的操作放在一個SVC函數(shù)里面去實現(xiàn),并且在SVC函數(shù)的開始處調用__disable_irq();在函數(shù)的結束處,調用__enable_irq()。
經(jīng)過驗證,I2C&DMA操作再也不會被中斷打斷了。
參考資料:
1、
2、cortex-M3權威指南
文章來源:(mbbeetchina)
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 集成電源管理的超低功耗ARM Cortex-M3 MCU數(shù)據(jù)手冊
- GD32F10x Arm Cortex-M3 32-bit MCU用戶手冊
- TI M4(Cortex M4) MCU DMA 操作
- ARM Cortex-M3系統(tǒng)設計與實現(xiàn)
- Cortex-M3處理器內核與基于Cortex-M3的MCU關系
- Cortex-M3工作模式、異常與中斷介紹資料下載
- 關于Cortex-M3的中斷優(yōu)先級描述資料下載
- ARM cortex-M3 異常處理分析資料下載
- Cortex-M3的異常和中斷資料下載
- 《ARM Cortex-M3權威指南》筆記資料下載
- ARM Cortex-M3/M4微控制器最大效率設計三秘訣資料下載
- ARM Cortex-M3系列GPIO口介紹資料下載
- ARM Cortex-M3內核微控制器與ARM7的區(qū)別資料下載
- Cortex-M3 NVIC與中斷控制資料下載
- Cortex-M3操作指南 3次下載
- 強大的Arm? Cortex?-M3內核(下) 1285次閱讀
- Cortex-M3中斷優(yōu)先級的相關知識 2797次閱讀
- 基于FPGA搭建ARM Cortex-M3 SoC軟核 2634次閱讀
- 如何定制一顆ARM Cortex-M3 SoC軟核 2292次閱讀
- 如何操作I2C去顯示oled屏幕 5722次閱讀
- 開源軟件opencores I2C master控制器控制I2C接口操作原理 7195次閱讀
- 米爾科技ARM Cortex-M3教程指南 2872次閱讀
- Cypress MB9B520M 32位ARM MCU開發(fā)方案 2123次閱讀
- Cortex-M3處理器中斷和FreeRTOS中斷優(yōu)先級配置 7136次閱讀
- ARM Cortex-M3 MCU的I2C和DMA操作被中斷打斷的解決方法 8496次閱讀
- STM32的Cortex-M3中斷異常處理 8313次閱讀
- 基于使用STM8單片機I2C方式實現(xiàn)讀寫操作 1.1w次閱讀
- 《振南電子STM32視頻教程》第八講:I2C總線 1119次閱讀
- 采用ARM Cortex-M3的USB熱電偶溫度測量系統(tǒng)電路圖 3933次閱讀
- 采用Cortex-M3的12位4-20mA環(huán)路供電型熱電偶測量系統(tǒng) 2624次閱讀
下載排行
本周
- 1索尼333ESL電路圖資料
- 10.11 MB | 2次下載 | 免費
- 2TINA-TI 模擬電路設計、仿真和分析軟件中文教程
- 3.83 MB | 0次下載 | 5 積分
- 3SS6548D40V 直流有刷電機驅動芯片中文資料
- 1.55 MB | 次下載 | 1 積分
- 4SS6235M 4A 33V性價比超高電機驅動芯片中文資料
- 1.26 MB | 次下載 | 免費
- 5FP7195-中文應用說明書
- 0.93 MB | 次下載 | 免費
- 6VSA101-G250T01-I 電壓傳感器產(chǎn)品使用手冊
- 0.72 MB | 次下載 | 免費
- 7FS4056E系列單節(jié)線線充電IC
- 2.41 MB | 次下載 | 免費
- 8FS5281E(5V USB輸入雙節(jié)鋰電池串聯(lián)應用升壓充電管理IC)
- 3.30 MB | 次下載 | 免費
本月
- 148V到5KW無橋LLC雙向逆變器的電路原理圖免費下載
- 0.26 MB | 157次下載 | 10 積分
- 22KW逆變側功率管的損耗如何進行計算詳細公式免費下載
- 0.40 MB | 33次下載 | 2 積分
- 3高功率密度碳化硅MOSFET軟開關三相逆變器損耗分析
- 2.27 MB | 33次下載 | 5 積分
- 4STM32F10x參考手冊資料
- 13.64 MB | 12次下載 | 1 積分
- 5光伏并網(wǎng)逆變器原理
- 7.31 MB | 7次下載 | 2 積分
- 6SW5099規(guī)格書
- 1.37 MB | 6次下載 | 1 積分
- 7星火6J3-1交直流二波段收音機電路圖資料
- 1.86 MB | 6次下載 | 免費
- 8S7-200 可編程序控制器系統(tǒng)手冊
- 12.81 MB | 5次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935134次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191422次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183352次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81600次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73818次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App






創(chuàng)作
發(fā)文章
發(fā)帖
提問
發(fā)資料
發(fā)視頻
上傳資料賺積分
評論