
实现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。 |
STM32多通道FFT运算异常
CUBEmonitor write panel 变量无法在dashboard上显示
串口重定向接收不同
关于三轴陀螺仪 I3G4250D
安装STM32CUBEIDE时提示Error launching installer,我的电脑设置的是中文简体,杀毒软件也推出了,怎么才能安装软件?
经过光耦之后,脉冲计数功能为啥不能实现?
STM32F407 ADC Dual regular simultaneous only 模式下最高采样率仅 96 kHz,960 kHz 无法工作,求助!
STM32CubeIDE报错
STM32 F407骄阳电机版用DMA双缓存接收串口数据时,上电第一次接收区是memory1而不是memory0?
STM32F407骄阳版用DMA双缓存区接收串口数据,上电第一次接收到的数据在memory1而不是memory0