91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng) > 電子技術(shù)應(yīng)用 > 嵌入式技術(shù) > 嵌入式操作系統(tǒng) >

從Flash和SRAM中觸發(fā)中斷的過(guò)程示例(2)

2011年09月28日 11:29 本站整理 作者:葉子 用戶評(píng)論(0
啟動(dòng)匯編代碼

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

  ; 匯編指令

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

  AREA asm_code,CODE ;新的代碼段

  CODE32 ;ARM模式

  IMPORT _main ;main 不要在此段中定義

  EXPORT start ;全局標(biāo)志,參考ivt.s

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

  start

  ; Enable interrupts

  MSR cpsr_c,#0x13

  為管理模式設(shè)置SP。由應(yīng)用程序所需要的堆棧空間來(lái)決定這個(gè)值。

  LDR SP,=0x4……..

  設(shè)置IRQ模式的SP。在設(shè)置SP_irq前轉(zhuǎn)換模式到IRQ,然后再返回管理模式。

  MRS R0,CPSR

  BIC R1,R0,#0x1F

  ORR R1,R1,#0x12

  MSR cpsr_c,R1

  LDR SP,=0x4……..

  MSR cpsr_c,R0

  跳轉(zhuǎn)到C代碼

  LDR lr,=_main

  MOV pc,lr

  END

  這段代碼在第一條指令鏈接到ivt.s。如果建立堆棧指針失敗,將導(dǎo)致數(shù)據(jù)取消,因此堆棧的建立應(yīng)當(dāng)在跳轉(zhuǎn)到C main()前建立。

  C 代碼

  這樣的話,TIMER1中相關(guān)的寄存器就被建立起來(lái)了,當(dāng)寄存器匹配的時(shí)候,TIMER將會(huì)中斷CPU的核。TIMER1 將會(huì)以60M Hz的速度運(yùn)行。這段代碼已經(jīng)在實(shí)驗(yàn)板上測(cè)試過(guò)。實(shí)驗(yàn)板使用10 M Hz的晶振,同樣地設(shè)置PLL。有關(guān)定時(shí)器的操作請(qǐng)參考LPC2106、5、4用戶手冊(cè)相關(guān)的章節(jié)。ISR的寄存器將為空,然后根據(jù)需要由后面的用戶來(lái)設(shè)置。_irq編譯關(guān)鍵字被用來(lái)定義IRQHandler()函數(shù),作為一個(gè)IRQ ISR。

  執(zhí)行下面的指令,將會(huì)執(zhí)行 init.s 中的C main

  LDR lr,=_main

  MOV pc,lr

  下面是C代碼:

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

  函數(shù)功能說(shuō)明

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

  _irq void IRQHandler(void);

  void feed(void);

  void Initialize(void);

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

  頭文件

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

  #include “LPC210x.h”

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

  MAIN

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

  int main()

  {

  /*建立系統(tǒng)*/

  Initialize();

  /*啟動(dòng)定時(shí)器*/

  T1_TCR=0x1;

  while(1)

  {

  }

  }

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

  初始化

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

  void Initialize()

  {

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

  /*設(shè)置驅(qū)動(dòng)和應(yīng)用*/

  PLLCFG=0x25;

  Feed();

  /*開(kāi)PLL*/

  PLLCON=0x1;

  Feed();

  /*等待PLL設(shè)置頻率并鎖定*/

  while(!PLLSTAT & PLOCK)){}

  /*連接PLL作為時(shí)鐘源*/

  PLLCON=0x3;

  Feed();

  開(kāi)啟MAM,設(shè)置時(shí)鐘數(shù)來(lái)取得FLASH MEMORY。

  MAMCR=0x2;

  MAMTIM=0x4;

  設(shè)置設(shè)備的時(shí)鐘(pclk)到系統(tǒng)時(shí)鐘(cclk)

  VPBDIV=0X1;

  初始化GPIO

  IODIR = 0Xffff;

  IOSET = 0Xffff;

  初始化TIMER1

  T1_TCR = 0x0;

  T1_TC = 0x0;

  T1_PR = 0x0;

  T1_PC = 0x0;

  后面的用戶來(lái)填充相關(guān)的值

  T1_MR0 = 0x……;

  復(fù)位,進(jìn)入相關(guān)的中斷

  T1_MCR = 0x3;

  初始化VIC

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

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

  VICCNTL0 = 0x25;

  ISR 的地址

  VICVADDR0 = (unsigned long)IRQHandler;

  }

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

  TIMER1 ISR

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

  _irq void IRQHandler()

  {

  /*這里是中斷服務(wù)子程序。這個(gè)中斷需要在TIMER1中清除,然后寫(xiě)入一個(gè)合適的值到VIC向量地址寄存器來(lái)更新VIC硬件優(yōu)先級(jí)。*/

  T1_IR = 0x1;

  VICVADDR = 0Xff;

  }

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

  PLL的反饋頻率

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

  void feed()

  {

  PLLFEED = 0Xaa;

  PLLFEED = 0x55;

  }

  

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

( 發(fā)表人:葉子 )

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?