VxWorks LPC2104 BSP ARM
STMFD SP!,{R0-R12,LR}
BL FIQ_Exception
LDMFD SP!,{R0-R12,LR}
SUBS PC,LR,#4
當系統上電時(shí),如果地址0x00000014內的數據是0xB9205F80,則從Flash的零地址開(kāi)始執行,也就是執行romInit()函數。此函數將啟動(dòng)方式BOOT_COLD放在R0中,作為romStart的參數,將系統設為SVC32模式,并禁止IRQ和FIR中斷,設置好系統堆棧指針跳到romStart()執行。驗證此部分程序執行情況的最簡(jiǎn)單的一種方法是用匯編寫(xiě)一段點(diǎn)燈程序,用以指令程序的執行情況。其中常量PINSEL0、PINSEL1、IODIR、SPI_IOCON可以頭文件templatarm.h中用define定義。
#define PINSEL0 0xE002C000
#define PINSEL1 0xE002C004
#define IODIR 0xE0028008
#define SPI_IOCON 0x00003DD0
我們設計的點(diǎn)燈程序如下。將其放在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集成開(kāi)發(fā)環(huán)境下,templatarm的BSP生成bootrom_res.bin文件后,可以借助ASD1.2的AXD反匯編調方式器進(jìn)行單步仿真和調試。
2.3 sysLib.c文件
在這個(gè)文件中,主要是在sysHwInit()函數內實(shí)現系統外設的配置,中斷向量表的拷貝和重映射,系統定時(shí)器中斷向量的安裝,串口初始化等功能。在串口還沒(méi)有調通之前,可以借助上面提到的簡(jiǎn)單點(diǎn)燈函數實(shí)現程序的定位。其用C語(yǔ)言重新定義如下(將它插入本文件的適當地址,可以指示各個(gè)函數的執行情況):
#include “LPC2106.h”
PINSEL0=0x00000000;
PINSEL1=0x00000000;
IODIR=0x00003DD0;
系統的初始化和配置與硬件系統高度相關(guān)。對這部分的代碼不作過(guò)多的解釋?zhuān)垍⒖创a注釋。幾個(gè)常量定義如下:
#define Fosc 11059200 /*晶振頻率,10MHz~25MHz應與實(shí)際一致*/
#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時(shí)鐘頻率,只能為(Fcclk/4)的1、2、4倍*/
2.4 templateTimer.c文件
本文件主要實(shí)現與系統時(shí)鐘和系統輔助時(shí)鐘相關(guān)的函數。關(guān)于系統時(shí)鐘的各函數定義如下(系統輔助時(shí)鐘的各函數與系統時(shí)鐘一樣,只須將T0換成T1即可):
/*SysClkInt(),此函數每個(gè)時(shí)鐘Tick被調用一次*/
void sysClkInt(void){
/*通知系統中斷結束*/
T0IR=0x01;
T0MR0 =(Fpclk/sysClkTicksPerSecond);
VICVectAddr=0;
/*調用系統中斷函數*/
if(sysClkRoutine!=NULL)
(*sysClkRoutine)(sysClkArg);
}
/*sysClkDisable()禁止系統時(shí)鐘*/
void sysClkDisable(void){
if(sysClkRunning){
/*禁止系統時(shí)鐘中斷*/
VICIntEnClr=0x10;
T0TC=0;
SysClkRunning=FLASE;
}
}
/*sysClkEnable()啟動(dòng)系統時(shí)鐘*/
void sysClkEnable(void){
static BOOL connected=FALSE;
if(!connected){
/*定時(shí)器0初始化*/
T0TC=0;
T0TCR=0x01;
T0MCR=0x01;
T0MR0=(Fpclk/sysClkTicksPerSecond);
VICIntEnable=0x10;
Connected=TRUE;
}
if(!sysClkRunning){
T0TC=0;
sysClkRunning=TRUE;
}
}
3 應用程序設計
由于Easyarm開(kāi)發(fā)板本身資源較少,不可能與PC機連接成宿主機一目標機的調試環(huán)境,通過(guò)主機將代碼下載到目標機再執行。因此在設計應用程序時(shí),可以修改bootConfig.c文件中的bootCmdLoop()函數,生成bootrom_res.hex文件,格式轉換后,下載到Flash中運行,在PC機上借助串口調試助手打印調試信息。具體過(guò)程是:在Tornado2.2集成開(kāi)發(fā)環(huán)境下選取Build->Build Boot Rom,BSP選定templatearm,Image選定bootrom_res.hex,編譯器選gnu,確認即可。
4 小結
VxWorks所需要的唯一的驅動(dòng)程序是系統時(shí)鐘,本文詳細給出了系統時(shí)鐘源代碼,同時(shí)還給出了串口通信的源代碼,使得開(kāi)發(fā)板與PC機能正常通信。另外,給出了基于VxWorks的應用程序的設計方法。由于BSP的設計本身就是一件很具有挑戰性的工作,相信本文對VxWorks的BSP設計得有所幫助。
評論