luscu 发表于 2016-11-24 09:52:25

任风吹吹 发表于 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();

luscu 发表于 2016-11-24 10:00:14

问题已经解决。总结如下:
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();
谢谢大家!

任风吹吹 发表于 2016-11-24 10:15:16

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

luscu 发表于 2016-11-24 11:46:06

任风吹吹 发表于 2016-11-24 10:15
楼主,STM32程序的启动并不是一开始就进入main函数的,而是SystemInit,你看下S文件:
; Reset handler rou ...

SystemInit()函数我是使用CUBEMX生产的,没有修改,那按这个分析,开机启动先进入SystemInit(),在入main前这个时候如果出现中断,产生的系统中断还是使用IAP中的向量 就会异常。现在我实际调试 进入SystemInit()一直到进入main没遇到中断,所以就没问题!我说的对吧?
谢谢你细心分析!

xhzheng 发表于 2016-11-24 13:15:56

学习了;
页: 1 2 [3]
查看完整版本: STM32F030 API 功能 基于CUBE库工程移植失败