完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
基于STM32Cube_IAP_using_UART编写boot程序时碰到一个奇怪的现象,跳转到新的地址执行APP程序时,APP无法正常执行。但是如果在void GotoApp(void)函数中,在跳转之前对GPIOA或GPIOB或GPIOC任一引脚做任一状态初始化,则可以正常跳转执行。同样的,把这段初始化代码加载APP main函数的第一行,也无法正常执行。看起来,这段初始化只有在boot中才会有作用。 不知各位是否碰到类似的问题,可能得原始是什么?
|
|
相关推荐
15个回答
|
|
|
|
|
|
|
|
|
|
zzy0407 发表于 2018-12-19 14:36 本帖最后由 luankelong 于 2018-1-26 16:43 编辑 1.因为APP修改icf重新设置了地址。在这种情况下,直接仿真实验没有问题。我修改icf ROM地址为0x08000 0000,直接下载不通过bootloader也没问题。 2.关外设和中断我试试(我看到ST官网程序貌似并没有关外设和中断的操作) |
|
|
|
|
|
|
|
zzy0407 发表于 2018-12-19 14:36 我确认了下boot,没有用到中断。外设开了如下: // Enable GPIOA, GPIOC and USART1 clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_USART1, ENABLE); // Enable USART2 clock RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); 试了下,关了这几个外设后还是不行。 |
|
|
|
1.工程配置你是指icf这个文件吗? 我修改的已经和boot的跳转地址一样了,都是#define ApplicationAddress 0x8002000 2.向量地址是指哪个文件,在哪修改?是指NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0 );这个吗,如果是的话,#define NVIC_VectTab_FLASH ((u32)0x08002000),也重定义了 |
|
|
|
楼主用的是什么编译器?
|
|
|
|
|
|
|
|
应该是在工程配置里面,有一项是起始地址。我没有IAR,你找一下配置中的。应该是在MCU这一项。
|
|
|
|
IAR options/linker是有配置起始地址的选项,我已经设置了。现在的感觉所有的设置都正确,但不运行,只有在iap程序中跳转至应用程序前初始化一个引脚才能正常启动,这就比较奇怪了 |
|
|
|
最好还是要找到原因,这个不是解决问题的办法。楼主弄一个最简单的工程,只有串口打印,bootloder不要开启任何中断。测试一下。看一下是不是开启了其他的中断,我们也用了很长时间的bootloder,也没发生类似的问题。
|
|
|
|
|
|
|
|
问题解决。
所用的icf有问题,未初始化一部分stack。正确的icf文件如下: /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$configideIcfEditora_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08002000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08002200; define symbol __ICFEDIT_region_ROM_end__ = 0x0803FFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000130; define symbol __ICFEDIT_region_RAM_end__ = 0x2000FeFF; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 2100; define symbol __ICFEDIT_size_svcstack__ = 0x4; define symbol __ICFEDIT_size_irqstack__ = 0x4; define symbol __ICFEDIT_size_fiqstack__ = 0x4; define symbol __ICFEDIT_size_undstack__ = 0x4; define symbol __ICFEDIT_size_abtstack__ = 0x4; define symbol __ICFEDIT_size_heap__ = 0x40; /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; initialize by copy { readwrite }; do not initialize { section .noinit }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place in ROM_region { readonly}; place in RAM_region { readwrite, block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, block UND_STACK, block ABT_STACK, block HEAP, last section IRAM}; //place at end of RAM_region {readwrite}; 错误的icf文件内容如下: /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$configideIcfEditora_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08002000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08002200; define symbol __ICFEDIT_region_ROM_end__ = 0x0803FFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000130; define symbol __ICFEDIT_region_RAM_end__ = 0x20010000; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x200; //0x200 define symbol __ICFEDIT_size_heap__ = 0x200; //0x200 /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; initialize by copy { readwrite }; do not initialize { section .noinit }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place in ROM_region { readonly }; place in RAM_region { readwrite, block CSTACK, block HEAP }; icf文件使用路径:工程右键/options/linker |
|
|
|
yh3091876423 发表于 2018-12-19 17:32 错误的icf文件是哪来的? |
|
|
|
IAR option->linker->edit项里面的vector table和memory regions设置正确。
NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0 ); 这个API宏不要改,只更改第二个参数,偏移量 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
693 浏览 1 评论
952 浏览 1 评论
1912 浏览 1 评论
1644 浏览 1 评论
MCU友好过渡MPU,米尔基于STM32MP135开发板裸机开发应用笔记
694 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-5-14 16:37 , Processed in 0.806922 second(s), Total 69, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号