18f47k40 Bootloader

Başlatan acartr, 06 Ağustos 2019, 14:39:08

acartr

İyi günler kullanmış olduğum pcb modüllerinde pickit 2-3 gibi ara modülleri ortadan kaldırmak adına devreme usb den Mcu ya haberleşebilmek adına ft232 entegresi ekledim.
Bu işlem için işlemcilere bootloader yazılımı atmam gerekliydi fakat bilgi eksikliğimden dolayı yeterli çözüm bulamadım.
Mikrochip firması hali hazırda 32K bytes Program Flash Memorye sahip işlemci olan 18f45k22'nin bootloader programını örnek olarak sunmuştur.İnternetteki araştırmalarımda 32k dan 64k ya (18f46k22) geçiş yapılmıştır.
İhtiyacım olan 18f47k40 (128K) işlemcisinin bootloader yazılımıdır.
Yardımcı olabilecek var ise şimdiden teşekkürler

1. bootloader yazılımı 18f45k22

/*
 * Project name:
     Boot_Test (using mikroC Bootloader on PIC18's)
 * Copyright:
     (c) Mikroelektronika, 2008.
 * Revision History:
     20111017:
       - initial release
 * Description:
     This is a serial port Bootloader implementation. All required bootloader
     routines are placed in the boot18_32K file, the only thing that is
     user-configurable is the baudrate of the UART communication, which is set
     in the main() through appropriate call to Uart_Init(brg_reg).
     Once started in PIC, the bootloader waits for a while (approx. 5 seconds)
     to establish UART communication with the MikroBootloader application on the
     PC. If it fails to do so, the bootloader starts the programme already
     loaded in the MCU (initially it is just a NOP). If the communication is
     established, the bootloader receives the hex file from the PC and places it
     where requred (the MikroBootloader application reads out the hex file and
     takes care of the location where hex is to be placed). When hex download
     has finished, the user is notified by the MikroBootloader to reset the MCU,
     and MCU enters the described bootload sequence again.
 * Test configuration:
     MCU:             PIC18F45K22
                      http://ww1.microchip.com/downloads/en/DeviceDoc/41412D.pdf
     Dev.Board:       EasyPIC7
                      http://www.mikroe.com/easypic/
     Oscillator:      HS-PLL, 32.00000 MHz
     Ext. Modules:    None.
     SW:              mikroC PRO for PIC
                      http://www.mikroe.com/mikroc/pic/
 * NOTES:
     - It's recommended not to alter the start address of the main().
       Otherwise, less space in ROM will be available for the application being bootloaded.
     - RX and TX UART switches SW1.1, SW2.1 on EasyPIC7 should be turned On (board specific).
 */

#pragma orgall 0x7CC0

#define BOOTLOADER_START_ADDR 0x7CC0
#define START_PROGRAM_ADDR 0x7FC0

static char block[64];

void Start_Program() org START_PROGRAM_ADDR{

}

unsigned short UART_Write_Loop(char send, char receive){
  unsigned int rslt = 0;

  while(1){
    Delay_5ms();
    UART1_Write(send);
    Delay_5ms();

    rslt++;
    if (rslt == 0x0200) //512
      return 0;
    if (UART1_Read() == receive)
      return 1;
  }
}

void Write_Begin(){
  FLASH_Erase_Write_64(START_PROGRAM_ADDR, block);
  //--- goto main
  block[0] = 0x60;  //0xF03EEF60 //96
  block[1] = 0xEF;  //239
  block[2] = 0x3E;  //62
  block[3] = 0xF0;  //240
}

void Start_Bootload(){
  char i = 0, xx, yy;
  long j = 0;

  while (1) {
    if (i == 64) {
      //--- If 32 words (64 bytes) recieved then write to flash
      if (!j)
        Write_Begin();
      if (j<BOOTLOADER_START_ADDR){
        FLASH_Erase_Write_64(j, block);
      }

      i = 0;
      j += 0x40;
    }
    //--- Ask for yy
    UART1_Write('y');
    while (!UART1_Data_Ready()) ;
    //--- Read yy
    yy = UART1_Read();
    //--- Ask for xx
    UART1_Write('x');
    while (!UART1_Data_Ready()) ;
    //--- Read xx
    xx = UART1_Read();
    //--- Save xxyy in block
    block[i++] = yy;
    block[i++] = xx;
  }
}

