解决这个问题要涉及的方面就多了:
1、Cortex-M3程序结构的问题。
2、了解Cortex-M3启动流程。
3、Cortex-M3中断向量表问题。
4、用Flash写函数来烧写程序,烧写的应该是bin文件而不是hex文件。
直接跟你说最快最直接解决方法(我的IAR开发环境下的修改,不知道你是用Keil开发还是IAR开发,这里会有些区别):
1、先在B程序代码中修改中断向量表,修改方法,在main函数开始调用NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3f000)来重新配置中断向量表。
2、在A程序里边,跳转部分进行如下 *** 作
__disable_irq() //关闭全部中断
__set_MSP(*(__IO uint32_t*) 0x0803f000)//因为要执行另外的程序,堆栈要重新初始化
((void (*) (void)) (*((vu32 *)(0x0803f000+4)))) () //最后进行程序跳转
3、因为程序A跳转的时候关闭了中断,在程序B里面各种初始化后要重新打开中断__enable_irq()
4、要将程序B编译生成的bin文件烧写,而不是hex文件。
5、忘了还有一点,修改程序B代码的起始位置,在IAR下的修改方式如下:
project->options,在linker栏目下有
点击选择固件库提供的配置文件stm32f10x_flash.icf,然后在工程下打开该文件,修改程序B的代码起始位置,做如下的修改
OK!编译生成bin文件烧写即可。
你可以先试试,看能不能成再说,至于为什么这么改就需要去弄懂我上面提出的4个问题。
我的开发板 是这样的1.烧写裸机程序
一个nand flash 一个 norflash
先用jlink下载Uboot到norflash
然后启动 用uboot更新uboot到 nandflash的方式 下载裸机程序
然后从nandflash启动
2.ADS用法 可以去网上查查 好多
3.(不使用ADS)建立裸机程序:必须自己实现几个东西
3.1初始化硬件(汇编):比如关闭看门狗啊 初始化栈指针(如果你要跑C的话) 之类
3.2MAKEFILE 中要制定连接地址 去_elf头
3.3实现你的C程序
比如简单的控制LED的裸机程序
crt0.S:
.text
.global _start
_start:
ldr r0, =0x53000000 @ WATCHDOG寄存器地址
mov r1, #0x0
str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
bl main@ 调用C程序中的main函数
halt_loop:
b halt_loop
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)