从Flash和SRAM中触发中断的过程示例(二)

2013-09-24 10:30:23来源: 互联网
启动汇编代码

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

  ; 汇编指令

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

  AREA asm_code,CODE ;新的代码段

  CODE32 ;ARM模式

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

  EXPORT start ;全局标志,参考ivt.s

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

  start

  ; Enable interrupts

  MSR cpsr_c,#0x13

  为管理模式设置SP。由应用程序所需要的堆栈空间来决定这个值。

  LDR SP,=0x4……..

  设置IRQ模式的SP。在设置SP_irq前转换模式到IRQ,然后再返回管理模式。

  MRS R0,CPSR

  BIC R1,R0,#0x1F

  ORR R1,R1,#0x12

  MSR cpsr_c,R1

  LDR SP,=0x4……..

  MSR cpsr_c,R0

  跳转到C代码

  LDR lr,=_main

  MOV pc,lr

  END

  这段代码在第一条指令链接到ivt.s。如果建立堆栈指针失败,将导致数据取消,因此堆栈的建立应当在跳转到C main()前建立。

  C 代码

  这样的话,TIMER1中相关的寄存器就被建立起来了,当寄存器匹配的时候,TIMER将会中断CPU的核。TIMER1 将会以60M Hz的速度运行。这段代码已经在实验板上测试过。实验板使用10 M Hz的晶振,同样地设置PLL。有关定时器的操作请参考LPC2106、5、4用户手册相关的章节。ISR的寄存器将为空,然后根据需要由后面的用户来设置。_irq编译关键字被用来定义IRQHandler()函数,作为一个IRQ ISR。

  执行下面的指令,将会执行 init.s 中的C main

  LDR lr,=_main

  MOV pc,lr

  下面是C代码:

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

  函数功能说明

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

  _irq void IRQHandler(void);

  void feed(void);

  void Initialize(void);

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

  头文件

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

  #include “LPC210x.h”

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

  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;

  }

SRAM中运行上述代码所需要进行的改变和增加

  链接需要按照如下方法配置:中断向量表(ivt.s)需要链接到SRAM的底部(0x40000000)。确定相关的中断向量位于0x40000000-0x4000003F。其他的文件链接到代码内部,可以存放在SRAM中。

  而且,中断向量需要被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

关键字:Flash  SRAM  触发中断

编辑:神话 引用地址:http://www.eeworld.com.cn/mndz/2013/0924/article_19437.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
Flash
SRAM
触发中断

小广播

独家专题更多

迎接创新的黄金时代 无创想,不奇迹
迎接创新的黄金时代 无创想,不奇迹
​TE工程师帮助将不可能变成可能,通过技术突破,使世界更加清洁、安全和美好。
TTI携TE传感器样片与你相见,一起传感未来
TTI携TE传感器样片与你相见,一起传感未来
TTI携TE传感器样片与你相见,一起传感未来
富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved