// #include "iap.h" // #include "bootloader.h" // #include "can.h" // #include "dwt.h" // #include "global.h" // #include "stm32f4xx_flash.h" // #include // static u8 iap_index = 0; // // static u16 iap_buf[IAP_BUF_SIZE] = {0}; // void iap_connect_clear(void){ // iap_} // uint16_t STMFLASH_GetFlashSector(u32 addr) // { // if (addr < ADDR_FLASH_SECTOR_1) // return FLASH_Sector_0; // else if (addr < ADDR_FLASH_SECTOR_2) // return FLASH_Sector_1; // else if (addr < ADDR_FLASH_SECTOR_3) // return FLASH_Sector_2; // else if (addr < ADDR_FLASH_SECTOR_4) // return FLASH_Sector_3; // else if (addr < ADDR_FLASH_SECTOR_5) // return FLASH_Sector_4; // else if (addr < ADDR_FLASH_SECTOR_6) // return FLASH_Sector_5; // else if (addr < ADDR_FLASH_SECTOR_7) // return FLASH_Sector_6; // else if (addr < ADDR_FLASH_SECTOR_8) // return FLASH_Sector_7; // else if (addr < ADDR_FLASH_SECTOR_9) // return FLASH_Sector_8; // else if (addr < ADDR_FLASH_SECTOR_10) // return FLASH_Sector_9; // else if (addr < ADDR_FLASH_SECTOR_11) // return FLASH_Sector_10; // return FLASH_Sector_11; // } // u8 flash_read_byte(u32 faddr) // { // return *(vu8 *)faddr; // } // u16 STMFLASH_ReadHalfWord(u32 faddr) // { // return *(vu16 *)faddr; // } // u32 flash_read_page(u32 faddr) // { // return *(vu32 *)faddr; // } // void copy_to_runaddr(u32 end_addr) // { // FLASH_Status status = FLASH_COMPLETE; // u32 write_addr1 = IAP_RUN_START_SECTOR, read_addr = IAP_DOWN_BEGIN_ADDR; // // u8 erase_sector = 0, index = 0; // u32 temp_value = 0; // // erase_sector = STMFLASH_GetFlashSector(IAP_RUN_START_SECTOR); // FLASH_Unlock(); // 解锁 // FLASH_DataCacheCmd(DISABLE); // FLASH擦除期间,必须禁止数据缓存 // FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); // status = FLASH_EraseSector(FLASH_Sector_4, VoltageRange_3); // if (status != FLASH_COMPLETE) // { // FLASH_DataCacheCmd(ENABLE); // FLASH擦除结束,开启数据缓存 // FLASH_Lock(); // 上锁 // return; // } // status = FLASH_EraseSector(FLASH_Sector_5, VoltageRange_3); // if (status != FLASH_COMPLETE) // { // FLASH_DataCacheCmd(ENABLE); // FLASH擦除结束,开启数据缓存 // FLASH_Lock(); // 上锁 // return; // } // while (end_addr > read_addr) // { // temp_value = flash_read_page(read_addr); // if (FLASH_ProgramWord(write_addr1, temp_value) != FLASH_COMPLETE) // 写入数据 // { // break; // 写入异常 // } // write_addr1 += 4; // read_addr += 4; // } // FLASH_DataCacheCmd(ENABLE); // FLASH擦除结束,开启数据缓存 // FLASH_Lock(); // 上锁 // } // void iap_send_dataresp(u8 res, u32 addr, u32 sum) // { // u8 send_buf[8] = {0}; // send_buf[0] = IAP_CMD_DOWNLOAD; // send_buf[1] = addr; // send_buf[2] = addr >> 8; // send_buf[3] = addr >> 16; // send_buf[4] = res; // send_buf[5] = addr >> 24; // send_buf[6] = (u8)(sum >> 8); // send_buf[7] = (u8)sum; // can_send_msg(send_buf, DLC_8, IAP_MCU_DATA_FRAME); // } // void iap_send_datafinish(u16 page_num) // { // u8 send_buf[8] = {0}; // send_buf[0] = IAP_CMD_DOWNLOAD_END; // send_buf[1] = (u8)page_num; // send_buf[2] = (u8)(page_num >> 8); // send_buf[3] = 0xFF; // send_buf[4] = 0xFF; // send_buf[5] = 0xFF; // send_buf[6] = 0xFF; // send_buf[7] = 0xFF; // can_send_msg(send_buf, DLC_8, IAP_MCU_DATA_FRAME); // } // u8 stm_flash_write(u32 addr, u16 *array, u32 len) // { // u8 res = TRUE; // u32 index = 0, temp_addr = addr; // FLASH_Status status = FLASH_COMPLETE; // FLASH_Unlock(); // FLASH_DataCacheCmd(DISABLE); // for (index = 0; index < len;) // { // if (STMFLASH_ReadHalfWord(temp_addr) != 0xFFFF) // { // status = FLASH_EraseSector(STMFLASH_GetFlashSector(temp_addr), VoltageRange_3); // if (status != FLASH_COMPLETE) // { // res = FALSE; // break; // } // } // else // { // index++; // temp_addr += 2; // } // } // if (status == FLASH_COMPLETE) // { // for (index = 0; index < len; index++) // { // if (FLASH_ProgramHalfWord(addr, array[index]) != FLASH_COMPLETE) // 写入数据 // { // res = FALSE; // // 写入异常 // break; // } // addr += 2; // } // } // FLASH_DataCacheCmd(ENABLE); // FLASH_Lock(); // return res; // } // void stm_flash_write_word(u32 addr, u32 value) // { // u32 temp_addr = addr; // FLASH_Status status = FLASH_COMPLETE; // FLASH_Unlock(); // FLASH_DataCacheCmd(DISABLE); // if (flash_read_page(temp_addr) != 0xFFFFFFFF) // { // status = FLASH_EraseSector(STMFLASH_GetFlashSector(temp_addr), VoltageRange_3); // if (status != FLASH_COMPLETE) // { // return; // } // } // if (status == FLASH_COMPLETE) // { // if (FLASH_ProgramWord(addr, value) != FLASH_COMPLETE) // 写入数据 // { // return; // } // } // FLASH_DataCacheCmd(ENABLE); // FLASH_Lock(); // } // void stm_flash_write_byte(u32 addr, u8 value) // { // u32 temp_addr = addr; // FLASH_Status status = FLASH_COMPLETE; // FLASH_Unlock(); // FLASH_DataCacheCmd(DISABLE); // if (flash_read_byte(temp_addr) != 0xFF) // { // status = FLASH_EraseSector(STMFLASH_GetFlashSector(temp_addr), VoltageRange_3); // if (status != FLASH_COMPLETE) // { // return; // } // } // if (status == FLASH_COMPLETE) // { // if (FLASH_ProgramByte(addr, value) != FLASH_COMPLETE) // 写入数据 // { // return; // } // } // FLASH_DataCacheCmd(ENABLE); // FLASH_Lock(); // } // void iap_process(CanData_TypeDef *rx_msg) // { // // 握手帧回复,最后一个字节为前7个字节累加和 // u8 handle_buf[DLC_8] = {'S', 'U', 'C', 'C', 'E', 'S', 'S', 0x19}; // u8 pc_frame[DLC_8] = {'A', 'P', 'P', 'L', 'O', 'A', 'D', 0x01}; // u8 index = 0, pc_cmd = 0, pack_num = 0, res = 0; // u16 rec_page_num = 0; // u32 temp_addr = 0; // static u16 cnt = 0; // static u16 total_page_num = 0; // static u32 iap_sum = 0; // static u32 pack_receive = 0; // static u32 write_addr = 0, old_write_addr = 0; // if (rx_msg->can_id == IAP_PC_BEGINE_FRAME) // { // cnt = 0; // if (memcmp(rx_msg->buf, pc_frame, 7) == 0) // { // total_page_num = 0; // if (res == 0) // { // InitQueue(&CanQueueImportant); // can_send_msg(handle_buf, DLC_8, IAP_MCU_BIGEN_FRAME); // write_addr = IAP_RUN_START_SECTOR; // IAP_DOWN_BEGIN_ADDR; // } // else // { // return; // } // } // } // else if (rx_msg->can_id == IAP_PC_DATA_FRAME) // { // cnt = 0; // pc_cmd = rx_msg->buf[0]; // switch (pc_cmd) // { // case IAP_CMD_DOWNLOAD: // pack_num = rx_msg->buf[1]; // if (pack_num == 0x01) // { // iap_sum = 0; // iap_index = 0; // pack_receive = 0; // pack_receive |= (1 << (pack_num - 1)); // write_addr = (rx_msg->buf[6] << 24) + (rx_msg->buf[5] << 16) + (rx_msg->buf[4] << 8) + rx_msg->buf[3]; // } // else if ((pack_num > 0x01) && (pack_num < 0x17)) // { // if (((pack_receive & 0x00000001) != 0x00000001) || ((pack_receive & (1 << (pack_num - 1))) == (1 << (pack_num - 1)))) // { // break; // } // iap_index = (pack_num - 2) * 3; // for (index = 0; index < 3; index++) // { // if (iap_index < (IAP_BUF_SIZE - 1)) // { // pack_receive |= 1 << (pack_num - 1); // iap_buf[iap_index] = ((u16)rx_msg->buf[2 * index + 3] << 8) + rx_msg->buf[2 * index + 2]; // iap_sum += iap_buf[iap_index]; // iap_index++; // } // } // } // else if (pack_num == 0x17) // { // if (((pack_receive & 0x00000001) != 0x00000001) || ((pack_receive & (1 << (pack_num - 1))) == (1 << (pack_num - 1)))) // { // break; // } // iap_index = 63; // pack_receive |= 1 << (pack_num - 1); // iap_buf[iap_index] = ((u16)rx_msg->buf[3] << 8) + rx_msg->buf[2]; // iap_sum += iap_buf[iap_index]; // } // if ((pack_receive & 0x007FFFFF) == 0x007FFFFF) // { // temp_addr = write_addr; // if ((write_addr >= ADDR_FLASH_SECTOR_4) && (write_addr <= ADDR_FLASH_SECTOR_END) && (stm_flash_write(temp_addr, iap_buf, IAP_BUF_SIZE) == TRUE)) // { // iap_send_dataresp(MCU_DOWNLOAD_SUCC, write_addr, iap_sum); // if (write_addr != old_write_addr) // { // total_page_num++; // old_write_addr = write_addr; // } // } // else // { // iap_send_dataresp(MCU_DOWNLOAD_FAIL, write_addr, iap_sum); // } // iap_sum = 0; // iap_index = 0; // pack_receive = 0; // } // break; // case IAP_CMD_DOWNLOAD_END: // rec_page_num = rx_msg->buf[2]; // rec_page_num = (rec_page_num << 8) | rx_msg->buf[1]; // if (rec_page_num != total_page_num) // { // break; // } // iap_send_datafinish(total_page_num); // write_addr = IAP_RUN_START_SECTOR; // total_page_num = 0; // delay_ms(300); // boot_goto_app(APP_ADDRESS); // break; // } // } // else // { // cnt++; // delay_ms(10); // if (cnt > 50) // { // boot_goto_app(APP_ADDRESS); // } // } // } // u8 flash_up_is_ok(void) // { // u32 len = 0; // len = flash_read_page(IAP_FLASH_UP_LEN); // if ((len > 0) && (len < 455680)) // 445K // { // return TRUE; // } // else // { // return FALSE; // } // } // void iap_from_flash(void) // { // u32 value = 0, read_add = IAP_FLASH_UP_ADDR, write_add = IAP_RUN_START_SECTOR; // IAP_DOWN_BEGIN_ADDR; // u32 len = 0; // len = flash_read_page(IAP_FLASH_UP_LEN); // while (len >= 4) // { // value = flash_read_page(read_add); // stm_flash_write_word(write_add, value); // read_add += 4; // write_add += 4; // len -= 4; // } // for (; len > 0; len--) // { // value = flash_read_byte(read_add); // stm_flash_write_byte(write_add, (u8)value); // write_add++; // } // FLASH_Unlock(); // FLASH_DataCacheCmd(DISABLE); // FLASH_EraseSector(FLASH_Sector_8, VoltageRange_3); // FLASH_EraseSector(FLASH_Sector_9, VoltageRange_3); // FLASH_EraseSector(FLASH_Sector_10, VoltageRange_3); // FLASH_EraseSector(FLASH_Sector_11, VoltageRange_3); // FLASH_DataCacheCmd(ENABLE); // FLASH_Lock(); // }