Chinaunix首页 | 论坛 | 博客
  • 博客访问: 775065
  • 博文数量: 37
  • 博客积分: 575
  • 博客等级: 中士
  • 技术积分: 320
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-12 10:43
个人简介

活到老,学到老!

文章分类

全部博文(37)

文章存档

2019年(4)

2018年(4)

2015年(1)

2014年(14)

2011年(1)

2010年(13)

我的朋友

分类: 嵌入式

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的初始化阶段,将EE0xff位置的值改为非0xff即可。在BootloaderBootloaderBreakCheck调用中判断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中,若需要升级程序,则通过各种人机接口使EE0xff位置的值改为0xff,在调用asm(“reset”),即进入boot模式,使用工具Serial Bootloader AN1310升级代码并跳转

阅读(3654) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~