diff --git a/BootLoader.uvoptx b/BootLoader.uvoptx index b73e744c4fb591564523ec1420329dd1f00df9f3..a0e345d1ca553e7b55628bf5f4be76235695979d 100644 --- a/BootLoader.uvoptx +++ b/BootLoader.uvoptx @@ -75,7 +75,7 @@ 1 0 - 1 + 0 255 @@ -123,7 +123,24 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F4xx_3MB -FS08000000 -FL0300000 -FP0($$Device:GD32F450ZK$Flash\GD32F4xx_3MB.FLM)) - + + + 0 + 0 + 154 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + .\ymodem.c + + +
+
0 @@ -223,7 +240,7 @@ 1 0 - 0 + 1 255 @@ -297,14 +314,18 @@ - - + + + 0 1 - 0 - 0x8008000 - 0 - - + 0x200004ce + + + 1 + 1 + Crc_Table[256] + + 2 @@ -389,18 +410,6 @@ 1 2 - 5 - 0 - 0 - 0 - .\bsp_uart.h - bsp_uart.h - 0 - 0 - - - 1 - 3 1 0 0 @@ -412,19 +421,7 @@ 1 - 4 - 5 - 0 - 0 - 0 - .\bsp_ocflash.h - bsp_ocflash.h - 0 - 0 - - - 1 - 5 + 3 1 0 0 @@ -436,7 +433,7 @@ 1 - 6 + 4 1 0 0 @@ -448,25 +445,25 @@ 1 - 7 - 5 + 5 + 1 0 0 0 - .\ymodem.h - ymodem.h + .\bsp_gpio.c + bsp_gpio.c 0 0 1 - 8 + 6 1 - 0 + 1 0 0 - .\bsp_gpio.c - bsp_gpio.c + .\driverCrc16.c + driverCrc16.c 0 0 @@ -480,7 +477,7 @@ 0 2 - 9 + 7 1 0 0 @@ -492,7 +489,7 @@ 2 - 10 + 8 1 0 0 diff --git a/BootLoader.uvprojx b/BootLoader.uvprojx index 308be06777890427c8fb82f874688d19f336f6a1..a310d68f779955722d256ac9fba2c18a6037cc5c 100644 --- a/BootLoader.uvprojx +++ b/BootLoader.uvprojx @@ -10,7 +10,7 @@ BootLoader 0x4 ARM-ADS - 6180000::V6.18::ARMCLANG + 5060960::V5.06 update 7 (build 960)::ARMCC 0 @@ -389,21 +389,11 @@ 1 .\bsp_uart.c - - bsp_uart.h - 5 - .\bsp_uart.h - systick.c 1 .\systick.c - - bsp_ocflash.h - 5 - .\bsp_ocflash.h - bsp_ocflash.c 1 @@ -414,16 +404,16 @@ 1 .\ymodem.c - - ymodem.h - 5 - .\ymodem.h - bsp_gpio.c 1 .\bsp_gpio.c + + driverCrc16.c + 1 + .\driverCrc16.c + @@ -832,21 +822,11 @@ 1 .\bsp_uart.c - - bsp_uart.h - 5 - .\bsp_uart.h - systick.c 1 .\systick.c - - bsp_ocflash.h - 5 - .\bsp_ocflash.h - bsp_ocflash.c 1 @@ -857,16 +837,16 @@ 1 .\ymodem.c - - ymodem.h - 5 - .\ymodem.h - bsp_gpio.c 1 .\bsp_gpio.c + + driverCrc16.c + 1 + .\driverCrc16.c + diff --git a/driverCrc16.c b/driverCrc16.c new file mode 100644 index 0000000000000000000000000000000000000000..94f2f37b79b41682b69a17de60dd387d5a4423d0 --- /dev/null +++ b/driverCrc16.c @@ -0,0 +1,50 @@ +/* + * @Author: Ma Yuchen + * @Date: 2022-11-30 19:01:06 + * @LastEditors: Ma YuChen + * @LastEditTime: 2022-11-30 19:33:29 + * @Description: file content + * @FilePath: \BootLoader\driverCrc16.c + */ +#include "driverCrc16.h" + +static uint16_t Crc_Table[256] = {0}; + +void InitCRC(void) +{ + int index = 0; + int bit_cnt = 0; + uint32_t temp = 0; + + for (index = 0; index < 256; index++) + { + temp = 0; + for (bit_cnt = 8; bit_cnt > 0; bit_cnt--) + { + if ((index >> (bit_cnt - 1) ^ temp >> (CRC_WIDTH - 1)) & 0x1) + { + temp = (temp << 1) ^ CRC_PLOY; + } + else + { + temp <<= 1; + } + } + + Crc_Table[index] = (uint16_t)temp; + } +} + +uint16_t CalcuCRC(char *buff, int len) +{ + char *tempPtr = buff; + int reg = CRC_INIT; + int i = 0; + + for (i = 0; i < len; i++) + { + reg = (reg << 8) ^ Crc_Table[((reg >> (CRC_WIDTH - 8)) & 0xFF) ^ *tempPtr]; + tempPtr++; + } + return (uint16_t)(reg & 0xFFFF); +} diff --git a/driverCrc16.h b/driverCrc16.h new file mode 100644 index 0000000000000000000000000000000000000000..8fb1d75032780381522cd5ac7066f0419d70db6d --- /dev/null +++ b/driverCrc16.h @@ -0,0 +1,21 @@ +/* + * @Author: Ma Yuchen + * @Date: 2022-11-30 19:01:15 + * @LastEditors: Ma YuChen + * @LastEditTime: 2022-11-30 19:32:24 + * @Description: file content + * @FilePath: \BootLoader\driverCrc16.h + */ +#ifndef Driver_CRC16_H +#define Driver_CRC16_H + +#include + +#define CRC_WIDTH 16 +#define CRC_PLOY 0x1021 +#define CRC_INIT 0x0000 + +void InitCRC(void); +uint16_t CalcuCRC(char* buff, int len); + +#endif //Driver_CRC16_H diff --git a/main.c b/main.c index df9d58f57bfe173d8eb6a53372a311e7f15e6966..7185d96990036e629bca48dafdd2a4a3b46be6b2 100644 --- a/main.c +++ b/main.c @@ -2,7 +2,7 @@ * @Author: Ma Yuchen * @Date: 2022-11-22 21:03:02 * @LastEditors: Ma YuChen - * @LastEditTime: 2022-11-26 15:00:32 + * @LastEditTime: 2022-11-30 19:34:44 * @Description: file content * @FilePath: \BootLoader\main.c */ @@ -11,6 +11,7 @@ #include "bsp_gpio.h" #include "bsp_uart.h" #include "bsp_ocflash.h" +#include "driverCrc16.h" #include "systick.h" extern pFunction Jump_To_Application; @@ -24,6 +25,7 @@ int main(void) { //初始化Core时钟 systick_config(); + InitCRC(); #ifndef BOARD_EVAL //初始化GPIO并打开V3.3外设供电 InitGpio(); @@ -35,8 +37,8 @@ int main(void) SerialPutString("\r\nThanks for use this bootLoader\r\n"); - if(GetIAPIntper() == 1) - //if(1) + //if(GetIAPIntper() == 1) + if(1) //如果获取到IAP请求中断则打印菜单进行IAP操作 { Flash_IF_Init(); diff --git a/menu.c b/menu.c index 9a67862f4bc97a32e3e2d3d634a8b7b4a4e0fde1..dd715006c482d97fff9a809a6076d77f51604720 100644 --- a/menu.c +++ b/menu.c @@ -2,7 +2,7 @@ * @Author: Ma Yuchen * @Date: 2022-11-24 10:03:28 * @LastEditors: Ma YuChen - * @LastEditTime: 2022-11-25 15:19:15 + * @LastEditTime: 2022-11-30 19:34:36 * @Description: file content * @FilePath: \BootLoader\menu.c */ @@ -31,7 +31,7 @@ void PrintMenu(void) SerialPutString("=========================================================\r\n"); SerialPutString("= =\r\n"); SerialPutString("= BMC GD32F4XX In-Application Programming Apllication =\r\n"); - SerialPutString("= V 0.0.1 =\r\n"); + SerialPutString("= V 0.0.3 =\r\n"); SerialPutString("=========================================================\r\n"); while (1) diff --git a/ymodem.c b/ymodem.c index dbf2fead5a7ac18dc99e0fdd955cc4a90b0f9963..cd439b91697d4f63e3d39d7c25d282b8bd66a717 100644 --- a/ymodem.c +++ b/ymodem.c @@ -2,13 +2,14 @@ * @Author: Ma Yuchen * @Date: 2022-11-23 23:29:58 * @LastEditors: Ma YuChen - * @LastEditTime: 2022-11-26 18:26:40 + * @LastEditTime: 2022-11-30 19:35:28 * @Description: file content * @FilePath: \BootLoader\ymodem.c */ #include "ymodem.h" #include "bsp_ocflash.h" #include "bsp_uart.h" +#include "driverCrc16.h" #include "systick.h" typedef struct _YModemInfo @@ -59,71 +60,6 @@ static int Send_Byte(uint8_t c) return 0; } -static uint16_t UpdateCrc16(uint16_t crcIn, uint8_t d) -{ - /* - uint8_t count = 8; - uint16_t newCrc = crc; - uint16_t data = d; - - while ((count--) > 0) - { - if (newCrc & 0x8000) - { - newCrc <<= 1; - newCrc += (((data <<= 1) & 0x0400) != 0); - newCrc ^= 0x1021; - } - else - { - newCrc <<= 1; - newCrc += (((data <<= 1) & 0x0400) != 0); - } - } - - return newCrc; - */ - uint32_t crc = crcIn; - uint32_t in = d|0x100; - - do - { - crc <<= 1; - in <<= 1; - - if(in&0x100) - { - ++crc; - } - - if(crc&0x10000) - { - crc ^= 0x1021; - } - } while(!(in&0x10000)); - - return (crc&0xffffu); -} - -static uint16_t ClcCrc16(const uint8_t *datas, int size) -{ - uint16_t crc = 0; - - const uint8_t *endofDatas = datas + size; - - while (datas < endofDatas) - { - crc = UpdateCrc16(crc, *datas); - datas++; - } - crc = UpdateCrc16(crc, 0); - crc = UpdateCrc16(crc, 0); - - return (crc & (uint16_t)0xffff); -} - -uint8_t debugData=0xff; - /** * @brief * @@ -142,16 +78,16 @@ static int Receive_Packet(uint8_t *buffer, int32_t *length, uint32_t timeout) uint16_t i, packet_size, computedcrc; uint8_t data; *length = 0; - int result=0; - - usart_start_receive_block((uint32_t)buffer, PACKET_OVERHEAD+PACKET_DATA_LENGTH); - result = Receive_Byte(timeout); + int result=0; + // receive packet + usart_start_receive_block((uint32_t)buffer, PACKET_OVERHEAD+PACKET_DATA_LENGTH); + result = Receive_Byte(timeout); if (result == 0) { return -1; } //delay_1ms(50); - data=*buffer; + data=*buffer; //SEGGER_RTT_printf(0,"%d:get Head %X result=%d\r\n",debugLoop++ , data, result); switch (data) { @@ -175,35 +111,22 @@ static int Receive_Packet(uint8_t *buffer, int32_t *length, uint32_t timeout) return -1; } default: - debugData=data; return -3; } - //*buffer = data; // buffer store header in buffer[0]; - - // receive packet - /* - for (i = 1; i < packet_size; i++) - { - if (Receive_Byte(timeout) != 0) - { - return -4; - } - } - */ // check packet no if (buffer[PACKET_NO_INDEX] != ((buffer[PACKET_NO_N_INDEX] ^ 0xff) & 0xff)) { return -2; } -/* - computedcrc = ClcCrc16(buffer[PACKET_HEADER], (int)packet_size); + + computedcrc = CalcuCRC(&(buffer[PACKET_HEADER]), (int)packet_size); if (computedcrc != (((uint16_t)buffer[packet_size + 3] << 8) | buffer[packet_size + 4])) { return -3; } -*/ + *length = packet_size; return 0;