STM32
直播中

李中宏

7年用户 1307经验值
私信 关注
[问答]

使用CUBE IDE无法通过IAP跳转APP进行软件升级怎么解决?

本人使用的是cubeide 1.7.0版本,单片机STM32F407VET6.在这个IDE工具下,成功实现STM32F103RCT6单片机的升级,却无法实现F407这款芯片的升级,我不确定问题出现在哪,我尝试使用KEIL进行软件编译,下载,在这个工具下F407也能实现IAP升级。

以下是我的IAP具体代码

int main(void)
{
HAL_Init();                       //初始化HAL库  
Stm32_Clock_Init(336,8,2,7);      //设置时钟,168Mhz  
delay_init(168);                   //初始化延时函数
LED_Init();                        //初始化LED  
while(1){    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_RESET);    //PF9置1,默认初始化后灯灭    delay_ms(1000);    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);    //PF10置1,默认初始化后灯灭    delay_ms(1000);    iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码  }}
上面的引导代码使用两个一秒的闪灯进行识别,

我也尝试过直接跳转,代码如下,依然无效,无效说的是无法跳转到IDE生成的APP程序,可以成功跳转KEIL的APP程序。

int main(void)
{
while(1){    iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码  }}
上面的代码中跳转的地址定义的是 :#define FLASH_APP1_ADDR        0x08020000      //第一个应用程序起始地址(存放在FLASH)。代码源码来自正点原子开发板的IAP例程。其中我也尝试过在跳转前关闭全局中断,开启全局中断,或者关闭时钟等各种办法,均无法实现跳转。

//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr) amp;0x2FF00000)==0x20000000)    //检查栈顶地址是否合法.{     Systick- gt;CTRL = 0;                                //关键代码    HAL_DeInit();                                     //可选    HAL_NVIC_DisableIRQ(SysTick_IRQn);                //可选    HAL_NVIC_ClearPendingIRQ(SysTick_IRQn);           //可选    /* Jump to user application */    __disable_irq();    jump2app=(iapfun)*(vu32*)(appxaddr+4);        //用户代码区第二个字为程序开始地址(复位地址)          MSR_MSP(*(vu32*)appxaddr);                    //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)    jump2app();                                    //跳转到APP.}}
以下是我的APP具体代码

int main(void)
{
/ USER CODE BEGIN 1 /
__enable_irq();/ USER CODE END 1 /
/ MCU Configuration--------------------------------------------------------/
/ Reset of all peripherals, Initializes the Flash interface and the Systick. /
HAL_Init();
/ USER CODE BEGIN Init /
/ USER CODE END Init /
/ Configure the system clock /
SystemClock_Config();
/ USER CODE BEGIN SysInit /
/ USER CODE END SysInit /
/ Initialize all configured peripherals /
MX_GPIO_Init();
/ USER CODE BEGIN 2 /
/ USER CODE END 2 /
/ Infinite loop /
/ USER CODE BEGIN WHILE /
while (1)
{
/* USER CODE END WHILE *//* USER CODE BEGIN 3 */    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_RESET);    //PF9�???1,默认初始化后灯�???    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_SET);    //PF10�???1,默认初始化后灯�???    HAL_Delay(500);    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_SET);    //PF9�???1,默认初始化后灯�???    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);    //PF10�???1,默认初始化后灯�???    HAL_Delay(500);}
/ USER CODE END 3 /
}
APP程序中只开启了两个闪灯,未使用FREERTOS系统,即使不开启SystemClock_Config();依然无法跳转。

相比直接生成的代码,我修改了以下三个地方:

第一,在main函数添加__enable_irq();,尝试开启或不使用,没有作用;

第二,在STM32F407VETX_FLASH.ld文件下修改起始地址和长度,原本是

MEMORY
{
CCMRAM    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64K
RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K
FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K
}
修改为

MEMORY
{
CCMRAM    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64K
RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K
FLASH    (rx)    : ORIGIN = 0x8020000,   LENGTH = 384K
}
第三,在system_stm32f4xx.c文件下修改偏移地址,修改后如下:

{
........
define USER_VECT_TAB_ADDRESS

if defined(USER_VECT_TAB_ADDRESS)

更多回帖

×
20
完善资料,
赚取积分