从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
触发中断

小广播

独家专题更多

富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
带你走进LED王国——Microchip LED应用专题
带你走进LED王国——Microchip LED应用专题
 
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved