Job_SignsPads/STM32/Code/STM32-IAP/Application/app.c

377 lines
8.8 KiB
C
Raw Normal View History

2025-04-22 02:29:37 +00:00
#include "main.h"
uint8_t send_start_buf[6] = {0xA5, 0x5A, 0x06, 0x00, 0x10, 0x01};
uint8_t get_package_buf[14] = {0xA5, 0x5A, 0x0A, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 2022change
// uint8_t send_over_buf[9] = {0xA5, 0x5A, 0x09, 0x00, 0x12, 0x00, 0x00, 0x00,0x00};//2022change
uint32_t FlashPtr;
typedef void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t packagesSize;
uint8_t rx1_frame_OK;
uint8_t rx1_buff[rx2_buffsize];
uint32_t rx1count;
uint8_t wifi_connect_flg = 0;
uint32_t time_flg = 0;
uint8_t version[4] = {0}; // 2022change
uint32_t current_package; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t upgrade_hand_flg = 0;
uint32_t lastFrameCnt = 0; //<2F><><EFBFBD><EFBFBD>һ֡<D2BB>ֽ<EFBFBD><D6BD><EFBFBD>
uint8_t flash_array[BinPerFrameSize];
uint32_t OPENBL_CRC32_MPEG_2(uint8_t *data, uint32_t length)
{
uint32_t i;
uint32_t crc = 0xffffffff, j = 0;
while ((length--) != 0)
{
crc ^= (uint32_t)data[j] << 24;
j++;
for (i = 0; i < 8; ++i)
{
if ((crc & 0x80000000) != 0)
{
crc = (crc << 1) ^ 0x04C11DB7;
}
else
{
crc <<= 1;
}
}
}
return crc;
}
void CRC_usart1send(uint8_t *data, uint32_t length)
{
uint32_t crc_temp, i;
uint8_t crc[4];
crc_temp = OPENBL_CRC32_MPEG_2(data, length);
crc[0] = (uint8_t)crc_temp;
crc[1] = (uint8_t)(crc_temp >> 8);
crc[2] = (uint8_t)(crc_temp >> 16);
crc[3] = (uint8_t)(crc_temp >> 24);
for (i = 0; i < length; i++)
{
UART_SendByte(USART1, (uint8_t)data[i]);
}
for (i = 0; i < 4; i++)
{
UART_SendByte(USART1, (uint8_t)crc[i]);
}
while (RESET == USART_GetFlagStatus(USART1, USART_FLAG_TC))
;
}
uint8_t flashWrite(uint8_t *data, uint_fast8_t length)
{
static uint8_t buffer;
uint16_t temp, i;
uint_fast8_t index;
uint32_t flashPtr1;
if (length == 0)
return 0;
flashPtr1 = FlashPtr;
FLASH_Unlock();
index = 0;
do
{
if (flashPtr1 & 1)
{
flashPtr1--;
temp = buffer;
}
else
{
temp = data[index++];
};
temp |= data[index++] << 8;
FLASH_ProgramHalfWord(flashPtr1, temp);
flashPtr1 += sizeof(uint16_t);
} while ((length - index) >= 2);
for (i = 0; i < length; i++) //<2F><><EFBFBD><EFBFBD>flashУ<68><D0A3><EFBFBD>Ƿ<EFBFBD>д<EFBFBD><D0B4>
{
if (data[i] != *(uint8_t *)(FlashPtr + i))
return 1; //<2F>д<EFBFBD>
}
FLASH_Lock();
FlashPtr += length;
return 0;
}
void page_flashErase(void) //<2F>β<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
FLASH_Unlock();
FLASH_EraseSector(FLASH_Sector_8, VoltageRange_3);
FLASH_EraseSector(FLASH_Sector_9, VoltageRange_3);
FLASH_Lock();
}
int check_stack_head(unsigned long execAdr)
{
// MBL_APP_EXEC_ADRΪ<52>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ַ<EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ַ<EFBFBD>Ƿ<EFBFBD>Ϊ0x2000xxxx<78><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SRAM<41><4D>
if (((*(__IO uint32_t *)execAdr) & 0x2FFE0000UL) == 0x20000000UL)
return 0;
else
return -1;
}
void flash_write_version(uint8_t *version) // versionΪ4<CEAA><34><EFBFBD>ֽ<EFBFBD>
{
//<2F><>Ҫflash<73>ѽ<EFBFBD><D1BD><EFBFBD>
uint32_t value;
value = *(__IO uint32_t *)version;
FLASH_ProgramWord(FLASH_VERSION_ADDR, value);
}
void execute_app()
{
uint32_t JumpAddress = 0;
uint32_t Jumpadd = FLASH_OLDAPP_ADDR;
USART_DeInit(USART1);
if (upgrade_flag == 1) // 1111--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
Jumpadd = FLASH_APP_ADDR;
}
JumpAddress = *(__IO uint32_t *)(Jumpadd + 4); //<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>ִ洢Ϊ<E6B4A2>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ<EFBFBD><D6B7><EFBFBD>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ָ<EFBFBD>
printf("Jumpadd is %x,JumpAddress is %x,upgrade_flag is %d\r\n", Jumpadd, JumpAddress, upgrade_flag);
Jump_To_Application = (pFunction)JumpAddress;
__set_MSP(*(__IO uint32_t *)Jumpadd); //<2F><>ʼ<EFBFBD><CABC>APP<50><50>ջָ<D5BB><D6B8>(<28>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ַ)
Jump_To_Application(); // <20><><EFBFBD><EFBFBD>PCָ<43><D6B8>Ϊ<EFBFBD>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>жϺ<D0B6><CFBA><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ
}
void upgrade_menu(void)
{
uint8_t error;
switch (upgrade_hand_flg)
{
case 0x01: //<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ݰ<EFBFBD>
upgrade_hand_flg = 0x00; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD>־λ<D6BE><CEBB>0
get_package_buf[6] = (uint8_t)current_package;
get_package_buf[7] = (uint8_t)(current_package >> 8); // 2022change
get_package_buf[8] = (uint8_t)(current_package >> 16);
get_package_buf[9] = (uint8_t)(current_package >> 24);
// time_flg = resent_time;//<2F><><EFBFBD>¼<EFBFBD>ʱ
CRC_usart1send(get_package_buf, 9); // 2022change
break;
case 0x02: //д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
error = flashWrite(flash_array, BinPerFrameSize); //д<><D0B4>flash,<2C>̶<EFBFBD>һ<EFBFBD><D2BB>д256<35><36><EFBFBD>ֽ<EFBFBD>
if (1 == error) //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
page_flashErase();
NVIC_SystemReset();
}
if (0 == lastFrameCnt)
{
current_package += BinPerFrameSize;
upgrade_hand_flg = 0x01; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD>־λ<D6BE><CEBB>0
get_package_buf[5] = 0x01; //<2F>ظ<EFBFBD>OK
}
else //<2F><><EFBFBD><EFBFBD>һ֡<D2BB><D6A1><EFBFBD><EFBFBD>
{
current_package += lastFrameCnt;
upgrade_hand_flg = 0x44; // flash<73><68><EFBFBD>ɱ<EFBFBD>־λ
get_package_buf[5] = 0x03; //<2F>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
}
break;
case 0x44: // Execute The New Program Enter 'D'
// MBL_APP_EXEC_ADRΪ<52>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ַ<EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ַ<EFBFBD>Ƿ<EFBFBD>Ϊ0x2000xxxx<78><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SRAM<41><4D>
if (check_stack_head(FLASH_APP_ADDR) == 0)
{
FLASH_Unlock();
FLASH_EraseSector(FLASH_Sector_2, VoltageRange_3);
FLASH_ProgramWord(FLASH_DATA_FLAG_ADDR, FLASH_START_FLAG); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// flash_write_version(version);
FLASH_Lock();
// send_over_buf[5] = version[0];
// send_over_buf[6] = version[1];
// send_over_buf[7] = version[2];
// send_over_buf[8] = version[3];//2022change
get_package_buf[6] = (uint8_t)current_package;
get_package_buf[7] = (uint8_t)(current_package >> 8);
get_package_buf[8] = (uint8_t)(current_package >> 16);
get_package_buf[9] = (uint8_t)(current_package >> 24);
CRC_usart1send(get_package_buf, 9); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
delay_ms(2);
upgrade_flag = 1;
execute_app(); /*ִ<><D6B4><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>*/
}
break;
case 0x1E: // wifi<66><69><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>
break;
default:
break;
}
}
void boot_ReceiveHdl()
{
uint32_t crcCal, i;
uint8_t crcGet[4];
uint32_t packageNO;
if (rx1_frame_OK)
{
switch (rx1_buff[4])
{
case 0x10: //<2F>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
get_package_buf[5] = 0x01; //<2F>ظ<EFBFBD>OK
CRC_usart1send(send_start_buf, 6);
break;
case 0x11: //<2F><>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>
//<2F><>ȡ<EFBFBD><EFBFBD><E6B1BE>
version[0] = rx1_buff[5];
version[1] = rx1_buff[6];
version[2] = rx1_buff[7];
version[3] = rx1_buff[8]; // 2022change
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD>İ汾<C4B0><E6B1BE>
// get_package_buf[5] = version[0];
// get_package_buf[6] = version[1];
// get_package_buf[7] = version[2];
// get_package_buf[8] = version[3];//2022change
//<2F><>ȡbin<69>ֽ<EFBFBD><D6BD><EFBFBD>
packagesSize = (uint32_t)(rx1_buff[12]) << 24 | (uint32_t)(rx1_buff[11]) << 16 | (uint32_t)(rx1_buff[10]) << 8 | rx1_buff[9];
page_flashErase(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫռ<D2AA>õ<EFBFBD>flash<73>ռ<EFBFBD>
FlashPtr = FLASH_APP_ADDR; //<2F><><EFBFBD>µ<EFBFBD>ַ<EFBFBD><D6B7>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
current_package = 0; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD>0<EFBFBD><30>ʼ
lastFrameCnt = 0;
upgrade_hand_flg = 0x01; //<2F><>ʼ<EFBFBD><CABC>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>־λ
wifi_connect_flg = 1; //ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
case 0x12: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
packageNO = (uint32_t)(rx1_buff[8]) << 24 | (uint32_t)(rx1_buff[7]) << 16 | (uint32_t)(rx1_buff[6]) << 8 | rx1_buff[5];
//<2F><>ȡCRC
crcGet[0] = rx1_buff[rx1count - 4];
crcGet[1] = rx1_buff[rx1count - 3];
crcGet[2] = rx1_buff[rx1count - 2];
crcGet[3] = rx1_buff[rx1count - 1];
crcCal = OPENBL_CRC32_MPEG_2(rx1_buff, rx1count - 4);
if ((*(__IO uint32_t *)crcGet == crcCal) && (packageNO == current_package)) // CRCУ<43><D0A3><EFBFBD>ϸ񡢰<CFB8><F1A1A2B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ
{
for (i = 0; i < BinPerFrameSize; i++)
{
flash_array[i] = rx1_buff[9 + i];
}
upgrade_hand_flg = 0x02; //<2F><>ʼд<CABC><D0B4>flash
if ((rx1count - 13 + current_package) >= packagesSize) //<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>һ֡<D2BB><D6A1><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
{
lastFrameCnt = rx1count - 13;
if (lastFrameCnt < BinPerFrameSize)
{
memset(&flash_array[lastFrameCnt], 0xff, BinPerFrameSize - lastFrameCnt);
}
}
}
else
{
upgrade_hand_flg = 0x01; //<2F><>ʼ<EFBFBD><CABC>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>־λ--<2D><><EFBFBD>¿<EFBFBD>ʼ<EFBFBD><CABC>ȡ
get_package_buf[5] = 0x02; //<2F>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD>»<EFBFBD>ȡ
}
LED_B = 0;
delay_ms(10);
LED_B = 1;
break;
case 0xff: //
NVIC_SystemReset();
break;
default:
break;
}
rx1count = 0;
rx1_frame_OK = 0;
}
}
void USART1_IRQHandler(void) //<2F><><EFBFBD><EFBFBD>1<EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--WIFI
{
static uint8_t rece_step = 0;
static uint16_t templen = 0;
uint8_t receive;
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>(<28><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD>0x0d 0x0a<30><61>β)
{
receive = USART_ReceiveData(USART1); //(USART1->DR); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rx1_buff[rx1count++] = receive;
if (rx1_frame_OK == 1) //û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٷ<EFBFBD><D9B7>Ͷ<EFBFBD><CDB6><EFBFBD>
{
USART_ReceiveData(USART1);
return;
}
switch (rece_step)
{
case 0:
if (receive == 0xa5)
{
rece_step = 1;
rx1count = 1;
}
else
rx1count = 0;
break;
case 1:
if (receive == 0x5a)
{
rx1_buff[0] = 0xa5;
rx1_buff[1] = 0x5a;
rx1count = 2;
rece_step = 2;
}
else
{
if (receive == 0xA5)
{
rece_step = 1;
rx1count = 1;
}
else
rece_step = 0;
}
break;
case 2:
if (rx1count >= 4)
{
templen = (uint16_t)(rx1_buff[3]) << 8 | rx1_buff[2];
rece_step = 3;
}
break;
case 3:
if ((templen >= rx2_buffsize) || rx1count >= rx2_buffsize)
{
rece_step = 0;
rx1count = 0;
}
else if (rx1count >= (4 + templen))
{
rx1_frame_OK = 1;
rece_step = 0;
}
break;
}
}
}