|

楼主 |
发表于 2024-12-10 10:02:27
|
显示全部楼层
memcpy(vector_t, (void*)0x08000000, 0x298);
SCB->VTOR = 0x24001000;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
// 使能DWT外设
DEMCR |= (uint32_t)DEM_CR_TRCENA;
// DWT CYCCNT寄存器计数清0
DWT_CYCCNT = (uint32_t)0U;
// 使能 DWT CYCCNT寄存器
DWT_CTRL |= (uint32_t)DWT_CR_CYCCNTENA;
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("start\r\n");
startTick = HAL_GetTick();
do
{
usedTick = HAL_GetTick() - startTick;
} while (usedTick < 2000 && buffer1_write_flash_flag == 0U);
startTick = ((uint32_t)DWT_CYCCNT);
if(buffer1_write_flash_flag == 1)
{
if(firstFlag == 1U)
{
if(((*(__IO uint32_t*)(0x24020000 + 4)) & 0xFF000000) != 0x08000000)
{
printf("The application is invalid.\r\n");
printf("Loading the original application.\r\n");
iap_load_app(APP_ADDR_START);
}
}
iap_write_appbin(addrToWriteNow_main, uartRxBuffer1, UART_RX_MAX_BYTES);
buffer1_write_flash_flag = 0U;
addrToWriteNow_main += UART_RX_MAX_BYTES;
// usedTick = ((uint32_t)DWT_CYCCNT) - startTick;
// printf("128k:%d, %d\r\n", usedTick / (SystemCoreClock / 1000000U), uartRxBytes);
while(1)
{
startTick = HAL_GetTick();
do
{
usedTick = HAL_GetTick() - startTick;
} while (usedTick < 2000 && buffer1_write_flash_flag == 0U && buffer2_write_flash_flag == 0U && uartRxBytes != 1966080U);
if(buffer1_write_flash_flag == 1U)
{
iap_write_appbin(addrToWriteNow_main, uartRxBuffer1, UART_RX_MAX_BYTES);
buffer1_write_flash_flag = 0U;
addrToWriteNow_main += UART_RX_MAX_BYTES;
printf("1\r\n");
}
else if(buffer2_write_flash_flag == 1U)
{
iap_write_appbin(addrToWriteNow_main, uartRxBuffer2, UART_RX_MAX_BYTES);
buffer2_write_flash_flag = 0U;
addrToWriteNow_main += UART_RX_MAX_BYTES;
printf("2\r\n");
}
else if(uartRxBytes == 1966080U)
{
break;
}
else
{
printf("%d\r\n", uartRxBytes);
break;
}
}
printf("uartRxBytes : %d\r\n", uartRxBytes);
HAL_Delay(100);
printf("Loading the new application.\r\n");
iap_load_app(APP_ADDR_START);
}
else
{
printf("No serial port data received. %d\r\n", uartRxBytes);
printf("Loading the original application.\r\n");
iap_load_app(APP_ADDR_START);
}
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
printf("Please reset and then transmit the application through the serial port again.\r\n");
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
} |
|