stm32从A程序跳转到B程序的做法

Cortex-M3程序结构

在这里插入图片描述
在这里插入图片描述
Banked R13: 两个堆栈指针
Cortex‐M3 拥有两个堆栈指针,然而它们是 banked,因此任一时刻只能使用其中的一个。

  • 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
  • 进程堆栈指针(PSP):由用户的应用程序代码使用。堆栈指针的最低两位永远是 0,这意味着堆栈总是 4 字节对齐的。

在 ARM 编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的 fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统调用)。

Cortex-M3启动流程

ARM7和ARM9启动时从绝对地址0X00000000开始执行复位中断程序,即固定了复位后的起始地址,但中断向量表的位置是可变的。
在这里插入图片描述
Cortex-M3内核规定中断向量表中第一个32位数据内容为栈顶地址,第二个32位数据内容则是复位中断向量的入口地址。

这样CPU复位后会自动从中断向量表中第二个32位数据中取出复位中断向量的入口地址,PC就跳转到中断服务程序。这也就是为什么调试的时候程序会直接跳到0x08000144(中断向量表中第二个32位数据为0x08000145),而不是停在0x08000000。

Cortex-M3的中断向量表的结构是固定的,而位置的地址是可变的。

Cortex-M3的初始中断向量表有三个位置,通过BOOT引脚进行启动设置。

BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。中断向量表定位于FLASH区,复位后PC=0x80000000.

BOOT1=0 BOOT0=1 从系统存储器启动(相当于厂家在存储器中固化了BOOTLOADER),这种模式启动的程序功能由厂家设置。

BOOT1=1 BOOT0=1从内置SRAM启动,这种模式可以用于调试。这种模式下,中断向量表位于SRAM区,起始地址为0x20000000.复位为PC=0x20000000.

当STM32复位完成后,可通过设置VECTOR_TABLE,将中断向量表放置在任何地方。

Cortex-M3中断向量表

在这里插入图片描述

用Flash写函数来烧写程序,烧写的应该是bin文件而不是hex文件

最快最直接解决方法
1、先在B程序代码中修改中断向量表,修改方法,在main函数开始调用NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8003000);来重新配置中断向量表。

2、在A程序里边,跳转部分进行如下操作

__disable_irq(); //关闭全部中断

__set_MSP((__IO uint32_t) 0x8003000);//因为要执行另外的程序,堆栈要重新初始化

((void () (void)) (((vu32 *)(0x8003000+4)))) (); //最后进行程序跳转
3、因为程序A跳转的时候关闭了中断,在程序B里面各种初始化后要重新打开中断__enable_irq();

4、要将程序B编译生成的bin文件烧写,而不是hex文件。

5、修改程序B代码的起始位置,在IAR下的修改方式如下:

project->options,在linker栏目下有

点击选择固件库提供的配置文件stm32f10x_flash.icf,然后在工程下打开该文件,修改程序B的代码起始位置,做如下的修改

OK!编译生成bin文件烧写即可。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值