| 
  |||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe  | 
  
關(guān)于arm(LPC2106)的幾點疑惑 | 
  
| 作者:jack_mcu 欄目:ARM技術(shù) | 
今天板子回來了,而軟件也在準(zhǔn)備中,看了幾天的arm的資料,買了本周立功先生的《arm嵌入式基礎(chǔ)教程》,對arm也有了一定的了解。 我用的是LPC2106,在具體編寫軟件的過程中,還是有一點疑惑: 疑惑一:在打開和關(guān)閉中斷部分,我看到startup.s文件定義了i_bit和 f_bit兩個變量,但是就是沒有看到有地方對這兩個變量賦值,看了下uvision的例程,也沒有看到有相關(guān)的賦值操作,想知道是不是arm啟動之后,默認(rèn)中斷是打開的,如果要進(jìn)行中斷的打開和關(guān)閉操作,該怎么進(jìn)行,我生成的startup.s文件如下:(在周先生的教材上,我找到的答案是對CPSR進(jìn)行操作,但是具體到我這個具體的項目,該怎么操作呢?) Mode_USR EQU 0x10 Mode_FIQ EQU 0x11 Mode_IRQ EQU 0x12 Mode_SVC EQU 0x13 Mode_ABT EQU 0x17 Mode_UND EQU 0x1B Mode_SYS EQU 0x1F I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled ;// <h> Stack Configuration (Stack Sizes in Bytes) ;// <o0> Undefined Mode <0x0-0xFFFFFFFF:8> ;// <o1> Supervisor Mode <0x0-0xFFFFFFFF:8> ;// <o2> Abort Mode <0x0-0xFFFFFFFF:8> ;// <o3> FAST Interrupt Mode <0x0-0xFFFFFFFF:8> ;// <o4> Interrupt Mode <0x0-0xFFFFFFFF:8> ;// <o5> User/System Mode <0x0-0xFFFFFFFF:8> ;// </h> UND_Stack_Size EQU 0x00000010 SVC_Stack_Size EQU 0x00000010 ABT_Stack_Size EQU 0x00000010 FIQ_Stack_Size EQU 0x00000200 IRQ_Stack_Size EQU 0x00000200 USR_Stack_Size EQU 0x00000400 Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \ FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size) AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size Stack_Top EQU Stack_Mem + Stack_Size ;// <h> Heap Configuration ;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF> ;// </h> Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 Heap_Mem SPACE Heap_Size ; VPBDIV definitions VPBDIV EQU 0xE01FC100 ; VPBDIV Address ;// <e> VPBDIV Setup ;// <i> Peripheral Bus Clock Rate ;// <o1.0..1> VPBDIV: VPB Clock ;// <0=> VPB Clock = CPU Clock / 4 ;// <1=> VPB Clock = CPU Clock ;// <2=> VPB Clock = CPU Clock / 2 ;// <o1.4..5> XCLKDIV: XCLK Pin ;// <0=> XCLK Pin = CPU Clock / 4 ;// <1=> XCLK Pin = CPU Clock ;// <2=> XCLK Pin = CPU Clock / 2 ;// </e> VPBDIV_SETUP EQU 0 VPBDIV_Val EQU 0x00000000 ; Phase LOCKed Loop (PLL) definitions PLL_BASE EQU 0xE01FC080 ; PLL Base Address PLLCON_OFS EQU 0x00 ; PLL CONTROL Offset PLLCFG_OFS EQU 0x04 ; PLL Configuration Offset PLLSTAT_OFS EQU 0x08 ; PLL Status Offset PLLFEED_OFS EQU 0x0C ; PLL Feed Offset PLLCON_PLLE EQU (1<<0) ; PLL Enable PLLCON_PLLC EQU (1<<1) ; PLL Connect PLLCFG_MSEL EQU (0x1F<<0) ; PLL Multiplier PLLCFG_PSEL EQU (0x03<<5) ; PLL Divider PLLSTAT_PLOCK EQU (1<<10) ; PLL LOCK Status ;// <e> PLL Setup ;// <o1.0..4> MSEL: PLL Multiplier Selection ;// <1-32><#-1> ;// <i> M VALUE ;// <o1.5..6> PSEL: PLL Divider Selection ;// <0=> 1 <1=> 2 <2=> 4 <3=> 8 ;// <i> P VALUE ;// <  | 
  
| 2樓: | >>參與討論 | 
| 作者: jack_mcu 于 2006/9/11 12:29:00 發(fā)布:
         arm(LPC2106)的疑惑 是否需要在啟動代碼中增加以下代碼,以打開FIQ和IRQ中斷: Initialise Interrupt SYSTEM ;增加的打開中斷的代碼 MRS R0,CPSR BIC R0,R0,#0XC0 //將I_BIT和F_BIT賦0 MSR CPSR_c,R0 MOV PC,LR ; Setup Stack for each mode ;... 還有 typedef unsigned CHAR uint8; typedef signed CHAR int8; typedef unsigned int uint16; typedef signed int int16; typedef unsigned LONG uint32; typedef LONG int int32; 不知道對不對? 因為我看到在UC/OS II移植中的程序是這樣寫的: typedef unsigned SHORT INT16U typedef signed SHORT INT16S typedef unsigned int INT32U typedef signed int INT32S 到底哪個正確呢?請高手指教。!  | 
  |
| 3樓: | >>參與討論 | 
| 作者: jack_mcu 于 2006/9/11 14:56:00 發(fā)布:
         疑惑 高手都去了哪里呢?請高手幫我解答一下  | 
  |
| 4樓: | >>參與討論 | 
| 作者: icer1 于 2006/9/12 10:02:00 發(fā)布:
         arm(LPC2106)的疑惑 1。 I_Bit 和 F_Bit不是變量,EQU相當(dāng)于#define,都是定義常量的 2。 開關(guān)中斷就是操作CPSR,為了保險起見,應(yīng)該是讀-修改-寫,zlg的啟動代碼是在軟中斷里面實現(xiàn)開關(guān)中斷操作的。 3。 這條指令可以進(jìn)入未定義模式并且關(guān)irq和fiq MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit 4。 處理器模式的變化有兩種情況: 一、進(jìn)入異常 二、使用MSR修改 復(fù)位時進(jìn)入的是svc模式 5。對arm內(nèi)核來說,有irq 和 fiq兩種用戶中斷,在執(zhí)行irq程序的時候,是可以允許irq中斷的,就是說可以嵌套。 中斷嵌套是用程序來實現(xiàn)的。至于不同的arm芯片有不同的中斷控制器,詳細(xì)的看中斷控制器。 6。arm的堆?梢韵蛏弦部梢韵蛳。不像51只有pop和PUSH,程序里面自己確定方向。 7?芍厝氪a,我知道有個reentrant這個關(guān)鍵字…… 具體的不知  | 
  |
| 5樓: | >>參與討論 | 
| 作者: icer1 于 2006/9/12 10:07:00 發(fā)布:
         arm(LPC2106)的疑惑 ucos里面的代碼都是都是用INT16U等來定義變量的,我們不需要去修改它,所以繼續(xù)用 但是我們可以自己定義: typedef unsigned int uint16; 然后可以自己用uint16來定義變量 沒有對和錯  | 
  |
| 6樓: | >>參與討論 | 
| 作者: jack_mcu 于 2006/9/12 12:33:00 發(fā)布:
         呵呵 看了兩位高手的留言,明白了一些東東,整個系統(tǒng)的初試化是不是這樣做的: 系統(tǒng)啟動... 執(zhí)行startup.s,跳到main函數(shù)... main() { 初試化串口... 串口中斷使能... 初試化IIC接口... IIC中斷使能... 其他外設(shè)的初試化... 其他外設(shè)的中斷使能... 執(zhí)行swi軟件中斷... while(1); } swi軟件中斷函數(shù) { 打開IRQ中斷和FIQ中斷... }  | 
  |
| 7樓: | >>參與討論 | 
| 作者: jack_mcu 于 2006/9/12 17:59:00 發(fā)布:
         自己頂一下 看了下資料,說: MSR CPSR_c, #Mode_USR 這句話的意思是進(jìn)入用戶模式,并打開FIQ和IRQ中斷 呵呵,因此icer1兄解釋的: “這條指令可以進(jìn)入未定義模式并且關(guān)irq和fiq MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit” 是非常正確的 另外,arm復(fù)位之后,是處在管理模式的,執(zhí)行了上述的startup.s文件后進(jìn)入到了user模式,但此時中斷已經(jīng)打開了(就是I_BIT和F_BIT已經(jīng)被賦0了),因此,在C程序中,就可以直接中斷的管理了 呵呵,再頂一下...  | 
  |
  | 
    
 
  | 
  
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 | 
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號  |