From dcbd0e93b5cc05ea9f1e1152c7951a37e12d177f Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期二, 03 六月 2025 15:23:36 +0800 Subject: [PATCH] V1.13版本修改接收时间和帧间隔和延迟接收时间参数,适配铁鞋稳定一对多测距版本 --- keil/include/drivers/ymodem.c | 1174 +++++++++++++++++++++++++++++----------------------------- 1 files changed, 587 insertions(+), 587 deletions(-) diff --git a/keil/include/drivers/ymodem.c b/keil/include/drivers/ymodem.c index 8d48742..9e9b9ae 100644 --- a/keil/include/drivers/ymodem.c +++ b/keil/include/drivers/ymodem.c @@ -1,6 +1,6 @@ /** ****************************************************************************** - * @file STM32F0xx_IAP/src/ymodem.c + * @file STM32F0xx_IAP/src/ymodem.c * @author MCD Application Team * @version V1.0.0 * @date 29-May-2012 @@ -16,8 +16,8 @@ * * http://www.st.com/software_license_agreement_liberty_v2 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. @@ -58,85 +58,85 @@ /* Private functions ---------------------------------------------------------*/ uint32_t Str2Int(uint8_t *inputstr, int32_t *intnum) { - uint32_t i = 0, res = 0; - uint32_t val = 0; + uint32_t i = 0, res = 0; + uint32_t val = 0; - if (inputstr[0] == '0' && (inputstr[1] == 'x' || inputstr[1] == 'X')) + if (inputstr[0] == '0' && (inputstr[1] == 'x' || inputstr[1] == 'X')) + { + if (inputstr[2] == '\0') { - if (inputstr[2] == '\0') - { - return 0; - } - for (i = 2; i < 11; i++) - { - if (inputstr[i] == '\0') - { - *intnum = val; - /* return 1; */ - res = 1; - break; - } - if (ISVALIDHEX(inputstr[i])) - { - val = (val << 4) + CONVERTHEX(inputstr[i]); - } - else - { - /* return 0, Invalid input */ - res = 0; - break; - } - } - /* over 8 digit hex --invalid */ - if (i >= 11) - { - res = 0; - } + return 0; } - else /* max 10-digit decimal input */ + for (i = 2; i < 11; i++) { - for (i = 0; i < 11; i++) - { - if (inputstr[i] == '\0') - { - *intnum = val; - /* return 1 */ - res = 1; - break; - } - else if ((inputstr[i] == 'k' || inputstr[i] == 'K') && (i > 0)) - { - val = val << 10; - *intnum = val; - res = 1; - break; - } - else if ((inputstr[i] == 'm' || inputstr[i] == 'M') && (i > 0)) - { - val = val << 20; - *intnum = val; - res = 1; - break; - } - else if (ISVALIDDEC(inputstr[i])) - { - val = val * 10 + CONVERTDEC(inputstr[i]); - } - else - { - /* return 0, Invalid input */ - res = 0; - break; - } - } - /* Over 10 digit decimal --invalid */ - if (i >= 11) - { - res = 0; - } + if (inputstr[i] == '\0') + { + *intnum = val; + /* return 1; */ + res = 1; + break; + } + if (ISVALIDHEX(inputstr[i])) + { + val = (val << 4) + CONVERTHEX(inputstr[i]); + } + else + { + /* return 0, Invalid input */ + res = 0; + break; + } } + /* over 8 digit hex --invalid */ + if (i >= 11) + { + res = 0; + } + } + else /* max 10-digit decimal input */ + { + for (i = 0;i < 11;i++) + { + if (inputstr[i] == '\0') + { + *intnum = val; + /* return 1 */ + res = 1; + break; + } + else if ((inputstr[i] == 'k' || inputstr[i] == 'K') && (i > 0)) + { + val = val << 10; + *intnum = val; + res = 1; + break; + } + else if ((inputstr[i] == 'm' || inputstr[i] == 'M') && (i > 0)) + { + val = val << 20; + *intnum = val; + res = 1; + break; + } + else if (ISVALIDDEC(inputstr[i])) + { + val = val * 10 + CONVERTDEC(inputstr[i]); + } + else + { + /* return 0, Invalid input */ + res = 0; + break; + } + } + /* Over 10 digit decimal --invalid */ + if (i >= 11) + { + res = 0; + } + } - return res; + return res; } /** * @brief Receive byte from sender @@ -145,18 +145,18 @@ * @retval 0: Byte received * -1: Timeout */ -int32_t Receive_Byte (uint8_t *c, uint32_t timeout) + int32_t Receive_Byte (uint8_t *c, uint32_t timeout) { - while (timeout-- > 0) + while (timeout-- > 0) + { + if (SerialKeyPressed(c) == 1)//如果收到串口数据 { - if (SerialKeyPressed(c) == 1)//如果收到串口数据 - { - // Serial0_PutString("接受成功"); - return 0; - } + // Serial0_PutString("接受成功"); + return 0; } - // Serial0_PutString("接受失败"); - return -1; + } + // Serial0_PutString("接受失败"); + return -1; } /** @@ -164,40 +164,40 @@ * @param c: Character * @retval 0: Byte sent */ -uint32_t Send_Byte (uint8_t c) + uint32_t Send_Byte (uint8_t c) { - SerialPutChar(c); - return 0; + SerialPutChar(c); + return 0; } /** * @brief Update CRC16 for input byte - * @param CRC input value + * @param CRC input value * @param input byte * @retval Updated CRC value */ uint16_t UpdateCRC16(uint16_t crcIn, uint8_t byte) { - uint32_t crc = crcIn; - uint32_t in = byte|0x100; + uint32_t crc = crcIn; + uint32_t in = byte|0x100; - do + do + { + crc <<= 1; + in <<= 1; + + if(in&0x100) { - crc <<= 1; - in <<= 1; + ++crc; + } + + if(crc&0x10000) + { + crc ^= 0x1021; + } + } while(!(in&0x10000)); - if(in&0x100) - { - ++crc; - } - - if(crc&0x10000) - { - crc ^= 0x1021; - } - } while(!(in&0x10000)); - - return (crc&0xffffu); + return (crc&0xffffu); } /** @@ -208,17 +208,17 @@ */ uint16_t Cal_CRC16(const uint8_t* data, uint32_t size) { - uint32_t crc = 0; - const uint8_t* dataEnd = data+size; + uint32_t crc = 0; + const uint8_t* dataEnd = data+size; + + while(data<dataEnd) + { + crc = UpdateCRC16(crc,*data++); + } + crc = UpdateCRC16(crc,0); + crc = UpdateCRC16(crc,0); - while(data<dataEnd) - { - crc = UpdateCRC16(crc,*data++); - } - crc = UpdateCRC16(crc,0); - crc = UpdateCRC16(crc,0); - - return (crc&0xffffu); + return (crc&0xffffu); } /** @@ -229,15 +229,15 @@ */ uint8_t CalChecksum(const uint8_t* data, uint32_t size) { - uint32_t sum = 0; - const uint8_t* dataEnd = data+size; + uint32_t sum = 0; + const uint8_t* dataEnd = data+size; + + while(data < dataEnd) + { + sum += *data++; + } - while(data < dataEnd) - { - sum += *data++; - } - - return (sum&0xffu); + return (sum&0xffu); } /** @@ -256,73 +256,73 @@ uint8_t c; static int32_t Receive_Packet (uint8_t *data, int32_t *length, uint32_t timeout) { - uint16_t packet_size, computedcrc; - - *length = 0; - if (Receive_Byte(&c, timeout) != 0)//返回0成功收取数据,-1为没收到数据 - { - return -1; - } - switch (c) - { + uint16_t packet_size, computedcrc; + + *length = 0; + if (Receive_Byte(&c, timeout) != 0)//返回0成功收取数据,-1为没收到数据 + { + return -1; + } + switch (c) + { case SOH: - packet_size = PACKET_SIZE; - break; + packet_size = PACKET_SIZE; + break; case STX: - packet_size = PACKET_1K_SIZE; - break; + packet_size = PACKET_1K_SIZE; + break; case EOT: - return 0; + return 0; case CA: - if ((Receive_Byte(&c, timeout) == 0) && (c == CA)) - { - *length = -1; - return 0; - } - else - { - return -1; - } + if ((Receive_Byte(&c, timeout) == 0) && (c == CA)) + { + *length = -1; + return 0; + } + else + { + return -1; + } case ABORT1: case ABORT2: - return 1; + return 1; default: - return -1; - } - *data = c;//放到1024+5字节的包里面 - for (i2 = 1; i2 < (packet_size + PACKET_OVERHEAD); i2 ++) + return -1; + } + *data = c;//放到1024+5字节的包里面 + for (i2 = 1; i2 < (packet_size + PACKET_OVERHEAD); i2 ++) + { + if (Receive_Byte(data + i2, timeout) != 0)//不断的接收1024字节放入 { - if (Receive_Byte(data + i2, timeout) != 0)//不断的接收1024字节放入 - { - return -1; - } + return -1; } - //检测序号补码是是否正确 - if (data[PACKET_SEQNO_INDEX] != ((data[PACKET_SEQNO_COMP_INDEX] ^ 0xff) & 0xff)) - { + } + //检测序号补码是是否正确 + if (data[PACKET_SEQNO_INDEX] != ((data[PACKET_SEQNO_COMP_INDEX] ^ 0xff) & 0xff)) + { + + return 1; + } + if(current_seqno==data[PACKET_SEQNO_INDEX]||c==SOH) + { + current_seqno++; + }else{ + return 1; + } - return 1; - } - if(current_seqno==data[PACKET_SEQNO_INDEX]||c==SOH) - { - current_seqno++; - } else { - return 1; - } + /* Compute the CRC */ + computedcrc = Cal_CRC16(&data[PACKET_HEADER], (uint32_t)packet_size);//计算CRC16码 + /* Check that received CRC match the already computed CRC value + data[packet_size+3]<<8) | data[packet_size+4] contains the received CRC + computedcrc contains the computed CRC value */ + if (computedcrc != (uint16_t)((data[packet_size+3]<<8) | data[packet_size+4]))//检测CRC16校验码 + { + /* CRC error */ + return 1; + } - /* Compute the CRC */ - computedcrc = Cal_CRC16(&data[PACKET_HEADER], (uint32_t)packet_size);//计算CRC16码 - /* Check that received CRC match the already computed CRC value - data[packet_size+3]<<8) | data[packet_size+4] contains the received CRC - computedcrc contains the computed CRC value */ - if (computedcrc != (uint16_t)((data[packet_size+3]<<8) | data[packet_size+4]))//检测CRC16校验码 - { - /* CRC error */ - return 1; - } - - *length = packet_size; - return 0; + *length = packet_size; + return 0; } /** @@ -332,111 +332,111 @@ */ extern volatile unsigned long time32_reset; uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD], file_size[FILE_SIZE_LENGTH], *file_ptr, *buf_ptr; //1024 + 5 -uint8_t bufferOut[16]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; +uint8_t bufferOut[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; uint8_t *BufferIn; int32_t i, j, packet_length, session_done, file_done, packets_received, errors, session_begin, size = 0; uint32_t flashdestination, ramsource,tempaddress; int32_t Ymodem_Receive (uint8_t *buf) -{ +{ - aesDecInit();//AES解密初始化 - /* Initialize flashdestination variable */ - flashdestination = APP_CONFIG_APPLICATION_ADDRESS; //APP代码的起始地址,APP_CONFIG_APPLICATION_ADDRESS = 0x8005000,可在target界面根据情况设置 + aesDecInit();//AES解密初始化 + /* Initialize flashdestination variable */ + flashdestination = APP_CONFIG_APPLICATION_ADDRESS; //APP代码的起始地址,APP_CONFIG_APPLICATION_ADDRESS = 0x8005000,可在target界面根据情况设置 current_seqno=0; //这些都在ymodem.h里面的宏进行设置 - flash_seqno=2; - for (session_done = 0, errors = 0, session_begin = 0; ;)//死循环直至文件数据包全部发送完成 + flash_seqno=2; + for (session_done = 0, errors = 0, session_begin = 0; ;)//死循环直至文件数据包全部发送完成 + { + for (packets_received = 0, file_done = 0, buf_ptr = buf; ;) { - for (packets_received = 0, file_done = 0, buf_ptr = buf; ;) - { - - switch (Receive_Packet(packet_data, &packet_length, NAK_TIMEOUT)) - { - case 0://成功接收到1K - errors = 0; - switch (packet_length) + + switch (Receive_Packet(packet_data, &packet_length, NAK_TIMEOUT)) + { + case 0://成功接收到1K + errors = 0; + switch (packet_length) + { + /* Abort by sender */ + case - 1: //接收失败 + Send_Byte(ACK); //回复 + return 0; + /* End of transmission */ + case 0: + Send_Byte(ACK);//回复 + file_done = 1; + break; + /* Normal packet */ + default: //接收成功 + if ((packet_data[PACKET_SEQNO_INDEX] & 0xff) != (packets_received & 0xff)) + {//序号00(文件名) + Send_Byte(NAK); + + } + else + { + if (packets_received == 0)//文件名(首包) { - /* Abort by sender */ - case - 1: //接收失败 - Send_Byte(ACK); //回复 - return 0; - /* End of transmission */ - case 0: - Send_Byte(ACK);//回复 - file_done = 1; - break; - /* Normal packet */ - default: //接收成功 - if ((packet_data[PACKET_SEQNO_INDEX] & 0xff) != (packets_received & 0xff)) - { //序号00(文件名) - Send_Byte(NAK); - - } - else + /* Filename packet */ + if (packet_data[PACKET_HEADER] != 0)//文件名字 + { + /* Filename packet has valid data */ + for (i = 0, file_ptr = packet_data + PACKET_HEADER; (*file_ptr != 0) && (i < FILE_NAME_LENGTH);) { - if (packets_received == 0)//文件名(首包) - { - /* Filename packet */ - if (packet_data[PACKET_HEADER] != 0)//文件名字 - { - /* Filename packet has valid data */ - for (i = 0, file_ptr = packet_data + PACKET_HEADER; (*file_ptr != 0) && (i < FILE_NAME_LENGTH);) - { - FileName[i++] = *file_ptr++;//保存文件名 - } - FileName[i++] = '\0';//字符串形式 - for (i = 0, file_ptr ++; (*file_ptr != ' ') && (i < (FILE_SIZE_LENGTH - 1));) - { - file_size[i++] = *file_ptr++;//文件大小 - } - file_size[i++] = '\0'; - Str2Int(file_size, &size);//Convert a string to an integer + FileName[i++] = *file_ptr++;//保存文件名 + } + FileName[i++] = '\0';//字符串形式 + for (i = 0, file_ptr ++; (*file_ptr != ' ') && (i < (FILE_SIZE_LENGTH - 1));) + { + file_size[i++] = *file_ptr++;//文件大小 + } + file_size[i++] = '\0'; + Str2Int(file_size, &size);//Convert a string to an integer - /* Test the size of the image to be sent */ - /* Image size is greater than Flash size */ - if (size > (APP_CONFIG_APPLICATION_SIZE + 1)) - { - /* End session */ - Send_Byte(CA); - Send_Byte(CA); - return -1; - } - /* erase user application area */ + /* Test the size of the image to be sent */ + /* Image size is greater than Flash size */ + if (size > (APP_CONFIG_APPLICATION_SIZE + 1)) + { + /* End session */ + Send_Byte(CA); + Send_Byte(CA); + return -1; + } + /* erase user application area */ // Flash_Init(); // Flash_Erase(APP_CONFIG_APPLICATION_ADDRESS, APP_CONFIG_APPLICATION_SIZE);MK8000 修改 - flash_erase(FLASH_ID0, APP_CONFIG_APPLICATION_ADDRESS, APP_CONFIG_APPLICATION_SIZE);//擦除APP - Send_Byte(ACK); - Send_Byte(CRC16); - } - /* Filename packet is empty, end session */ - else - { - Send_Byte(ACK); - file_done = 1; - session_done = 1; - break; - } - } - /* Data packet */ - else //文件信息保存完后开始接收数据 - { - memcpy(buf_ptr, packet_data + PACKET_HEADER, packet_length); - - /*----------------------------------------------------------------------------------------------*/ - BufferIn=buf; - for (j = 0; j < packet_length; j += 16) //每次解密16字节 - { - //解密数据包 - aesDecrypt(BufferIn,bufferOut); //由于参数使用的是指针,所以解密后依旧存在buf里面 - BufferIn+=16; - } - /*----------------------------------------------------------------------------------------------*/ - - - /* Write received data in Flash */ //这个size参数是自己加进入的,便于判断文件传输完成 + flash_erase(FLASH_ID0, APP_CONFIG_APPLICATION_ADDRESS, APP_CONFIG_APPLICATION_SIZE);//擦除APP + Send_Byte(ACK); + Send_Byte(CRC16); + } + /* Filename packet is empty, end session */ + else + { + Send_Byte(ACK); + file_done = 1; + session_done = 1; + break; + } + } + /* Data packet */ + else //文件信息保存完后开始接收数据 + { + memcpy(buf_ptr, packet_data + PACKET_HEADER, packet_length); + + /*----------------------------------------------------------------------------------------------*/ + BufferIn=buf; + for (j = 0; j < packet_length; j += 16) //每次解密16字节 + { + //解密数据包 + aesDecrypt(BufferIn,bufferOut); //由于参数使用的是指针,所以解密后依旧存在buf里面 + BufferIn+=16; + } + /*----------------------------------------------------------------------------------------------*/ + + + /* Write received data in Flash */ //这个size参数是自己加进入的,便于判断文件传输完成 // if (Flash_Write(flashdestination, buf, packet_length) == 0&&(flashdestination==tempaddress||tempaddress>size)) MK8000修改 // { // flashdestination += packet_length; -// //写入FLASH +// //写入FLASH // Send_Byte(ACK); // flash_seqno++; // time32_reset = 0; @@ -448,60 +448,60 @@ // Send_Byte(CA); // return -2; // } - ramsource = (uint32_t)buf; - tempaddress=APP_CONFIG_APPLICATION_ADDRESS+(current_seqno-1)*0x400; - if(flash_write_nbytes(FLASH_ID0,flashdestination, buf, packet_length)== 0&&(flashdestination==tempaddress||tempaddress>size)) - { - flashdestination += packet_length; - //写入FLASH - Send_Byte(ACK); - flash_seqno++; - time32_reset = 0; - } - else - { - /* End session */ - Send_Byte(CA); - Send_Byte(CA); - return -2; - } - } - packets_received ++; - session_begin = 1; - } - } - break; - case 1: - Send_Byte(CA); - Send_Byte(CA); - return -3; - default://检验错误 - if (session_begin > 0) - { - errors ++; - } - if (errors > MAX_ERRORS) - { + ramsource = (uint32_t)buf; + tempaddress=APP_CONFIG_APPLICATION_ADDRESS+(current_seqno-1)*0x400; + if(flash_write_nbytes(FLASH_ID0,flashdestination, buf, packet_length)== 0&&(flashdestination==tempaddress||tempaddress>size)) + { + flashdestination += packet_length; + //写入FLASH + Send_Byte(ACK); + flash_seqno++; + time32_reset = 0; + } + else + { + /* End session */ Send_Byte(CA); Send_Byte(CA); - return 0; + return -2; + } } - - Send_Byte(CRC16); //发送校验值 - break; - } - - if (file_done != 0) - { - break; - } - } - if (session_done != 0) //文件发送完成 - { - break; - } + packets_received ++; + session_begin = 1; + } + } + break; + case 1: + Send_Byte(CA); + Send_Byte(CA); + return -3; + default://检验错误 + if (session_begin > 0) + { + errors ++; + } + if (errors > MAX_ERRORS) + { + Send_Byte(CA); + Send_Byte(CA); + return 0; + } + + Send_Byte(CRC16); //发送校验值 + break; + } + + if (file_done != 0) + { + break; + } } - return (int32_t)size; + if (session_done != 0) //文件发送完成 + { + break; + } + } + return (int32_t)size; } /** @@ -511,7 +511,7 @@ */ int32_t Ymodem_CheckResponse(uint8_t c) { - return 0; + return 0; } /** @@ -521,32 +521,32 @@ */ void Ymodem_PrepareIntialPacket(uint8_t *data, const uint8_t* fileName, uint32_t *length) { - uint16_t i, j; - uint8_t file_ptr[10]; + uint16_t i, j; + uint8_t file_ptr[10]; + + /* Make first three packet */ + data[0] = SOH; + data[1] = 0x00; + data[2] = 0xff; + + /* Filename packet has valid data */ + for (i = 0; (fileName[i] != '\0') && (i < FILE_NAME_LENGTH);i++) + { + data[i + PACKET_HEADER] = fileName[i]; + } - /* Make first three packet */ - data[0] = SOH; - data[1] = 0x00; - data[2] = 0xff; - - /* Filename packet has valid data */ - for (i = 0; (fileName[i] != '\0') && (i < FILE_NAME_LENGTH); i++) - { - data[i + PACKET_HEADER] = fileName[i]; - } - - data[i + PACKET_HEADER] = 0x00; - - Int2Str (file_ptr, *length); - for (j =0, i = i + PACKET_HEADER + 1; file_ptr[j] != '\0' ; ) - { - data[i++] = file_ptr[j++]; - } - - for (j = i; j < PACKET_SIZE + PACKET_HEADER; j++) - { - data[j] = 0; - } + data[i + PACKET_HEADER] = 0x00; + + Int2Str (file_ptr, *length); + for (j =0, i = i + PACKET_HEADER + 1; file_ptr[j] != '\0' ; ) + { + data[i++] = file_ptr[j++]; + } + + for (j = i; j < PACKET_SIZE + PACKET_HEADER; j++) + { + data[j] = 0; + } } /** @@ -556,36 +556,36 @@ */ void Ymodem_PreparePacket(uint8_t *SourceBuf, uint8_t *data, uint8_t pktNo, uint32_t sizeBlk) { - uint16_t i, size, packetSize; - uint8_t* file_ptr; - - /* Make first three packet */ - packetSize = sizeBlk >= PACKET_1K_SIZE ? PACKET_1K_SIZE : PACKET_SIZE; - size = sizeBlk < packetSize ? sizeBlk :packetSize; - if (packetSize == PACKET_1K_SIZE) + uint16_t i, size, packetSize; + uint8_t* file_ptr; + + /* Make first three packet */ + packetSize = sizeBlk >= PACKET_1K_SIZE ? PACKET_1K_SIZE : PACKET_SIZE; + size = sizeBlk < packetSize ? sizeBlk :packetSize; + if (packetSize == PACKET_1K_SIZE) + { + data[0] = STX; + } + else + { + data[0] = SOH; + } + data[1] = pktNo; + data[2] = (~pktNo); + file_ptr = SourceBuf; + + /* Filename packet has valid data */ + for (i = PACKET_HEADER; i < size + PACKET_HEADER;i++) + { + data[i] = *file_ptr++; + } + if ( size <= packetSize) + { + for (i = size + PACKET_HEADER; i < packetSize + PACKET_HEADER; i++) { - data[0] = STX; + data[i] = 0x1A; /* EOF (0x1A) or 0x00 */ } - else - { - data[0] = SOH; - } - data[1] = pktNo; - data[2] = (~pktNo); - file_ptr = SourceBuf; - - /* Filename packet has valid data */ - for (i = PACKET_HEADER; i < size + PACKET_HEADER; i++) - { - data[i] = *file_ptr++; - } - if ( size <= packetSize) - { - for (i = size + PACKET_HEADER; i < packetSize + PACKET_HEADER; i++) - { - data[i] = 0x1A; /* EOF (0x1A) or 0x00 */ - } - } + } } /** @@ -596,13 +596,13 @@ */ void Ymodem_SendPacket(uint8_t *data, uint16_t length) { - uint16_t i; - i = 0; - while (i < length) - { - Send_Byte(data[i]); - i++; - } + uint16_t i; + i = 0; + while (i < length) + { + Send_Byte(data[i]); + i++; + } } /** @@ -626,234 +626,234 @@ }; uint8_t Ymodem_Transmit (uint8_t *buf, const uint8_t* sendFileName, uint32_t sizeFile) { - uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD]; - uint8_t FileName[FILE_NAME_LENGTH]; - uint8_t *buf_ptr, tempCheckSum ; - uint16_t tempCRC, blkNumber; - uint8_t receivedC[2], CRC16_F = 0, i; - uint32_t errors = 0, ackReceived = 0, size = 0, pktSize; + uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD]; + uint8_t FileName[FILE_NAME_LENGTH]; + uint8_t *buf_ptr, tempCheckSum ; + uint16_t tempCRC, blkNumber; + uint8_t receivedC[2], CRC16_F = 0, i; + uint32_t errors = 0, ackReceived = 0, size = 0, pktSize; - for (i = 0; i < (FILE_NAME_LENGTH - 1); i++) + for (i = 0; i < (FILE_NAME_LENGTH - 1); i++) + { + FileName[i] = sendFileName[i]; + } + CRC16_F = 1; + + /* Prepare first block */ + Ymodem_PrepareIntialPacket(&packet_data[0], FileName, &sizeFile); + + do + { + /* Send Packet */ + Ymodem_SendPacket(packet_data, PACKET_SIZE + PACKET_HEADER); + + /* Send CRC or Check Sum based on CRC16_F */ + if (CRC16_F) { - FileName[i] = sendFileName[i]; + tempCRC = Cal_CRC16(&packet_data[3], PACKET_SIZE); + Send_Byte(tempCRC >> 8); + Send_Byte(tempCRC & 0xFF); } - CRC16_F = 1; - - /* Prepare first block */ - Ymodem_PrepareIntialPacket(&packet_data[0], FileName, &sizeFile); - - do + else { - /* Send Packet */ - Ymodem_SendPacket(packet_data, PACKET_SIZE + PACKET_HEADER); - - /* Send CRC or Check Sum based on CRC16_F */ - if (CRC16_F) - { - tempCRC = Cal_CRC16(&packet_data[3], PACKET_SIZE); - Send_Byte(tempCRC >> 8); - Send_Byte(tempCRC & 0xFF); - } - else - { - tempCheckSum = CalChecksum (&packet_data[3], PACKET_SIZE); - Send_Byte(tempCheckSum); - } - - /* Wait for Ack and 'C' */ - if (Receive_Byte(&receivedC[0], 1000000) == 0) - { - if (receivedC[0] == ACK) - { - /* Packet transfered correctly */ - ackReceived = 1; - } - } - else - { - errors++; - } - } while (!ackReceived && (errors < 0x0A));//校验错误重发 - - if (errors >= 0x0A) - { - return errors; + tempCheckSum = CalChecksum (&packet_data[3], PACKET_SIZE); + Send_Byte(tempCheckSum); } - buf_ptr = buf; - size = sizeFile; - blkNumber = 0x01; - - /* Here 1024 bytes package is used to send the packets */ - while (size) + + /* Wait for Ack and 'C' */ + if (Receive_Byte(&receivedC[0], 1000000) == 0) { - /* Prepare next packet */ - Ymodem_PreparePacket(buf_ptr, &packet_data[0], blkNumber, size); - ackReceived = 0; - receivedC[0]= 0; - errors = 0; - do - { - /* Send next packet */ - if (size >= PACKET_1K_SIZE) - { - pktSize = PACKET_1K_SIZE; - - } - else - { - pktSize = PACKET_SIZE; - } - Ymodem_SendPacket(packet_data, pktSize + PACKET_HEADER); - /* Send CRC or Check Sum based on CRC16_F */ - if (CRC16_F) - { - tempCRC = Cal_CRC16(&packet_data[3], pktSize); - Send_Byte(tempCRC >> 8); - Send_Byte(tempCRC & 0xFF); - } - else - { - tempCheckSum = CalChecksum (&packet_data[3], pktSize); - Send_Byte(tempCheckSum); - } - - /* Wait for Ack */ - if (Receive_Byte(&receivedC[0], 1000000) == 0) - { if (receivedC[0] == ACK) - { - ackReceived = 1; - if (size > pktSize) - { - buf_ptr += pktSize; - size -= pktSize; - if (blkNumber == (APP_CONFIG_APPLICATION_SIZE/1024)) - { - return 0xFF; /* error */ - } - else - { - blkNumber++; - } - } - else - { - buf_ptr += pktSize; - size = 0; - } - } - } - else - { - errors++; - } - } while(!ackReceived && (errors < 0x0A)); - - /* Resend packet if NAK for a count of 10 else end of commuincation */ - if (errors >= 0x0A) - { - return errors; - } - + if (receivedC[0] == ACK) + { + /* Packet transfered correctly */ + ackReceived = 1; + } } + else + { + errors++; + } + }while (!ackReceived && (errors < 0x0A));//校验错误重发 + + if (errors >= 0x0A) + { + return errors; + } + buf_ptr = buf; + size = sizeFile; + blkNumber = 0x01; + + /* Here 1024 bytes package is used to send the packets */ + while (size) + { + /* Prepare next packet */ + Ymodem_PreparePacket(buf_ptr, &packet_data[0], blkNumber, size); ackReceived = 0; - receivedC[0] = 0x00; - receivedC[1] = 0x00; + receivedC[0]= 0; errors = 0; do { - Send_Byte(EOT); - /* Send (EOT); */ - /* Wait for Ack */ - //receivedC[0] = (uint16_t)(USART1->DR & (uint16_t)0x01FF); MK8000修改 - receivedC[0]= (uint16_t)(uart_handle[1].base->RX_DATA&(uint16_t)0x01FF); - if (receivedC[0] == ACK) + /* Send next packet */ + if (size >= PACKET_1K_SIZE) + { + pktSize = PACKET_1K_SIZE; + + } + else + { + pktSize = PACKET_SIZE; + } + Ymodem_SendPacket(packet_data, pktSize + PACKET_HEADER); + /* Send CRC or Check Sum based on CRC16_F */ + if (CRC16_F) + { + tempCRC = Cal_CRC16(&packet_data[3], pktSize); + Send_Byte(tempCRC >> 8); + Send_Byte(tempCRC & 0xFF); + } + else + { + tempCheckSum = CalChecksum (&packet_data[3], pktSize); + Send_Byte(tempCheckSum); + } + + /* Wait for Ack */ + if (Receive_Byte(&receivedC[0], 1000000) == 0) + { if (receivedC[0] == ACK) + { + ackReceived = 1; + if (size > pktSize) { - ackReceived = 1; - } - - else - { - errors++; - } - /* Clear Overrun flag of the USART2 */ - //__HAL_UART_CLEAR_OREFLAG(&huart1); MK8000修改 - // USART_ClearFlag(USART1, UART_FLAG_ORE); - } while (!ackReceived && (errors < 0x0A)); - - if (errors >= 0x0A) - { - return errors; - } - - /* Last packet preparation */ - ackReceived = 0; - receivedC[0] = 0x00; - receivedC[1] = 0x00; - errors = 0; - - packet_data[0] = SOH; - packet_data[1] = 0; - packet_data [2] = 0xFF; - - for (i = PACKET_HEADER; i < (PACKET_SIZE + PACKET_HEADER); i++) - { - packet_data [i] = 0x00; - } - - do - { - /* Send Packet */ - Ymodem_SendPacket(packet_data, PACKET_SIZE + PACKET_HEADER); - - /* Send CRC or Check Sum based on CRC16_F */ - tempCRC = Cal_CRC16(&packet_data[3], PACKET_SIZE); - Send_Byte(tempCRC >> 8); - Send_Byte(tempCRC & 0xFF); - - /* Wait for Ack and 'C' */ - if (Receive_Byte(&receivedC[1], 1000000) == 0) - { - if (receivedC[1] == ACK) - { - /* Packet transfered correctly */ - ackReceived = 1; - } + buf_ptr += pktSize; + size -= pktSize; + if (blkNumber == (APP_CONFIG_APPLICATION_SIZE/1024)) + { + return 0xFF; /* error */ + } + else + { + blkNumber++; + } } else { - errors++; + buf_ptr += pktSize; + size = 0; } - } while (!ackReceived && (errors < 0x0A)); - - /* Resend packet if NAK for a count of 10 else end of commuincation */ + } + } + else + { + errors++; + } + }while(!ackReceived && (errors < 0x0A)); + + /* Resend packet if NAK for a count of 10 else end of commuincation */ if (errors >= 0x0A) { - return errors; + return errors; } - receivedC[0] = 0x00; - do + + } + ackReceived = 0; + receivedC[0] = 0x00; + receivedC[1] = 0x00; + errors = 0; + do + { + Send_Byte(EOT); + /* Send (EOT); */ + /* Wait for Ack */ + //receivedC[0] = (uint16_t)(USART1->DR & (uint16_t)0x01FF); MK8000修改 + receivedC[0]= (uint16_t)(uart_handle[1].base->RX_DATA&(uint16_t)0x01FF); + if (receivedC[0] == ACK) { - Send_Byte(EOT); - /* Send (EOT); */ - /* Wait for Ack */ - if ((Receive_Byte(&receivedC[0], 1000000) == 0) && receivedC[0] == ACK) - { - ackReceived = 1; - } - - else - { - errors++; - } - /* Clear Overrun flag of the USART2 */ - // __HAL_UART_CLEAR_OREFLAG(&huart1); MK8000修改 - } while (!ackReceived && (errors < 0x0A)); - - if (errors >= 0x0A) + ackReceived = 1; + } + + else { - return errors; + errors++; } - return 0; /* file trasmitted successfully */ + /* Clear Overrun flag of the USART2 */ + //__HAL_UART_CLEAR_OREFLAG(&huart1); MK8000修改 + // USART_ClearFlag(USART1, UART_FLAG_ORE); + }while (!ackReceived && (errors < 0x0A)); + + if (errors >= 0x0A) + { + return errors; + } + + /* Last packet preparation */ + ackReceived = 0; + receivedC[0] = 0x00; + receivedC[1] = 0x00; + errors = 0; + + packet_data[0] = SOH; + packet_data[1] = 0; + packet_data [2] = 0xFF; + + for (i = PACKET_HEADER; i < (PACKET_SIZE + PACKET_HEADER); i++) + { + packet_data [i] = 0x00; + } + + do + { + /* Send Packet */ + Ymodem_SendPacket(packet_data, PACKET_SIZE + PACKET_HEADER); + + /* Send CRC or Check Sum based on CRC16_F */ + tempCRC = Cal_CRC16(&packet_data[3], PACKET_SIZE); + Send_Byte(tempCRC >> 8); + Send_Byte(tempCRC & 0xFF); + + /* Wait for Ack and 'C' */ + if (Receive_Byte(&receivedC[1], 1000000) == 0) + { + if (receivedC[1] == ACK) + { + /* Packet transfered correctly */ + ackReceived = 1; + } + } + else + { + errors++; + } + }while (!ackReceived && (errors < 0x0A)); + + /* Resend packet if NAK for a count of 10 else end of commuincation */ + if (errors >= 0x0A) + { + return errors; + } + receivedC[0] = 0x00; + do + { + Send_Byte(EOT); + /* Send (EOT); */ + /* Wait for Ack */ + if ((Receive_Byte(&receivedC[0], 1000000) == 0) && receivedC[0] == ACK) + { + ackReceived = 1; + } + + else + { + errors++; + } + /* Clear Overrun flag of the USART2 */ + // __HAL_UART_CLEAR_OREFLAG(&huart1); MK8000修改 + }while (!ackReceived && (errors < 0x0A)); + + if (errors >= 0x0A) + { + return errors; + } + return 0; /* file trasmitted successfully */ } /** -- Gitblit v1.9.3