2010-01-02
USB、発振子、スイッチ、USB電源用の0.47μFコンデンサだけでブートローダーは機能する。
必要最小限の回路
LEDはブートローダーに必要な回路ではない。実質ブートローダー特有の物はスイッチだけ。
0001 Device = 18F2550
0002 Clock = 48
0003
0004 #option org_reset = $1000
0005 #option vector_isr_hi = $1008
0006 #option vector_isr_lo = $1018
0007
0008 Dim LED As PORTC.0
0009
0010 While true
0011 High(LED)
0012 DelayMS (1000)
0013 Low(LED)
0014 DelayMS (1000)
0015 Wend
0001 void main(void)
0002 {
0003 ADCON1 = 0x0F; //Need to make sure RB4 can be used as a digital input pin
0004 // TRISBbits.TRISB4 = 1; //No need to explicitly do this since reset state is = 1 already.
0005
0006 //Check Bootload Mode Entry Condition
0007 if(sw2 == 1) //This example uses the sw2 I/O pin to determine if the device should enter the bootloader, or the main application code
0008 {
0009 ADCON1 = 0x07; //Restore "reset value" of the ADCON1 register
0010 _asm
0011 goto 0x1000 //If the user is not trying to enter the bootloader, go straight to the main application remapped "reset" vector.
0012 _endasm
0013 }
0014
0015 InitializeSystem();
0016 while(1)
0017 {
0018 ClrWdt();
0019 USBTasks(); // Need to call USBTasks() periodically
0020 // it handles SETUP packets needed for enumeration
0021
0022 BlinkUSBStatus();
0023
0024 if((usb_device_state == CONFIGURED_STATE) && (UCONbits.SUSPND != 1))
0025 {
0026 ProcessIO(); // This is where all the actual bootloader related data transfer/self programming takes place
0027 } // see ProcessIO() function in the Boot87J50Family.c file.
0028 }//end while
0029 }//end main
PIC18FXXXX用のブートローダーはここにある。
ブートローダーを修正するときはMPLABでこれを開く。
1つのプロジェクトファイルに多数ファイルが含まれているが修正することになるであろう物は
main.c
io_cfg.h
の2つだけ。
HID Bootloader PIC18 Non J.mcw
アプリケーションプログラム(ファームウェア)の書き込みプログラム HIDBootLoader.exe
ブートローダーとHIDBootLoader.exeによって書き込まれるプログラム、2つのHEXファイルがアドレスHex1000を境界線として1つのPICに書き込まれることになる。
2011-12-09
MPLAB C18の場合はこんな感じ。ソードフィッシュコンパイラが僅か3行で対応できるのとは対照的。修正すべき物は3つ
1.プログラムの割り込みルーチンのアドレス設定(main関数のあるソースファイル)
2.リンカスクリプト。
標準状態ではプログラムのインストールディレクトリにあるが変更して使うので、
プログラムのあるフォルダーにCOPYしてプロジェクトにaddしておく。
3.スタートアップルーチン(c018i.c)
これも標準状態ではプログラムのインストールディレクトリにあるコンパイル済みのc018i.oを使うが、
リセットアドレスを変更するのでリンカスクリプトからc018i.oを削除し、c018i.cをプログラムの
あるフォルダーにCOPYしてプロジェクトにaddしておく。
0001 // File: 18f4550_g.lkr
0002 // Generic linker script for the PIC18F4550 processor
0003
0004 #DEFINE USE_BOOTLOADER
0005
0006 #DEFINE _CODEEND _DEBUGCODESTART - 1
0007 #DEFINE _CEND _CODEEND + _DEBUGCODELEN
0008 #DEFINE _DATAEND _DEBUGDATASTART - 1
0009 #DEFINE _DEND _DATAEND + _DEBUGDATALEN
0010
0011 LIBPATH .
0012
0013 #IFDEF _CRUNTIME
0014 #IFDEF _EXTENDEDMODE
0015 FILES c018i_e.o
0016 FILES clib_e.lib
0017 FILES p18f4550_e.lib
0018
0019 #ELSE
0020 // FILES c018i.o
0021 FILES clib.lib
0022 FILES p18f4550.lib
0023 #FI
0024
0025 #FI
0026
0027 #IFDEF _DEBUGCODESTART
0028 #IFDEF USE_BOOTLOADER
0029 CODEPAGE NAME=page START=0x2000 END=_CODEEND
0030 #ELSE
0031 CODEPAGE NAME=page START=0x0000 END=_CODEEND
0032 #FI
0033 CODEPAGE NAME=debug START=_DEBUGCODESTART END=_CEND PROTECTED
0034 #ELSE
0035 #IFDEF USE_BOOTLOADER
0036 CODEPAGE NAME=page START=0x2000 END=0x7FFF
0037 #ELSE
0038 CODEPAGE NAME=page START=0x0000 END=0x7FFF
0039 #FI
0040 #FI
0041
0042 以下略
0001 /* $Id: c018i.c,v 1.7 2006/11/15 22:53:12 moshtaa Exp $ */
0002
0003 /* Copyright (c)1999 Microchip Technology */
0004
0005 /* MPLAB-C18 startup code, including initialized data */
0006
0007 /* external reference to __init() function */
0008
0009 #define USE_BOOTLOADER
0010
0011 extern void __init (void);
0012 /* external reference to the user's main routine */
0013 extern void main (void);
0014 /* prototype for the startup function */
0015 void _entry (void);
0016 void _startup (void);
0017 /* prototype for the initialized data setup */
0018 void _do_cinit (void);
0019
0020 extern volatile near unsigned long short TBLPTR;
0021 extern near unsigned FSR0;
0022 extern near char __FPFLAGS;
0023 #define RND 6
0024
0025 #ifdef USE_BOOTLOADER
0026 #pragma code _entry_scn=0x002000
0027 #else
0028 #pragma code _entry_scn=0x000000
0029 #endif
0030 void
0031 _entry (void)
0032 {
0033 _asm goto _startup _endasm
0034
0035 }
0036
0037 以下略
0001 以上略
0002
0003 //----------------------------------------------------------------------------
0004 // set LOW & HIGH interrupt vector
0005 //----------------------------------------------------------------------------
0006
0007 #define USE_BOOTLOADER
0008
0009 #ifdef USE_BOOTLOADER
0010 #pragma code InterruptVectorLow = 0x2018
0011 #else
0012 #pragma code InterruptVectorLow = 0x0018
0013 #endif
0014 void InterruptVectorLow (void)
0015 {
0016 _asm
0017 goto Low_priority_interrupt //jump to interrupt routine
0018 _endasm
0019 }
0020
0021 #ifdef USE_BOOTLOADER
0022 #pragma code InterruptVectorHigh = 0x2008
0023 #else
0024 #pragma code InterruptVectorHigh = 0x0008
0025 #endif
0026 void InterruptVectorHigh (void)
0027 {
0028 _asm
0029 goto High_priority_interrupt //jump to interrupt routine
0030 _endasm
0031 }
0032
0033 #pragma code
0034 #pragma interruptlow Low_priority_interrupt
0035 #pragma interrupt High_priority_interrupt
0036
0037
0038 //----------------------------------------------------------------------------
0039 // High priority interrupt routine
0040 //----------------------------------------------------------------------------
0041 void High_priority_interrupt ()
0042 {
0043 // 略
0044 }
0045
0046 //----------------------------------------------------------------------------
0047 // Low priority interrupt routine
0048 //----------------------------------------------------------------------------
0049 void Low_priority_interrupt ()
0050 {
0051 // 略
0052 }
0053
0054 以下略