
实现IAP功能,使用cubeide生成APP程序的bin文件写入Flash之后,无法跳转到APP程序中。 但是使用KEIL编译生成的bin文件写入FLASH之后,可以正常执行。 在检查栈顶地址是否合法的那一步不通过。APP程序还需要修改哪些地方 Boot Loader部分代码: /*****************************************************************************************/ <span]{ <span] if(((*(volatile uint32_t *)APP_Address) & 0x2FFE0000) == 0x20000000) { <span] printf("\n APP Yes \n"); <span] { iap_load_app(); <span] } } <span] else { <span] printf("\n APP No 01 \n"); } <span]} else <span]{ <span]} <span]跳转: typedef void (*IAP_Fun)(void);IAP_Fun JumpApp; void iap_load_app() { /* 检查栈顶地址是否合法 */ if(((*(__IO uint32_t *)APP_Address) & 0x2FFE0000) == 0x20000000) { HAL_Delay(500); HAL_RCC_DeInit(); HAL_DeInit(); __disable_irq(); JumpApp = (IAP_Fun)*(__IO uint32_t *)(APP_Address + 4); __set_MSP(*(__IO uint32_t *)APP_Address); JumpApp(); } else { printf("\n Address error 01 \n"); } printf("\n Jump App error 01 \n"); } /*****************************************************************************************/ APP程序: /*****************************************************************************************/ #define APP_Address 0x08020000 int main(void) { /* USER CODE BEGIN 1 */ SCB->VTOR = APP_Address; __enable_irq(); uint16_t i = 0; uint8_t updata_cmd[7] = {0xF5, 0x00, 0xeb, 0x00, 0x00, 0xe0, 0xfa}; uint8_t temp_buf[7] = {0}; /* 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 */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_USB_DEVICE_Init(); MX_TIM14_Init(); MX_USART6_UART_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if(USB_RxIndex > 0) { memcpy(temp_buf, USB_RxBuf, 7); /* F5 00 eb 00 00 e0 fa */ if(strcmp((char *)updata_cmd, (char *)temp_buf) == 0) { for (i = 0; i < 8; i++) { NVIC->ICER=0xFFFFFFFF; NVIC->ICPR=0xFFFFFFFF; } NVIC_SystemReset(); // 复位单片机 } printf("\nrx:"); for(i = 0; i < USB_RxIndex; i++) { if(temp_buf > 0x0F) printf("%x ", temp_buf); else printf("0%x ", temp_buf); } printf("\n"); USB_RxIndex = 0; } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /*****************************************************************************************/ STM32F407ZGTX_FLASH.ld中修改 /*****************************************************************************************/ /* Memories definition */ MEMORY { CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K FLASH (rx) : ORIGIN = 0x08020000, LENGTH = 896K } /*****************************************************************************************/ 看网上的历程好像也只是添加了 SCB->VTOR = APP_Address; 和修改了STM32F407ZGTX_FLASH.ld中的FLASH。 |
CUEBIDE生成的APP程序,在写入FLASH之后无法正常跳转。
Cubeide1.18.1在线调试改变"现场表达式"中的值提示找不到地址
stm32驱动st7735屏幕区分地图上的障碍物.
stm32cubumx使用1.28.0固件包无法初始化fsmc
STM32 touch 4.24.2 生成代码,但是keil编译不通过问题 求助
stm32cubeIDE使用malloc失败
stm32cubeide中如何查看版本日志?
最新版STM32CubeIDE无法安装
STM32CubeIDE能直接在软件中升级吗?
cubeide登录不了,软件连不上网