|
实现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。 |
全球论坛无法登录
STM32U585进入shutdown模式后偶发无法被唤醒引脚唤醒
STM32F407 FLASH写入超过最大空间依旧能成功。
简单聊聊STM32的SPI外设
STM32CUBEIDE登陆报错:this session has expired! Please try to login again by going to myST-login,应如何处理?
update STM32cubeide 到2.0.0版本,找不到pinout view了!? 哪里出错了??
STM32CubeIDE release v2.0.0更新了
有没有好用的日志系统推荐
cubeide的代码怎么编译到内部+外部FLASH里面去
CubeIDE2.0.0更新无法打开.ioc文件
微信公众号
手机版