从Flash和SRAM中触发中断的过程示例(2)
;*********************************************************************
; 汇编指令
;******************************************************************
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
非常好我支持^.^
(0) 0%
不好我反对
(0) 0%
相关阅读:
- [DSP] 基于DSP的双通道数字语音监录器设计 2011-09-23
- [单片机] 单片机的FLASH引导装载系统设计 2011-09-20
- [DSP] JTAG接口在线烧写Flash的实现 2011-09-16
- [缓冲/存储技术] 单片机系统Flash存储器在系统编程设计 2011-09-14
- [FPGA/ASIC技术] 基于Flash型FPGA的信号源卡设计 2011-09-14
- [电子动态] NAND Flash需求9月有望开始回温 2011-09-07
- [电子动态] 闪存芯片价格小幅下跌 NAND Flash终端出货量不如预 2011-08-30
- [缓冲/存储技术] SRAM简介及与DRAM/SDRAM的比较 2011-08-25
( 发表人:叶子 )