<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        中斷向量表放在片內RAM中

        作者:未知   來源:布冬冬 的空間   點擊數:  更新時間:2014年08月16日   【字體:

        總結一下,前段時間的工作學習算是取得一個階段性的成功了。

        下面分別總結一下:

        1. 中斷向量表不發生重映射,還是放在片內ROM中。用戶代碼放在片內ROM中(加了TIMER0的中斷)。

        2. 中斷向量表不發生重映射,還是在片內ROM中。用戶代碼放在片外SDRAM中(加了TIMER0的中斷)。

        3. 中斷向量表發生重映射,重映射的地址為0x20004000.用戶代碼放在片內ROM中(加了TIMER0的中斷)。

        4. 中斷向量表發生重映射,重映射的地址為0x20004000.用戶代碼放在片外SDRAM中(加了TIMER0的中斷)。

         

        首先,先記錄一下定時器0產生中斷的機制和相關代碼。

        (1)定時器0、2、3的功能是差不多的。定時器可以分為定時器和計數器兩種,由寄存器CTCR決定哪種工作模式。

        a. 作為定時器的時候,輸入為PCLK。有預分頻和PR和定時器計數器TC,還有PC是預分頻的指針。

        b. 作為計數器的時候,可以選擇CAP輸入的上升沿,下降沿,以及上升沿和下降沿作為輸入。CAP可以選擇CAPn.0和CAPn.1.也就是可以選擇外部時鐘計數。但是外部計數的最大頻率<(Fpclk/2)。

        (2)匹配控制寄存器TnMCR,可以選擇匹配時產生中斷,匹配時將TC復位,匹配時將使TC和PC停止,TCR位0清零。外部匹配寄存器TnEMR,可以選擇不執行任何動作,匹配輸出設置為0,匹配輸出設置為1,匹配輸出電平翻轉。

        (3)當定時器/計數器運行時,在捕獲引腳上,出現有效外部觸發動作,此時定時器計數器的當前值保存到指定捕獲寄存器中T(0~3)CRn。捕獲控制寄存器TnCCR可以選擇CAPn.0(1/2/3)上升沿捕獲,下降沿捕獲,事件中斷。

        當定時器0定時到60ms之后,產生一個中斷,并且開NVIC中斷嵌套,使向量表中的響應中斷。

           *(INT8U*) PCONP |= 0x01<<1; //power on timer0
           *(INT8U*) T0TCR = 2;//counter reset
           *(INT32U*) T0IR = 0x0<<0;//clear interrupt
           *(INT32U*) T0CTCR = 0;//Timer Mode
           *(INT32U*) T0PR = 9;//PR
           *(INT32U*) T0TC = 0;//Timer Counter
           *(INT32U*) T0MR0 = ( msec*60*1000)/(*(INT32U*)T0PR+1);//TC
           *(INT32U*) T0MCR = 1;//Interrupt on MR0
           *(INT32U*) ISER0 |= 0x1<<1; //NVIC
           *(INT8U*) T0TCR = 1;//enable TIMER0

        要注意幾點吧:1. 等全部設置好了,再enable TIMER0.2.要想有中斷響應,必須開NVIC的中斷。3.之前要先清中斷。定時器差不多介紹完了。

         

        其次,中斷向量表的重映射問題。

        如果要實現中斷向量表的重映射問題,就要對VTOR寄存器進行設置。這里做的是重映射到0x20004000.好像設置VTOR寄存器與中斷向量拷貝并沒有一定的先后順序。

        Q:這里就有一個疑問:VTOR的范圍為0x00000080-0x3FFFFF80的范圍,但是當我將VTOR設置為0x30000000的時候,是沒有問題的。問題是將中斷向量表拷貝到0x30000000的時候,是無法復制的。0x30000000這個區域在內存映射中是reserved。

             SCB->VTOR = 0x20004000;

        TIMER0_IRQHandler

            LDR   R15, = TIMER0;這是將用戶代碼放置到ROM中,如果代碼已經放置到SDRAM,且要在SDRAM中運行的話,必須修改如下:

                LDR  R0, =0xA0000000
                LDR  R1, =TIMER0
                ADD  R0,R0,R1
                MOV  R15, R0  

        TIMER0的程序為熄滅一個LED燈。

        void TIMER0()
        {
          *(INT32U*) T0IR = 0x1<<0;
          *(INT32U*) P4_22_IO = 0x00000021;
        }

        向量表拷貝匯編代碼:

        five
                LDR    R0, =0x00000000
                LDR    R2, =0x20004000
                LDR    R3, =0x20004400
        four 
                LDM    R0!,{R4-R7}
                STM    R2!,{R4-R7}
                CMP    R2,R3
                BCC    four
                BX     R14 ;;;匯編時,如果BLX,BX過去的程序時C程序的話,則不用加返回指令,如果是匯編的

        ;話,就要BX R14

        Q:調試的過程中,遇到的一些問題,還沒有解決。

           當main函數中,不是用while(1)的時候,中斷就無法正常響應。

        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