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();
用CubeMX NUCLEO-F042做了个项目测试了下,没有什么,主要是就是设置IRAM1的起始地址为:0x200000C0
只在我自己的工程中增加了定义:
/* 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
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE);
换成:
__HAL_RCC_SYSCFG_CLK_ENABLE();
试试.
另外参考这篇文章: http://blog.csdn.net/flydream0/article/details/52808191 非常感谢你的回复,那个文章也写得很详细,这个文章之前我一直找都没找到,真太感谢你了。只是我在实际试验中还是不行,还没跑到VectorTable = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));这个语句,在SystemClock_Config就已经挂了 调试每次都是跑到这个位置: 0x080000E6 E7FE B 0x080000E6]; @0x080000E8 很可惜@ 我还在继续调整中,非常感谢你的回复。 在说一点,改为:
/* 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程序再更新应用程序进去后就不运行了 ,是否需要我上传源代码一起看看? 上传源码看看,有时候片断不能看出问题所在。 感觉跟你的IAP程序有关,由没有调用__set_MSP(),看看你的跳转语句?
另外工程配置需要注意下,参考:http://blog.csdn.net/flydream0/article/details/52058601 上传API和应用源代码,谢谢大家一起讨论! 看了下,应该是SystemInit()函数问题,从IAP跳转到APP后第一件事情就是需要立即重置VectorTable,你的SystemInit()并没有做这事,于是产生的系统中断还是使用IAP中的向量,结果....
解决方法:使用官方默认的system_stm32f0xx.c文件,并不需要去修改systemint()函数。
你再试下。