Цитата(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();
}