luscu 发表于 2016-11-23 16:04:50

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

我在做STM32F030 API 功能的时候,基于官网的例子可以移植成功,看到LED闪了。然后将APP工程修改到我自己基于CUBE库做的实际工程中发现 在跑到HAL_Init();就跑飞了   官网的例子系统初始化的时候只使能了外设时钟, 并没有其他操作。后面就直接操作IO口了 非常简单!

/* USER CODE BEGIN 1 */
    uint32_t i = 0;
    for(i = 0; i < 48; i++)
{
    VectorTable = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
}
    /* Enable the SYSCFG peripheral clock*/
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* Remap SRAM at 0x00000000 */
SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_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-23 16:04:51

用CubeMX NUCLEO-F042做了个项目测试了下,没有什么,主要是就是设置IRAM1的起始地址为:0x200000C0

luscu 发表于 2016-11-23 16:08:12

只在我自己的工程中增加了定义:
/* Private variables ---------------------------------------------------------*/
#define APPLICATION_ADDRESS   (uint32_t)0x08003000

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static __IO uint32_t TimingDelay;

#if   (defined ( __CC_ARM ))
__IO uint32_t VectorTable __attribute__((at(0x20000000)));
#elif (defined (__ICCARM__))
#pragma location = 0x20000000
__no_init __IO uint32_t VectorTable;
#elif defined   (__GNUC__)
__IO uint32_t VectorTable __attribute__((section(".RAMVectorTable")));
#elif defined ( __TASKING__ )
__IO uint32_t VectorTable __at(0x20000000);
#endif

for(i = 0; i < 48; i++)
{
    VectorTable = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
}
同时修改IAP存放在内置FLASH的0x8000000的起始位置0x8003000

任风吹吹 发表于 2016-11-23 16:18:02

RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE);
换成:
__HAL_RCC_SYSCFG_CLK_ENABLE();
试试.

另外参考这篇文章: http://blog.csdn.net/flydream0/article/details/52808191

luscu 发表于 2016-11-23 17:01:21

非常感谢你的回复,那个文章也写得很详细,这个文章之前我一直找都没找到,真太感谢你了。只是我在实际试验中还是不行,还没跑到VectorTable = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));这个语句,在SystemClock_Config就已经挂了 调试每次都是跑到这个位置: 0x080000E6 E7FE      B      0x080000E6]; @0x080000E8   很可惜@            我还在继续调整中,非常感谢你的回复。

luscu 发表于 2016-11-23 17:09:24

在说一点,改为:
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* Configure the system clock */
SystemClock_Config();

      for(i = 0; i < 48; i++)
{
    VectorTable = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
}

/* Enable the SYSCFG peripheral clock*/
__HAL_RCC_SYSCFG_CLK_ENABLE();
/* Remap SRAM at 0x00000000 */
__HAL_SYSCFG_REMAPMEMORY_SRAM();

后,MCU没有烧录BOOT程序单独烧录这个应用程序是可以自己运行的,加了BOOT程序再更新应用程序进去后就不运行了 ,是否需要我上传源代码一起看看?

党国特派员 发表于 2016-11-23 17:16:45

上传源码看看,有时候片断不能看出问题所在。

任风吹吹 发表于 2016-11-23 17:25:05

感觉跟你的IAP程序有关,由没有调用__set_MSP(),看看你的跳转语句?

另外工程配置需要注意下,参考:http://blog.csdn.net/flydream0/article/details/52058601

luscu 发表于 2016-11-23 17:32:02

上传API和应用源代码,谢谢大家一起讨论!

任风吹吹 发表于 2016-11-23 18:01:35

看了下,应该是SystemInit()函数问题,从IAP跳转到APP后第一件事情就是需要立即重置VectorTable,你的SystemInit()并没有做这事,于是产生的系统中断还是使用IAP中的向量,结果....

解决方法:使用官方默认的system_stm32f0xx.c文件,并不需要去修改systemint()函数。

你再试下。
页: [1] 2 3
查看完整版本: STM32F030 API 功能 基于CUBE库工程移植失败