資料介紹
在項目開發(fā)的過程中,發(fā)現(xiàn)程序總是死在判斷DMA一次傳輸是否完成這個標(biāo)志位上。進(jìn)一步回退分析,發(fā)現(xiàn)是在I2C讀的過程中,有使用到DMA去取外部I2C設(shè)備的data。
但是data并沒有讀完,Data為32bits,DMA在讀到18bits時,就出現(xiàn)讀不到data bit了。導(dǎo)致I2C硬件模塊不能進(jìn)一步動作,SCK一直被拉低,沒有clock輸出,SDA也是如此。
下面是通過示波器抓到的波形:
在上面的波形圖中,綠色的是SCK,藍(lán)色的是SDA。
在第一幅波形圖中,有2段波形,第一段連續(xù)的I2C波形,經(jīng)過確認(rèn)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頻繁的響應(yīng)中斷,導(dǎo)致I2C&DMA操作被打掛了。
有什么辦法來解決這個問題?
方法就是在I2C和DMA操作的過程開始處關(guān)閉所有中斷,而在操作結(jié)束的時候重新打開中斷,以免I2C&DMA操作被其他中斷打斷。
ARM MDK編譯環(huán)境自帶的編譯器ARMCC,含有內(nèi)置的c函數(shù),可供操作中斷用:
__enable_irq();
__disable_irq();
不過debug發(fā)現(xiàn)這兩個函數(shù)只會在privileged mode使用。也就是說需要Cortex-M3 MCU先進(jìn)入privileged mode,才能調(diào)用這兩個函數(shù)。
用什么方法讓MCU從user mode切換到privileged mode呢?
exception handler!
可以用SVC啦,軟件可以利用SVC制造一個exception,然后在exception handler中利用MCU的privileged mode來完成自己的任務(wù)。有點類似于linux里面的系統(tǒng)調(diào)用。
SVC exception可以調(diào)用SVC函數(shù),而SVC函數(shù)可以傳入參數(shù),也可以返回參數(shù)。轉(zhuǎn)為系統(tǒng)調(diào)用而設(shè)計。
舉個例子,用戶程序調(diào)用read()這個系統(tǒng)調(diào)用,read()會引發(fā)SVC exception,進(jìn)而調(diào)用SVC函數(shù),read()函數(shù)的參數(shù)傳遞給SVC函數(shù),SVC在內(nèi)核態(tài)執(zhí)行硬件動作,并將SVC函數(shù)的返回結(jié)果,作為read()函數(shù)的返回,返回給用戶程序。當(dāng)然linux里面并不一定是SVC,這里只是做個類比。
也就是說SVC可以完成從用戶態(tài)到內(nèi)核態(tài)的轉(zhuǎn)變,不讓用戶直接操作硬件。用戶只需要記住系統(tǒng)調(diào)用API的名字和函數(shù)即可,而不用管硬件的具體實現(xiàn)。
所以這里我們就把I2C讀的操作放在一個SVC函數(shù)里面去實現(xiàn),并且在SVC函數(shù)的開始處調(diào)用__disable_irq();在函數(shù)的結(jié)束處,調(diào)用__enable_irq()。
經(jīng)過驗證,I2C&DMA操作再也不會被中斷打斷了。
參考資料:
1、
2、cortex-M3權(quán)威指南
文章來源:(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)設(shè)計與實現(xiàn)
- Cortex-M3處理器內(nèi)核與基于Cortex-M3的MCU關(guān)系
- Cortex-M3工作模式、異常與中斷介紹資料下載
- 關(guān)于Cortex-M3的中斷優(yōu)先級描述資料下載
- ARM cortex-M3 異常處理分析資料下載
- Cortex-M3的異常和中斷資料下載
- 《ARM Cortex-M3權(quán)威指南》筆記資料下載
- ARM Cortex-M3/M4微控制器最大效率設(shè)計三秘訣資料下載
- ARM Cortex-M3系列GPIO口介紹資料下載
- ARM Cortex-M3內(nèi)核微控制器與ARM7的區(qū)別資料下載
- Cortex-M3 NVIC與中斷控制資料下載
- Cortex-M3操作指南 3次下載
- 強(qiáng)大的Arm? Cortex?-M3內(nèi)核(下) 1285次閱讀
- Cortex-M3中斷優(yōu)先級的相關(guān)知識 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單片機(jī)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次閱讀
下載排行
本周
- 1PC2596 40V 輸入 150KHz 3A 降壓型電源轉(zhuǎn)換器數(shù)據(jù)手冊
- 2.44 MB | 3次下載 | 免費(fèi)
- 2臺式主板DDR5內(nèi)存插槽引腳功能表資料
- 0.17 MB | 2次下載 | 5 積分
- 3高壓LED線性驅(qū)動芯片NU517應(yīng)用規(guī)格書
- 0.61 MB | 2次下載 | 免費(fèi)
- 4ZYNALOG徴格半導(dǎo)體|ZGAD125S14技術(shù)參數(shù)書
- 982.53 KB | 2次下載 | 免費(fèi)
- 5SM9001電磁爐IGBT驅(qū)動芯片應(yīng)用原理圖資料
- 0.12 MB | 2次下載 | 1 積分
- 6BK4802P 玩具無線對講/遙控 IC數(shù)據(jù)手冊
- 1.81 MB | 1次下載 | 2 積分
- 7SE10F10B5.0UA 低電容ESD二極管
- 199.49 KB | 1次下載 | 免費(fèi)
- 8電阻元件\電感元件\電容元件知識大全
- 4.67 MB | 1次下載 | 5 積分
本月
- 1常用電子元器件集錦
- 1.72 MB | 24495次下載 | 免費(fèi)
- 2三相逆變主電路的原理圖和PCB資料合集免費(fèi)下載
- 27.35 MB | 111次下載 | 1 積分
- 3蘋果iphone 11電路原理圖
- 4.98 MB | 17次下載 | 5 積分
- 4運(yùn)算放大器基本電路中文資料
- 1.30 MB | 16次下載 | 免費(fèi)
- 5常用電子元器件介紹
- 3.21 MB | 13次下載 | 免費(fèi)
- 6PC2456高壓浪涌抑制器控制器數(shù)據(jù)手冊
- 3.03 MB | 13次下載 | 免費(fèi)
- 7PC2464具理想二極管的浪涌抑制控制器數(shù)據(jù)手冊
- 4.42 MB | 8次下載 | 免費(fèi)
- 8PC2466高電壓浪涌抑制器數(shù)據(jù)手冊
- 3.37 MB | 8次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935132次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191401次下載 | 10 積分
- 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183345次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81591次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73816次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65990次下載 | 10 積分
評論