请教大侠: bootloader裸机,实现串口数据接收与FLASH烧写; APP使用MDK自带的RTX做系统,实现点灯功能; 问题: 当跳转到APP程序执行完启动文件的SystemInit函数后,再执行__main函数就会死机。 具体是因为__main会去执行RTOS的初始化,函数如下: osKernelInitialize(); osThreadCreate(&os_thread_def_main, NULL); osKernelStart(); 在执行osKernelStart();时死机。 如果APP不做IAP,烧录不做地址偏移,可以顺利执行。 如果APP使用IAP,设置物理地址偏移,但不使用RTX系统,也能顺利执行。 网上的很多说法都尝试过,例如关闭总中断,设置SCB->VTOR。但仍无法解决。 |
STM32F407 定时器触发DMA 求助大神
【MCU实战经验】基于STM32F407的音频播放器设计
盘古UE-STM32F407工控板原理图
【STM32F429心得\疑问】+STM32F4之FSMC和FMC
STM32F429读取IO口传输的数据速率
STM32F407ZGT6 手摸芯片背部重启
STM32F4 SPI 动作时,软件片选信号被拉高,IO口程序逻辑失控
STM32F401RE NUCLEO求助,串口一直不能进中断
读取STM32F407内部温度传感器值错误
STM32F429多路内部ADC独立采集的办法
原因:如问题中描述,当启动文件执行到__main会去执行RTOS的初始化(RTX官方搞的代码,改不了),到osKernelStart();会死机是因为它需要中断服务
解决:bootloader跳转前,需要开启全局中断
缺点:要更改官方文件system_stm32f4xx.c中的地址偏移(VECT_TAB_OFFSET)。因为启动文件的系统初始化函数会设置SCB->VTOR,而后紧接着初始化RTOS,需要使用中断,所以在bootloader跳转前设置,或者在APP的main里面设置,都不可行。
就是将每个任务的分配堆栈(Stack Size)调大,原来我设置64Words跑飞的,设置到128Words就正常跑通了。
(2)MDK的option->target 配置IROM1,例如将中断向量表偏移地址改到0x8005000,在MDK的option->target 配置IROM1为0x8005000
(3)设置system_stm32f1xx.c文件 #define VECT_TAB_OFFSET 0x5000
评分
查看全部评分
经过一天的研究发现,bootloader勾选了RTX,且#include "cmsis_os.h",跳转时开启中断,在APP那边也是会死机的,bootloader不选RTX,注释include,则能成功。或者关闭中断再跳转,在APP的系统初始化函数结束前,开启中断,也可以。
现在问题基本解决。估计后面从APP跳转到bootloader也需要关注这个中断的问题。
先谢谢的的回答。
已经试过了,没有用,程序还没有调到main函数里面。
RTX也是选择了特权级模式。
但是RTX系统我就没办法了。
可惜不是哎,用的RTX,标准库。你配置FreeRTOS的APP有什么要注意设置的吗?
感谢你的回答,问题基本解决了,主要是RTX的初始化需要开启中断。
关中断了,怎么进去串口中断接收数据?
IAP不是需要bootloader里面接收APP的数据来更新的吗?
难道是在APP中接收串口数据来更新吗?(好像我也这么做过)
是的,一般来说跳转前关闭中断,但是APP的RTX系统初始化要开中断,所以要在启动文件加载的那个系统初始化函数结束前,开中断。
我现在用的是ST官网改来的bootloader代码,没有用中断,用查询的方式接受串口数据的
https://www.stmcu.org.cn/module/ ... p;extra=#pid2449041