⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ymodem.c

📁 str912芯片的串口烧写程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
                                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 + -