任风吹吹 发表于 2016-11-23 16:18
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE);
换成:
__HAL_RCC_SYSCFG_CLK_ENABLE();
你说的:从IAP跳转到APP后第一件事情就是需要立即重置VectorTable 这个是对的!试验成功。
但是这个文章并不是立即重置VectorTable ,我按照博客的顺序试验不成功! 按照分析是你说的对!
我改为:
int main(void)
{
/* USER CODE BEGIN 1 */
uint32_t i = 0;
for(i = 0; i < 48; i++)
{
VectorTable = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
}
__HAL_RCC_SYSCFG_CLK_ENABLE();
/* Remap SRAM at 0x00000000 */
__HAL_SYSCFG_REMAPMEMORY_SRAM();
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
问题已经解决。总结如下:
1、API工程只需修改目标器件即可。其他基本不需要修改。
2、APP工程的 flash的起始地址改为:0x8003000, IRAM1的起始地址也是改为:0x200000C0。
注意:从IAP跳转到APP后第一件事情就是需要立即重置VectorTable,具体参考如下:
int main(void)
{
/* USER CODE BEGIN 1 */
uint32_t i = 0;
for(i = 0; i < 48; i++)
{
VectorTable = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
}
__HAL_RCC_SYSCFG_CLK_ENABLE();
/* Remap SRAM at 0x00000000 */
__HAL_SYSCFG_REMAPMEMORY_SRAM();
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
谢谢大家!
luscu 发表于 2016-11-24 10:00
问题已经解决。总结如下:
1、API工程只需修改目标器件即可。其他基本不需要修改。
2、APP工程的 flash的 ...
楼主,STM32程序的启动并不是一开始就进入main函数的,而是SystemInit,你看下S文件:
; Reset handler routine
Reset_Handler PROC
EXPORTReset_Handler
IMPORT__main
IMPORTSystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
任风吹吹 发表于 2016-11-24 10:15
楼主,STM32程序的启动并不是一开始就进入main函数的,而是SystemInit,你看下S文件:
; Reset handler rou ...
SystemInit()函数我是使用CUBEMX生产的,没有修改,那按这个分析,开机启动先进入SystemInit(),在入main前这个时候如果出现中断,产生的系统中断还是使用IAP中的向量 就会异常。现在我实际调试 进入SystemInit()一直到进入main没遇到中断,所以就没问题!我说的对吧?
谢谢你细心分析!
学习了;