void main() org BOOTLOADER_START_ADDR{
  ANSELC = 0;                         // Configure PORTC pins as digital
  UART1_Init(9600);                 // Init USART at 115200
  if (UART_Write_Loop('g','r')) {     // Send 'g' for ~5 sec, if 'r'
    Start_Bootload();                 //   received start bootload
  }
  else {
    Start_Program();                  //   else start program
  }
}
 
2. bootloader yazılımı 18f46k22

/*
 * Project name:
     Boot_Test (using mikroC Bootloader on PIC18's)
 * Copyright:
     (c) Mikroelektronika, 2008.
 * Revision History:
     20111017:
       - initial release
 * Description:
     This is a serial port Bootloader implementation. All required bootloader
     routines are placed in the boot18_32K file, the only thing that is
     user-configurable is the baudrate of the UART communication, which is set
     in the main() through appropriate call to Uart_Init(brg_reg).
     Once started in PIC, the bootloader waits for a while (approx. 5 seconds)
     to establish UART communication with the MikroBootloader application on the
     PC. If it fails to do so, the bootloader starts the programme already
     loaded in the MCU (initially it is just a NOP). If the communication is
     established, the bootloader receives the hex file from the PC and places it
     where requred (the MikroBootloader application reads out the hex file and
     takes care of the location where hex is to be placed). When hex download
     has finished, the user is notified by the MikroBootloader to reset the MCU,
     and MCU enters the described bootload sequence again.
 * Test configuration:
     MCU:             PIC18F45K22
                      http://ww1.microchip.com/downloads/en/DeviceDoc/41412D.pdf
     Dev.Board:       EasyPIC7
                      http://www.mikroe.com/easypic/
     Oscillator:      HS-PLL, 32.00000 MHz
     Ext. Modules:    None.
     SW:              mikroC PRO for PIC
                      http://www.mikroe.com/mikroc/pic/
 * NOTES:
     - It's recommended not to alter the start address of the main().
       Otherwise, less space in ROM will be available for the application being bootloaded.
     - RX and TX UART switches SW1.1, SW2.1 on EasyPIC7 should be turned On (board specific).
 */

//#pragma orgall 0x7CC0
#pragma orgall 0xF968

//#define BOOTLOADER_START_ADDR 0x7CC0
//#define START_PROGRAM_ADDR 0x7FC0
#define BOOTLOADER_START_ADDR 0xF968
#define START_PROGRAM_ADDR 0xFC00

static char block[64];

void Start_Program() org START_PROGRAM_ADDR{

}

unsigned short UART_Write_Loop(char send, char receive){
  unsigned int rslt = 0;

  while(1){
    Delay_5ms();
    UART1_Write(send);
    Delay_5ms();

    rslt++;
    if (rslt == 0x0200)
      return 0;
    if (UART1_Read() == receive)
      return 1;
  }
}

void Write_Begin(){
  FLASH_Erase_Write_64(START_PROGRAM_ADDR, block);
  //--- goto main
  //block[0] = 0x60;  //0xF03EEF60
  //block[1] = 0xEF;
  //block[2] = 0x3E;
  //block[3] = 0xF0;
  block[0] = 0xB4;  //0xF03EEF60
  block[1] = 0xEF;
  block[2] = 0x7C;
  block[3] = 0xF0;
}

void Start_Bootload(){
  char i = 0, xx, yy;
  long j = 0;

  while (1) {
    if (i == 64) {
      //--- If 32 words (64 bytes) recieved then write to flash
      if (!j)
        Write_Begin();
      if (j<BOOTLOADER_START_ADDR){
        FLASH_Erase_Write_64(j, block);
      }

      i = 0;
      j += 0x40;
    }
    //--- Ask for yy
    UART1_Write('y');
    while (!UART1_Data_Ready()) ;
    //--- Read yy
    yy = UART1_Read();
    //--- Ask for xx
    UART1_Write('x');
    while (!UART1_Data_Ready()) ;
    //--- Read xx
    xx = UART1_Read();
    //--- Save xxyy in block
    block[i++] = yy;
    block[i++] = xx;
  }
}

