基于SEP3203處理器的BSP的實(shí)現(xiàn)探討
//搬運(yùn)Nor flash中所有代碼(包括bootloader)到SDRAM
ldr r3, =0x00000000 //SDRAM起始地址
ldr r1, =0x30002000 //搬運(yùn)代碼SDRAM目標(biāo)地址
ldr r2, =0x20001000 //代碼在flash中的起始地址
LOOP //每個(gè)循環(huán)搬運(yùn)32位代碼
ldr r4, [r2], #4 //將代碼從flash搬運(yùn)到SDRAM中
str r4, [r1], #4
add r3, r3, #1
cmp r3, #0x2C000 //0x2C000為代碼量
bne LOOP
//REMAP操作
ldr pc, =0x20000080 //定位pc指針
mov r0, r0 //空語句
mov r0, r0
mov r0, r0
mov r0, r0
ldr r1, =0x11000010 //配置REMAP寄存器
ldr r2, =0x0000000b
str r2, [ r1 ]
//使pc指針指向主程序起始地址
ldr pc, =0x30002000 //定位pc指針
mov r0, r0
mov r0, r0
mov r0, r0
mov r0, r0
3.2、啟動代碼的難點(diǎn)分析
ARM7執(zhí)行指令為三級流水線結(jié)構(gòu),即第一條指令執(zhí)行的時(shí),第二條指令正在譯碼,第三條指令正在取指如(圖四三級流水線)。
Remap操作中,語句ldr pc, =0x20000080是將pc指針指向了下面的4條mov語句,這4條mov語句是沒有意義的,只是用來填充三級流水線,以避免執(zhí)行Remap操作時(shí),產(chǎn)生不必要的錯(cuò)誤。
Remap操作后,NOR FLASH 將失去零地址,而只擁有實(shí)際地址0x20000000,而SDRAM 則擁有了兩個(gè)起始地址,即0x00000000和0x30000000,訪問這兩個(gè)地址實(shí)際上都是在訪問SDRAM。因此,當(dāng)完成代碼搬運(yùn)后,pc指針應(yīng)先重新定位到Nor Flash實(shí)際地址(0x20000000開始的地址)再繼續(xù)運(yùn)行啟動代碼的剩余部分,否則Remap之后pc會取錯(cuò)地址導(dǎo)致錯(cuò)誤。
語句ldr pc, =0x30002000將pc指針定位到主程序的入口,之后4條mov語句用于填充三級流水線,否則pc指針在讀取重新定位pc指針指令后,將會繼續(xù)向下移動,取錯(cuò)指令。
pc指針跳轉(zhuǎn)到主程序的入口后,整個(gè)啟動代碼結(jié)束。
4、串口驅(qū)動程序
串口驅(qū)動程序包含串口配置和收發(fā)數(shù)據(jù)兩部分,接收數(shù)據(jù)使用do(取fifo數(shù)據(jù))while(fifo非空)的結(jié)構(gòu)讀取fifo中的數(shù)據(jù);發(fā)送數(shù)據(jù)即直接向發(fā)送fifo填入數(shù)據(jù),其代碼不再贅述。串口配置是在主函數(shù)運(yùn)行后進(jìn)行的。代碼如下:
int init_uart(unsigned long sysclk, unsigned long baudrate, unsigned long databit, unsigned long trigerlevel)
{
unsigned long baud, bit, triger, baudh, baudl;
baud = sysclk/16/baudrate
baudh = baud >> 8 //波特率高8位和低8位分離
baudl = baud 0xff
write_reg(UART0_LCR, bit); //選擇訪問波特率設(shè)置寄存器
write_reg(UART0_DLH, baudh) //分高低8位分別配置波特率
write_reg(UART0_DLL, baudl)
read_reg(UART0_LCR) = (~(0x1 7)) //關(guān)閉波特率配置寄存器訪問
write_reg(UART0_FCR, triger) //配置fifo觸發(fā)級
write_reg(UART0_IER, 0x00) //使能串口相關(guān)中斷源
irq_enable(INT_UART0); //使能串口中斷
}
由于SEP3203處理器的串口波特率配置寄存器地址是與其他寄存器地址復(fù)用的,所以在配置波特率時(shí)須進(jìn)行如下操作:語句:write_reg(UART0_LCR, bit)中bit參數(shù)的第7位決定了波特率配置寄存器的訪問,之后語句:read_reg(UART0_LCR) = (~(0x1 7))關(guān)閉了波特率配置寄存器的訪問。
本文作者創(chuàng)新點(diǎn):
根據(jù)無線通信平臺的測試及在儀表監(jiān)控系統(tǒng)中應(yīng)用的實(shí)際情況,本BSP完成了預(yù)定內(nèi)容,且運(yùn)行穩(wěn)定。BSP的成功編寫為今后更為復(fù)雜的底層開發(fā)提供了保證,也有助于相關(guān)嵌入式操作系統(tǒng)的移植與開發(fā)。
參考文獻(xiàn)
1 杜春雷.ARM體系結(jié)構(gòu)與編程[M].北京:清華大學(xué)出版社,2003.1-160
2 Andrew N.Sloss,Dominic Symes,Chris Wright. ARM嵌入式系統(tǒng)開發(fā)——軟件設(shè)計(jì)與優(yōu)化[M].北京:北京航空航天大學(xué)出版社,2005.1-92
3 董策,楊志家. AES加密算法的高速低功耗ASIC設(shè)計(jì)[J]. 微計(jì)算機(jī)信息-2005年09X期,36-37
評論