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

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管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版