📄 ymodem.c
字号:
SCU_AHBPeriphClockConfig(__FMI, ENABLE);
SCU_AHBPeriphReset(__FMI, DISABLE);
if (size <= 0xFFFF)
{ /* Disable S0 write protection and erase it */
FMI_WriteProtectionCmd(FMI_B0S0, DISABLE);
FMI_EraseSector(FMI_B0S0);
}
else if (size <= 0x1FFFF)
{ /* Disable S0 and S1 write protection and erase them */
FMI_WriteProtectionCmd(FMI_B0S0, DISABLE);
FMI_EraseSector(FMI_B0S0);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S1);
}
else if (size <= 0x2FFFF)
{ /* Disable S0, S1 and S2 write protection then erase them */
FMI_WriteProtectionCmd(FMI_B0S0, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S1, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S2, DISABLE);
FMI_EraseSector(FMI_B0S0);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S1);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S2);
}
else if (size <= 0x3FFFF)
{ /* Disable S0, S1, S2 and S3 write protection then erase them */
FMI_WriteProtectionCmd(FMI_B0S0, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S1, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S2, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S3, DISABLE);
FMI_EraseSector(FMI_B0S0);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S1);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S2);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S3);
}
else if (size <= 0x4FFFF)
{ /* Disable S0, S1, S2, S3 and S4 write protection then erase them */
FMI_WriteProtectionCmd(FMI_B0S0, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S1, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S2, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S3, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S4, DISABLE);
FMI_EraseSector(FMI_B0S0);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S1);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S2);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S3);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S4);
}
else if (size <= 0x5FFFF)
{ /* Disable S0, S1, S2, S3, S4 and S5 write protection then erase them */
FMI_WriteProtectionCmd(FMI_B0S0, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S1, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S2, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S3, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S4, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S5, DISABLE);
FMI_EraseSector(FMI_B0S0);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S1);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S2);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S3);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S4);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S5);
}
else if (size <= 0x6FFFF)
{ /* Disable S0, S1, S2, S3, S4, S5 and S6 write protection then erase them */
FMI_WriteProtectionCmd(FMI_B0S0, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S1, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S2, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S3, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S4, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S5, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S6, DISABLE);
FMI_EraseSector(FMI_B0S0);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S1);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S2);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S3);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S4);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S5);
FMI_WaitForLastOperation(FMI_BANK_0);
FMI_EraseSector(FMI_B0S6);
}
else/* (size <= 0x7FFFF) */
{
/* Disable all Bank 0 sectors write protection then erase bank0 */
FMI_WriteProtectionCmd(FMI_B0S0, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S1, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S2, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S3, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S4, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S5, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S6, DISABLE);
FMI_WriteProtectionCmd(FMI_B0S7, DISABLE);
FMI_EraseBank(FMI_BANK_0);
}
FMI_WaitForLastOperation(FMI_BANK_0);
Send_Byte(ACK);
Send_Byte(CRC16);
}
else /* Filename packet is empty; end session */
{
Send_Byte(ACK);
file_done = 1;
session_done = 1;
break;
}
}
else /* Data packet */
{
memcpy(buf_ptr, packet_data + PACKET_HEADER, packet_length);
Ram_Source = 0x4002000;
for (j = 0;(j < packet_length) && (Flash_Destination < ApplicationAddress + size);j += 2)
{
/* Program the data received into STR91x Flash */
FMI_WriteHalfWord(Flash_Destination, *(u16*)Ram_Source);
FMI_WaitForLastOperation(FMI_BANK_0);
if (*(u16*)Flash_Destination != *(u16*)Ram_Source)
{
/* End session */
Send_Byte(CA);
Send_Byte(CA);
return -2;
}
Flash_Destination += 2;
Ram_Source += 2;
}
Send_Byte(ACK);
}
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;
}
}
if (session_done != 0)
{
break;
}
}
return (s32)size;
}
/*******************(C)COPYRIGHT 2006 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -