新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 從Flash和SRAM中觸發中斷的過程示例

        從Flash和SRAM中觸發中斷的過程示例

        作者: 時間:2016-09-12 來源:網絡 收藏

        /*************************************************************

        MAIN

        ***********************************************************/

        int main()

        {

        /*建立系統*/

        Initialize();

        /*啟動定時器*/

        T1_TCR=0x1;

        while(1)

        {

        }

        }

        /*******************************************************************

        初始化

        *******************************************************************/

        void Initialize()

        {

        /*初始化PLL(使用10MHz晶振配置),使CPU時鐘達到60MHz*/

        /*設置驅動和應用*/

        PLLCFG=0x25;

        Feed();

        /*開PLL*/

        PLLCON=0x1;

        Feed();

        /*等待PLL設置頻率并鎖定*/

        while(!PLLSTAT PLOCK)){}

        /*連接PLL作為時鐘源*/

        PLLCON=0x3;

        Feed();

        開啟MAM,設置時鐘數來取得FLASH MEMORY。

        MAMCR=0x2;

        MAMTIM=0x4;

        設置設備的時鐘(pclk)到系統時鐘(cclk)

        VPBDIV=0X1;

        初始化GPIO

        IODIR = 0Xffff;

        IOSET = 0Xffff;

        初始化TIMER1

        T1_TCR = 0x0;

        T1_TC = 0x0;

        T1_PR = 0x0;

        T1_PC = 0x0;

        后面的用戶來填充相關的值

        T1_MR0 = 0x……;

        復位,進入相關的中斷

        T1_MCR = 0x3;

        初始化VIC

        VICINTSEL = 0x0; /*TIMER1選擇為IRQ*/

        VICINTEN = 0x20; //TIMER1 中斷允許

        VICCNTL0 = 0x25;

        ISR 的地址

        VICVADDR0 = (unsigned long)IRQHandler;

        }

        /********************************************************************

        TIMER1 ISR

        ******************************************************************/

        _irq void IRQHandler()

        {

        /*這里是中斷服務子程序。這個中斷需要在TIMER1中清除,然后寫入一個合適的值到VIC向量地址寄存器來更新VIC硬件優先級。*/

        T1_IR = 0x1;

        VICVADDR = 0Xff;

        }

        /**************************************************************

        PLL的反饋頻率

        *************************************************************/

        void feed()

        {

        PLLFEED = 0Xaa;

        PLLFEED = 0x55;

        }

        中運行上述代碼所需要進行的改變和增加

        鏈接需要按照如下方法配置:中斷向量表(ivt.s)需要鏈接到的底部(0x40000000)。確定相關的中斷向量位于0x40000000-0x4000003F。其他的文件鏈接到代碼內部,可以存放在中。

        而且,中斷向量需要被remapped to SRAM。使用MEMAP寄存器,配置它為用戶RAM模式可以實現。

        Int main()

        {

        ………………….

        初始化 MEMAP

        MEMAP = 0x2;

        ………………………..

        }

        TIMER1配置為觸發一個FIQ中斷,代碼從FLASH中運行

        例子包含下面的文件:

        1. 中斷向量表(ivt.s)

        2. 啟動匯編代碼(init.s)

        3. 主C文件

        本應用筆記只提到了相關的文件。如果使用其他的交叉編譯環境,C文件可以保存大部分不動,匯編文件需要更改。

        中斷向量表

        這些代碼應當被鏈接到0x0。這樣中斷向量和FIQ ISR就被提供給了ARM核。

        ;*******************************************************************

        匯編指令

        ********************************************************************

        AREA IVT,CODE ;新的代碼段

        CODE32

        IMPORT start

        T1_IR EQU 0Xe0008000

        ENTRY

        ;*******************************************************************

        LDR PC,=start

        LDR PC,Undefined_Addr

        LDR PC,SWI_Addr

        LDR PC,Prefetch_Addr

        LDR PC,Abort_Addr

        DCD ;標識

        LDR PC,IRQ_Addr

        ;*******************************************************************

        FIQ ISR已經自己存放在了 0x1C,取代了放置在這里的LDR 指令

        ******************************************************************

        ;清 TIMER1 中斷

        MOV R8,#0x1

        LDR R9,=T1_IR

        STR R8,[R9]

        后面的用戶應當增加更多的代碼在這里。

        ;返回到C main

        SUBS PC,R14,#0x04

        ;*************************************************************************

        Undefined_Addr DCD Undefined_Handler

        SWI_Addr DCD SWI_Handler

        Pregetch_Addr DCD Pregetch_Handler

        Abort_Addr DCD Abort_Handler

        IRQ_Addr DCD IRQ_Handler


        上一頁 1 2 下一頁

        關鍵詞: Flash SRAM 觸發中斷

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 吐鲁番市| 荥阳市| 义马市| 台东市| 连山| 怀集县| 临西县| 安龙县| 金溪县| 巴中市| 六枝特区| 长沙县| 韶山市| 柳江县| 呼图壁县| 革吉县| 津市市| 天等县| 休宁县| 和林格尔县| 什邡市| 夏津县| 高阳县| 北海市| 高平市| 许昌市| 汽车| 日土县| 亳州市| 丹寨县| 富川| 岳阳县| 香格里拉县| 厦门市| 五指山市| 临沧市| 洛南县| 定结县| 铅山县| 莆田市| 浙江省|