Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
app
bootload跳转到app
Bootloader
10
hc32f460自己写了个bootloader,rt-thead app就无法运行哪位大佬知道问题点吗
发布于 2023-06-15 14:38:38 浏览:1296
订阅该版
第一步,自己写了bootloader,然后用华大官方库写了一个APP,是没有问题的,SCB->VTOR中断向量已经偏移,华大的偏移函数在SystemInit函数中,SystemInit是在S,汇编文件中调用的,然后才会去到main函数.才会执行rtthread_startup函数。翻了好久rt-thread的源码,也没找到有重复修改SCB->VTOR的地方,特地来论坛求助。 1:不用rt-thread写的app没有问题的; 2:把rt-thread源码编译进来,就跑不了了; 3:取消APP程序,不使用跳转应用程序,不偏移中断向量,带rt-thread的程序是没有问题的,只是出在了偏移rom地址后,无法运行 4:app跳转方式,也不能用debug看在哪里跑错了.
查看更多
红枫
认证专家
2023-06-15
这家伙很懒,什么也没写!
app除须“修改连接配置文件中的Flash起始地址”和“重映射中断向量”外,还须关闭ICG部分参与编译,即要配置DDL_ICG_ENABLE为DDL_OFF ```c #define DDL_ICG_ENABLE (DDL_OFF) ```
3
个回答
默认排序
按发布时间排序
mii
2023-06-16
这家伙很懒,什么也没写!
我使用MDK分散加载文件如下配置,偏移地址是0x00020000 ```c ; **************************************************************** ; Scatter-Loading Description File ; **************************************************************** LR_IROM1 0x00020000 0x00058000 { ; load region size_region ER_IROM1 0x00020000 0x00058000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_IRAM1 0x1FFF8000 0x0002F000 { ; RW data .ANY (+RW +ZI) } } ``` app偏移自己写就是了,参考这个,地址根据自己偏移地址就好了。 ```c /** * Function ota_app_vtor_reconfig * Description Set Vector Table base location to the start addr of app(RT_APP_PART_ADDR). */ static int ota_app_vtor_reconfig(void) { //#define NVIC_VTOR_MASK 0x3FFFFF80 /* Set the Vector Table base location by user application firmware definition */ SCB->VTOR = RT_APP_PART_ADDR ; return 0; } INIT_BOARD_EXPORT(ota_app_vtor_reconfig); ``` boot程序配置,可以参考楼上写的QBOOT代码,其中跟平台相关配置我是这样处理的 ```c /* * qboot_stm32.c * * Change Logs: * Date Author Notes * 2020-08-31 qiyongzhong first version */ #include
#define CHIP_FAMILY_HC32 #define IAP_PERIPH_WP (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \ LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM) #ifdef CHIP_FAMILY_HC32 #include
#include
#include
#include
//#include "hc32_ddl.h" //#define QBOOT_APP_RUN_IN_QSPI_FLASH //#define QBOOT_DEBUG #define QBOOT_USING_LOG #define DBG_TAG "Qboot" #ifdef QBOOT_DEBUG #define DBG_LVL DBG_LOG #else #define DBG_LVL DBG_INFO #endif #ifdef QBOOT_USING_LOG #ifndef DBG_ENABLE #define DBG_ENABLE #endif #ifndef DBG_COLOR #define DBG_COLOR #endif #endif #include
#ifdef QBOOT_APP_RUN_IN_QSPI_FLASH static void qbt_qspi_flash_init(void) { //waiting realize } void qbt_jump_to_app(void) { qbt_qspi_flash_init(); //waiting realize } #else /** * @brief Systick De-Initialize. * @param None * @retval None */ static void SysTick_DeInit(void) { SysTick->CTRL = 0UL; SysTick->LOAD = 0UL; SysTick->VAL = 0UL; } /** * @brief IAP clock De-Initialize. * @param None * @retval None */ void IAP_CLK_DeInit(void) { CLK_SetSysClockSrc(CLK_SYSCLK_SRC_MRC); /* Switch driver ability */ (void)PWC_HighPerformanceToLowSpeed(); /* Set bus clk div. */ CLK_SetClockDiv(CLK_BUS_CLK_ALL, (CLK_HCLK_DIV1 | CLK_EXCLK_DIV1 | CLK_PCLK0_DIV1 | CLK_PCLK1_DIV1 | CLK_PCLK2_DIV1 | CLK_PCLK3_DIV1 | CLK_PCLK4_DIV1)); CLK_XtalCmd(DISABLE); CLK_PLLCmd(DISABLE); /* sram init include read/write wait cycle setting */ SRAM_SetWaitCycle(SRAM_SRAM_ALL, SRAM_WAIT_CYCLE0, SRAM_WAIT_CYCLE0); SRAM_SetWaitCycle(SRAM_SRAMH, SRAM_WAIT_CYCLE0, SRAM_WAIT_CYCLE0); /* 0 cycles */ GPIO_SetReadWaitCycle(GPIO_RD_WAIT0); /* flash read wait cycle setting */ EFM_SetWaitCycle(EFM_WAIT_CYCLE0); } static void qbt_reset_periph(void) { // #define ENABLE_FCG0_REG_WRITE() (M4_MSTP->FCG0PC = 0xa5a50001u) // #define DISABLE_FCG0_REG_WRITE() (M4_MSTP->FCG0PC = 0xa5a50000u) // #define DEFAULT_FCG0 (0xFFFFFAEEul) // #define DEFAULT_FCG1 (0xFFFFFFFFul) // #define DEFAULT_FCG2 (0xFFFFFFFFul) // #define DEFAULT_FCG3 (0xFFFFFFFFul) // ENABLE_FCG0_REG_WRITE(); // M4_MSTP->FCG0 = DEFAULT_FCG0; // M4_MSTP->FCG1 = DEFAULT_FCG1; // M4_MSTP->FCG2 = DEFAULT_FCG2; // M4_MSTP->FCG3 = DEFAULT_FCG3; // DISABLE_FCG0_REG_WRITE(); SysTick_DeInit(); // IAP_CLK_DeInit(); /* Peripheral registers write protected */ EFM_FWMC_Cmd(DISABLE); LL_PERIPH_WP(IAP_PERIPH_WP); } void qbt_jump_to_app(void) { typedef void (*app_func_t)(void); u32 app_addr = QBOOT_APP_ADDR; u32 stk_addr = *((__IO uint32_t *)app_addr); app_func_t app_func = (app_func_t)(*((__IO uint32_t *)(app_addr + 4))); if ((((u32)app_func & 0xff000000) != 0x00000000) || (((stk_addr+0x00010000) & 0x2ff00000) != 0x20000000)) { LOG_E("No legitimate application."); return; } rt_kprintf("Jump to application running ... \n"); rt_thread_mdelay(200); __disable_irq(); qbt_reset_periph(); for(int i=0; i<144; i++) { NVIC_DisableIRQ(i); NVIC_ClearPendingIRQ(i); //enIrqResign(i); } // SysTick->CTRL = 0; // SysTick->LOAD = 0; // SysTick->VAL = 0; // CLK_MrcCmd(Enable); // CLK_SetSysClkSource(ClkSysSrcMRC); // EFM_Unlock(); // EFM_SetLatency(0); // EFM_Lock(); // __set_CONTROL(0); __set_MSP(stk_addr); app_func();//Jump to application running LOG_E("Qboot jump to application fail."); } #endif #endif ``` 跳转时注意时钟切换问题,我是发现在boot跳转前把时钟切换到内部8M,在app切换成外部时钟时,尽管已经检测时钟稳定标志,但实际切换运行不起来。所以我BOOT直接不切换了,直接把BOOT跟APP时针配置得一样。
心无旁骛
2023-11-02
这家伙很懒,什么也没写!
你好,你解决了这个问题吗,我想参考下,谢谢
撰写答案
登录
注册新账号
关注者
0
被浏览
1.3k
关于作者
nczywq
这家伙很懒,什么也没写!
提问
1
回答
1
被采纳
0
关注TA
发私信
相关问题
1
Linux下通过USBTinyISP为Arduino开发板烧?写Bootloader
2
请教修改NVIC后RTT调度函数失效的问题[已解决 bootloader中打开了不必要的中断]
3
进入bootloader的方式探讨
4
求助:IAP里的APP使用的RTT,跳转后出错。[已解决]
5
有没有人在STM32F103上用UART IAP跑过RT-Thread?
6
想做网口的IAP远程升级,不知可不可行
7
IAP问题
8
[已解决]请教基于RTT的IAP程序切换到应用程序不成功的问题(基于STM32F4)?
9
stm32f4xx-----IAP移植APP程序需要注意的地方
10
在调试IAP网络升级遇到跳转之后bootloader程序网络不通
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
a1012112796
13
个答案
1
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部