реклама на сайте
подробности

 
 
> STM32 Bootloader
Jenya7
сообщение Apr 28 2016, 06:03
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Я написал отдельную программу - бутлоадер. Чтоб разместить ее во флеш нужно изменить стартап файл и линкер файл. и тут у меня трудности. может кто нибудь рассказать как это делать?
под бутлоадер я хочу отвести первые две страницы. линкер и стартап в принципе изменять не надо.
насчет главной программы. в линкере заменил
Код
MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1024K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
  CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
}

На
Код
MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08001000, LENGTH = 1024K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
  CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
}

и в system_stm32f30x.c заменил
Код
#define VECT_TAB_OFFSET  0x0

На
Код
#define VECT_TAB_OFFSET  0x1000

а что еще надо поменять?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Jenya7
сообщение May 2 2016, 06:48
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



еще такой вопрос хотел задать.
мне надо принять по CAN прошивку и положить во флеш. может есть пример как это делается?
разбить hex файл на строки и посылать построчно? а как по CAN принимать? насколько я понимаю приемный FIFO содержит 8 байт. прошивать по 8 байт или накапливать пакет,скажем размером в страницу и затем прошивать?
Go to the top of the page
 
+Quote Post
AleksBak
сообщение May 2 2016, 07:15
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



Цитата(Jenya7 @ May 2 2016, 10:48) *
еще такой вопрос хотел задать.
мне надо принять по CAN прошивку и положить во флеш. может есть пример как это делается?
разбить hex файл на строки и посылать построчно? а как по CAN принимать? насколько я понимаю приемный FIFO содержит 8 байт. прошивать по 8 байт или накапливать пакет,скажем размером в страницу и затем прошивать?

А зачем hex файл посылать? Он же текстовый. Сразу в бинарном виде же лучше - тем более тут CAN. И контрольную сумму не забыть потом. У Вас по CAN какой-то хост имеется что ли?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 2 2016, 08:08
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(AleksBak @ May 2 2016, 13:15) *
А зачем hex файл посылать? Он же текстовый. Сразу в бинарном виде же лучше - тем более тут CAN. И контрольную сумму не забыть потом. У Вас по CAN какой-то хост имеется что ли?

нет. обычный CAN. принимаю данные по прерыванию.
Код
void USB_LP_CAN1_RX0_IRQHandler(void)
{
    if((CAN1->RF0R & CAN_RF0R_FMP0)!=0) /* check if a message is filtered and received by FIFO 0 */
    {
        CAN_ReceiveData = CAN1->sFIFOMailBox[0].RDLR;   /* read data */
        CAN_CmdType = CAN1->sFIFOMailBox[0].RDHR;
        CAN_Identifier = CAN1->sFIFOMailBox[0].RIR;
        CAN1->RF0R |= CAN_RF0R_RFOM0;                  /* release FIFO */
        data_ready = 1;
    }
    else {
          //error_flag |= CAN_ERR;
          CAN1->TSR |= CAN_TSR_ABRQ0;
          CAN1->IER &= ~CAN_IER_ERRIE;
    }
}

непонятно как организовать протокол приема бин файла.

сам бут выглядит пока так
Код
int boot_main(void)
{

    __disable_irq();

    GPIO_Config();
    CAN_Config();
    Start_TIM2();

    __enable_irq();

    //load parameters from flash
    memcpy(&flashParams, (uint32_t*)FLASH_PAGE127, sizeof(flashParams));
    
    // notify other party that we are alive
    CAN_Send(UNIT_ID , READY, 0);
  
  /* Infinite loop */
  while (1)
  {
      //get data from CAN
      if (data_ready)
      {
          data_ready = 0;
          WriteAppToFlash();
      }

      //timeout to exit to main application
      if (sec_count > TIMEOUT)
      {
          sec_count = 0;
          if (flashParams.state == LAST_BOOT_OK)
          {
              JumpToApp();
          }
          else  //try to program flash from the buffer
          {
                   
          }      
      }

  }
}


WriteAppToFlash() в сыром виде выглядит так
Код
void WriteAppToFlash(void)
{
    /* Porgram APP to FLASH -------------------------------------------------------------*/

    // Unlock the Flash
    FLASH_Unlock();

    /* Clear All pending flags */
    FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR | FLASH_FLAG_BSY);

    uint32_t done = 0;
    uint32_t page;
    uint32_t page_addr;
    uint32_t page_addr_end;

    /* Erase the FLASH pages */
    for(page = 0; page < 20; page++)  //main program takes 20 pages
    {
        page_addr = (page * FLASH_PAGE_SIZE) + APPLICATION_ADDRESS;
        FLASHStatus = FLASH_ErasePage(page_addr);
        if (FLASHStatus != FLASH_COMPLETE)
            break;
    }

    /* Program Flash */
    page = 0;
    while (page < 20 || !done)
    {
        Address = (page * FLASH_PAGE_SIZE) + APPLICATION_ADDRESS;
        page_addr_end = Address + FLASH_PAGE_SIZE;
        while((Address < page_addr_end))
        {
            // Get packet from CAN
            //?????????

            //Program packet to flash
            FLASHStatus = FLASH_ProgramWord(Address, Data);
            Address = Address + 4;
            addr_data = addr_data +4;
            if (FLASHStatus != FLASH_COMPLETE)
            {
                //done = 1;
                break;
            }
        }
        page++;
    }

    FLASH_Lock();

    /* Jump to User define Application Address */
    JumpToApp();
}



Сообщение отредактировал Jenya7 - May 2 2016, 07:24
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 07:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01429 секунд с 7
ELECTRONIX ©2004-2016