2014年11月20日 星期四

Microchip C18-Bootloader設定

本文簡述如何在MPLAB C18環境中,將專案檔的起始位址改為0x1000,使Debug、Release時可不必額外設定
其實改用XC8後,用到的機會應該不多了,但還是當作歸檔,稍微記錄一下

概念:

調整C018i中的進入點,設備上電、由0x00開始執行後後,初始化完成即轉跳至0x1000,interrupt則轉跳至0x1008
關鍵字:Linker script、C018i.c、Hexmate、remap

c018x.c簡單說明

負責將做些預設初始化、轉跳至Main():
檔名 說明
c018i.o 有初始化
c018i_e.o 有初始化,延伸模式
c018.o 無初始化
c018_e.o 無初始化,延伸模式

步驟:

1. 修改c018i.c
找出c018i.c,複製一份至專案檔下,並由MPLAB加入該檔案
void _entry(void)中之轉跳位址由_startup改為0x1000
在_entry下面新增:
#pragma code High_IV = 0x0008
void High_ISR (void)
{
     _asm goto 0x1008 _endasm
}
#pragma code
2. 修改Linerscript(以18F67k22為例)
CODESTART段中,新增:(注意DEBUG與RELEASE都要設定)
CODEPAGE NAME=bootloader START=0x0 END=0xFFF PROTECTED
CODEPAGE NAME=vectors START=0x1000 END=0x1029 PROTECTED
CODEPAGE NAME=page START=0x102A END=0x1FBFF (原有項目)
-新增booloader與vectors所佔的空間(新的中斷指定在0x1000-0x1029間
將FILES c018i_e.o註解掉,使專案直接使用我們import的c018i.c檔案
3. 修改Main.c檔,在最上方新增:
extern void _startup (void);
#pragma code Remap_RESET_VECTOR = 0x1000
void Remap_entry (void)
{
    _asm goto _startup _endasm
}
​

XC8 MCC使用注意事項

使用MCC設定Timer時,不要使用Callback function,以免轉跳後工作太多造成Uart接收逾時 使用MCC產生EE, Flash操作時,生成的Code有錯,變更NVMREG後沒切回來,會造成程式錯誤 NVMCON1bits.NVMREG = 0 ; NV...