STM32/STM8技术论坛
直播中

liyancao001

12年用户 47经验值
私信 关注
[问答]

STM32 BOOT跳转到APP后初始化完后成死机 用了FREERTOS

使用STM32CUBEMX建的工程,BOOT和APP都是用了FREERTOS,然后跳转到APP是正常的,但是死在MX_FREERTOS_Init();

求指点啊,之前做过CAN的IAP,运行正常,现在弄串口结果不行了。。。

我在MX_FREERTOS_Init();里面加了串口打印,函数下面也加了,发现里面需要打印的数据都是输出正常的,但是到函数下面就不行了。

MX_FREERTOS_Init();//这个函数体里面的最后加了一句串口打印,打印是正常的。。
printf("ADECU_APP_2,0x%X\r\n",SCB->VTOR);//这句一直打印不出来。
/* Start scheduler */
osKernelStart();

其中BOOT跳转前把中断也都关了

APP相比没做IAP之前,就增加了2项:(没做IAP之前程序运行正常)

1)MAIN开头的中断向量偏移

int main(void)
{
  /* USER CODE BEGIN 1 */
    SCB->VTOR = FLASH_BASE | 0x80000;//设置偏移量

2)option for target里把IROM1的起始地址改为了0x8080000,start改为了0x40000

而BOOT跳转函数如下:

void iap_load_app(uint32_t appxaddr)// 调用时参数为0x08080000
{
if((((vu32)appxaddr)&0x2FF00000)==0x20000000) { //检查栈顶地址是否合法.
HAL_RCC_DeInit();
INTX_DISABLE();
SysTick->CTRL = 0X00;//卡死后新增的,但是没有用,跟上面应该是功能重复的
SysTick->LOAD = 0;//卡死后新增的,但是没有用,跟上面应该是功能重复的
SysTick->VAL = 0;//卡死后新增的,但是没有用,跟上面应该是功能重复的
__disable_irq();//卡死后新增的,但是没有用,跟上面应该是功能重复的

jump2app=(iapfun)*(vu32*)(appxaddr+4);        //用户代码区第二个字为程序开始地址(复位地址)
    MSR_MSP(*(vu32*)appxaddr);                    //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
    jump2app();                                    //跳转到APP.
}

}

回帖(1)

王涛

2024-11-26 17:53:30
从您的描述来看,问题可能出在MX_FREERTOS_Init()函数中,或者在osKernelStart()之后。以下是一些建议来帮助您解决问题:

1. 确保MX_FREERTOS_Init()函数中的所有配置都是正确的,包括任务优先级、堆栈大小等。

2. 检查MX_FREERTOS_Init()函数中的串口初始化代码是否正确。确保串口配置正确,波特率、数据位、停止位等参数与您的硬件相匹配。

3. 在MX_FREERTOS_Init()函数中添加调试信息,例如在关键步骤添加串口打印,以确定问题发生的具体位置。

4. 检查osKernelStart()函数调用是否正确。确保在调用osKernelStart()之前,所有必要的初始化工作已经完成。

5. 检查您的中断配置。确保在跳转到APP后,中断配置正确,并且没有遗漏任何必要的中断处理函数。

6. 尝试使用不同的串口打印函数,例如使用HAL库的HAL_UART_Transmit()函数,以排除串口打印函数本身的问题。

7. 如果问题仍然存在,您可以尝试使用一个简单的FreeRTOS示例项目,逐步添加您的代码,以确定问题的具体原因。

8. 检查您的硬件连接,确保串口TX和RX引脚连接正确,没有短路或接触不良的问题。

希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便我们为您提供更具体的帮助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分