void main() org BOOTLOADER_START_ADDR{
  ANSELC = 0;                         // Configure PORTC pins as digital
  UART1_Init(256000);                 // Init USART at 115200
  if (UART_Write_Loop('g','r')) {     // Send 'a' for ~5 sec, if 'c'
    Start_Bootload();                 //   received start bootload
  }
  else {

    //delay_ms(1000);
    PMD0.B6 = 1;
    //TRISC = 0;
    //delay_ms(1000);
    //LATC = 0;
    //delay_ms(1000);
    //PORTC = 0;

    Start_Program();                  //   else start program

  }

}

furkan41

Daha önce Bootloader hiç yazmadım. dikkatimi cekti ama üstünede gitmemiştim. şimdi kodu inceleyince ayak üstü . mantığı basit. aslında senin burda 1-2 yeri değiştirmen ile bu kod bile calışır. zaten MikroC IDE sinde bile UART driveri yazmassın direk kütüphaneyi cağırırsın. algortima aynı kalır büyük ihtimalle zaten 18F serisi icin demiş. o zaman büyük ihtimal algoritmada değişmez sadece burda değişecek 2 şey var bana göre.

BOOTLOADER İN BAŞLANGIC ADRESİ  ve PROGRAM BASLANGIC ADRESİ. tabi yazma ve silme yazdığı blokclarda değişebilir. ilk önce bu 2 bootloaderden birini secip. hangi mikro denetleyici icin yazılmış ise datasheeti acıp inceleyip tamm fikir sahibi olup sonra istediğin mikro denetleyici icin nereyi nasıl değiştirmemiz gerektiğini düşünmek.

acartr

#2
Cevabınız için teşekkürler Furkan Bey
Sorunun çözümüne hala ulaşamadım.
18f47k40 işlemcisine geçiş yaptığım zaman FLASH_Erase_Write_64 fonksiyonunu kullanamadım.
Bunu çözmek adına ilk önce Flash_Erase ve Flash_Write fonksiyonlarını sıra ile yazdım.
BOOTLOADER BAŞLANGIC ADRESİ  ve PROGRAM BASLANGIC ADRESİ arası ortalama 630hex lik bir alan kaplamaktadır.
PROGRAM BASLANGIC ADRESİ sonunda ise 18f olan bütün işlemcilerde (4K-8K-...-128K) 1023hex lik boş alan bırakmıştır.
Bunlara uyarak yapmış olduğum bootloader programı işlemciyi görmekte fakat program atma işlemini sağlayamamaktadır.
Bir çok yöntem denedim ama sonuca ulaşamadım.
Düzenlemiş olduğum alanlar

#define BOOTLOADER_START_ADDR 0x1FD48
#define START_PROGRAM_ADDR 0x1FFC0


 block[0] = 0xBC; 
 block[1] = 0xEF;
 block[2] = 0xFE;
 block[3] = 0xF0;



furkan41

#3
https://libstock.mikroe.com/project_categories/view/23/bootloaders

Bu Libstockta open source kodlar var hatta şu linke bir bak.

https://libstock.mikroe.com/projects/view/2143/using-mikroc-rs232-bootloader-on-pic18-s-4k-to-128k-rom

18'F serisi için bootloader diyor.

Filtreyi şöyle yaptım. PIC -> MİKRO C -> ALL CODE

buradakileri bir dene. bir de unutmadna şunu diyeyim. mikro elektronikanın bootloaderi için yazılmış ise bootloader yazılımı. ozaman sadece mikro elektronikanın bootloaderinden kodu yükle. farklı bir bootloader görmeyebilir. görsede yazma veya silme işlemi yapmaya bilir.

bunun nedeni de UARTTAN haberleşirken birbirlerini anlamak için gönderdileri datanın değişikliği veya yazma-silme algoritmasının farklı olmasındna kaynaklanabilir.

Linkte belirttiklerimi bir dene. onlarda olmassa bende 18F47K40 alır deneme yaparım.

Powered by EzPortal