活到老,学到老!
分类: 嵌入式
2015-04-03 09:51:55
基于官方Application Notes
AN1301-High-Speed Serial Bootloader for PIC16 and PIC18 Devices
MCU:PIC16F1789
由于官方数据库中无此MCU支持,且需要串口硬件设计支持,项目中只有RS485通信接口。
资源:
1. 修改device.ini
增加config配置字,并且加入以下预定义宏
#include "p16F1789.inc"
#define DEVICEID 0x302A ;* yhx .313
#define WRITE_FLASH_BLOCKSIZE .32 ;* yhx
#define ERASE_FLASH_BLOCKSIZE .32 ;* yhx
#define END_FLASH 0x4000 ;* yhx
#define END_GPR 0x1000 ;* yhx
2. 修改bootconfig.ini
本人没有使用中断向量重映射,那样还要修改应用程序的链接文件,嫌麻烦!
配置如下定义
#define USE_MAX_INTOSC
#define RXPORT PORTC ;* yhx
#define RXPIN RC7 ;* yhx
#define TXTRIS TRISC ;* yhx
#define TXPIN RC6 ;* yhx
#define BOOTLOADER_ADDRESS END_FLASH - (ERASE_FLASH_BLOCKSIZE * 10)
#define BOOTLOADERSIZE .420
3. 由于项目使用RS485通信,故在sendhostbyte调用中增加收发切换
初始化IO,然后控制485切换
#ifdef EXTPA
banksel RCSTA
bcf RCSTA, CREN
banksel PORTB
BSF PORTB,1
BSF PORTB,2
#endif
。。。。。。
#ifdef EXTPA
banksel PORTB
BCF PORTB,2
BCF PORTB,1
banksel RCSTA
bsf RCSTA, CREN
#endif
4. Bootloader模式与app的切换控制采用EEPROM的最后一个位置的值控制,在APP的初始化阶段,将EE的0xff位置的值改为非0xff即可。在Bootloader的BootloaderBreakCheck调用中判断EE值,选择是运行bootloader还是appvector。
#ifdef EXTPA
;init io port
banksel PORTC
clrf PORTC
banksel LATC
clrf LATC
banksel TRISC
movlw B'10111101'
movwf TRISC
banksel PORTC
movlw B'00000010'
movwf PORTC
;------------------------
banksel PORTB
clrf PORTB
banksel LATB
clrf LATB
banksel TRISB
movlw B'11111001'
movwf TRISB
banksel PORTB
movlw B'00000000'
movwf PORTB
;************************************
#endif
#ifdef DEBUG_LED
;init led
banksel PORTD
clrf PORTD
banksel LATD
clrf LATD
banksel TRISD
movlw B'11110111'
movwf TRISD
banksel PORTD
movlw B'00000000'
movwf PORTD
#endif
#ifdef EXTPA
;read eeprom last addr,if !=0xff jump to appvector
banksel EEADRL
movlw DATA_EE_ADDR ;
movwf EEADRL ;Address to read
bcf EECON1,CFGS ;Deselect config space
bcf EECON1,EEPGD ;Point to DATA memory
bsf EECON1,RD ;EE Read
btfsc EECON1, RD
goto $-1 ; wait for read to complete
movf EEDATL,W ;W = EEDATL
xorlw EE_DEFAULT
bnz RunApp ;if =0xff run bootloader,else run app
#endif
#ifdef DEBUG_LED
banksel PORTD ;测试用led灯常亮,指示Bootloader状态
bsf PORTD,3
#endif
movlw high(BootloaderStart)
movwf PCLATH ; Bx
goto BootloaderStart ; no BREAK state, attempt to start application
5. 利用SQLite Expert Personal 3工具修改
由于默认的数据库中没有PIC16F1789的支持
C:\Microchip Solutions\Serial Bootloader AN1310 v1.05\devices.db
增加PIC16F1789项目,参考最前面所列MCU的资源
在APP中,若需要升级程序,则通过各种人机接口使EE的0xff位置的值改为0xff,在调用asm(“reset”),即进入boot模式,使用工具Serial Bootloader AN1310升级代码并跳转