首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

VxWorks LPC2104 BSP ARM 03

VxWorks LPC2104 BSP ARM 03

_TIME1_IRQ_Hander:

SUB LR,LR,#4 /*计算返回地址*/

STMFD SP!,{R0-R11,R12,LR} /*保存任务环境*/

MRS R3,SPSR /*保存状态*/

STMFD SP!,{R3}

BL sysAuxClkInt /*调用C语言的中断处理程序*/

LDMFD SP!,{R3}

MSR SPSR_cxsf,R3

LDMFD SP!,{R0-R11,R12,PC}

快速中断函数VxWorks不用由用户自己定义。其框架如下:其中FIQ_Exception()函数由C语言定义,在文件开始用globl FUNC(FIQ_Exception)声明。

FIQ_Hander:

STMFD SP!,{R0-R12,LR}

BL FIQ_Exception

LDMFD SP!,{R0-R12,LR}

SUBS PC,LR,#4

当系统上电时,如果地址0x00000014内的数据是0xB9205F80,则从Flash的零地址开始执行,也就是执行romInit()函数。此函数将启动方式BOOT_COLD放在R0中,作为romStart的参数,将系统设为SVC32模式,并禁止IRQ和FIR中断,设置好系统堆栈指针跳到romStart()执行。验证此部分程序执行情况的最简单的一种方法是用汇编写一段点灯程序,用以指令程序的执行情况。其中常量PINSEL0、PINSEL1、IODIR、SPI_IOCON可以头文件templatarm.h中用define定义。

#define PINSEL0 0xE002C000

#define PINSEL1 0xE002C004

#define IODIR 0xE0028008

#define SPI_IOCON 0x00003DD0

我们设计的点灯程序如下。将其放在romInit.s适当的位置,可以定位程序的运行情况。

LDR r0,=PINSEL0

MOV r1,#0

STR r1,[R0],#4

STR r1,[R0]

LDR r0,=PINSEL1

MOV r1,#0

STR r1,[R0],#4

STR r1,[R0]

LDR r0,=IODIR

LDR r1,SPI_IOCON

STR r1,[R0]

在Tornado集成开发环境下,templatarm的BSP生成bootrom_res.bin文件后,可以借助ASD1.2的AXD反汇编调方式器进行单步仿真和调试。

2.3 sysLib.c文件

在这个文件中,主要是在sysHwInit()函数内实现系统外设的配置,中断向量表的拷贝和重映射,系统定时器中断向量的安装,串口初始化等功能。在串口还没有调通之前,可以借助上面提到的简单点灯函数实现程序的定位。其用C语言重新定义如下(将它插入本文件的适当地址,可以指示各个函数的执行情况):

#include “LPC2106.h”

PINSEL0=0x00000000;

PINSEL1=0x00000000;

IODIR=0x00003DD0;

系统的初始化和配置与硬件系统高度相关。对这部分的代码不作过多的解释,请参看代码注释。几个常量定义如下:

#define Fosc 11059200 /*晶振频率,10MHz~25MHz应与实际一致*/

#define Fcclk(Fosc *4)

/*系统频率,必须为Fosc的整数倍(1~32),且<=60MHz*/

#define Fcco (Fosc *4)

/*CCO频率,必须为Fcclk的1、2、4、8倍,范围为156MHz~320MHz*/

#define Fpclk (Fcclk/4)*2

/*VPB时钟频率,只能为(Fcclk/4)的1、2、4倍*/

2.4 templateTimer.c文件

本文件主要实现与系统时钟和系统辅助时钟相关的函数。关于系统时钟的各函数定义如下(系统辅助时钟的各函数与系统时钟一样,只须将T0换成T1即可):

/*SysClkInt(),此函数每个时钟Tick被调用一次*/

void sysClkInt(void){

/*通知系统中断结束*/

T0IR=0x01;

T0MR0 =(Fpclk/sysClkTicksPerSecond);

VICVectAddr=0;

/*调用系统中断函数*/

if(sysClkRoutine!=NULL)

(*sysClkRoutine)(sysClkArg);
返回列表