VxWorks LPC2104 BSP ARM
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);
}
/*sysClkDisable()禁止系統時鐘*/
void sysClkDisable(void){
if(sysClkRunning){
/*禁止系統時鐘中斷*/
VICIntEnClr=0x10;
T0TC=0;
SysClkRunning=FLASE;
}
}
/*sysClkEnable()啟動系統時鐘*/
void sysClkEnable(void){
static BOOL connected=FALSE;
if(!connected){
/*定時器0初始化*/
T0TC=0;
T0TCR=0x01;
T0MCR=0x01;
T0MR0=(Fpclk/sysClkTicksPerSecond);
VICIntEnable=0x10;
Connected=TRUE;
}
if(!sysClkRunning){
T0TC=0;
sysClkRunning=TRUE;
}
}
3 應用程序設計
由于Easyarm開發板本身資源較少,不可能與PC機連接成宿主機一目標機的調試環境,通過主機將代碼下載到目標機再執行。因此在設計應用程序時,可以修改bootConfig.c文件中的bootCmdLoop()函數,生成bootrom_res.hex文件,格式轉換后,下載到Flash中運行,在PC機上借助串口調試助手打印調試信息。具體過程是:在Tornado2.2集成開發環境下選取Build->Build Boot Rom,BSP選定templatearm,Image選定bootrom_res.hex,編譯器選gnu,確認即可。
4 小結
VxWorks所需要的唯一的驅動程序是系統時鐘,本文詳細給出了系統時鐘源代碼,同時還給出了串口通信的源代碼,使得開發板與PC機能正常通信。另外,給出了基于VxWorks的應用程序的設計方法。由于BSP的設計本身就是一件很具有挑戰性的工作,相信本文對VxWorks的BSP設計得有所幫助。
評論