你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F030 API 功能 基于CUBE库工程移植失败

[复制链接]
luscu 提问时间:2016-11-23 16:04 /
阅读主题, 点击返回1楼
收藏 2 评论24 发布时间:2016-11-23 16:04
24个回答
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[i] = *(__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
                 EXPORT  Reset_Handler                 [WEAK]
        IMPORT  __main
        IMPORT  SystemInit  
                 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
学习了;
123

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版