iar for arm 用jlink下程序 复位或掉电后为啥程序就不跑了 怎样设置才能让他掉电后可以再次运行程序???

iar for arm 用jlink下程序 复位或掉电后为啥程序就不跑了 怎样设置才能让他掉电后可以再次运行程序???,第1张

哪款ARM芯片?复位和掉电后不跑程序,估计是你的启动模式没有设置好。STM32启动模式 收藏

我们玩ARM9,一般都是在内存里调试程序,速度飞快。STM32下也可以这样,虽说现在的flash寿命已经很长了,但flash中调试烧录程笑磨序还是一个很慢的过程,有时候程序上一个小小的改动要花上几倍的时间下载代码,这确实是不能忍受的。

我们也可以在开发STM32时,在内存中调试程序。

{

STM32这颗Cortex-M3控制器,与其他许多ARM一样,提友升巧供了BOOT0和BOOT1两个管脚用于启动选择。

BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。

BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。(用于串口ISP)

BOOT1=1 BOOT0=1 从内置SRAM启动,这种模式可以用于调试。

在芯片上电复位时,BOOT0和BOOT1两个管脚的状态将决定芯片从何处启动。

1.当BOOT0和BOOT1均设置为逻辑1时,系统将从内置SRAM中启动,这是代码内存调试的第一个条件。

}

经多次确认,BOOT0和BOOT1状态与内存中调试无直接联系

2.然后,我们需要在代码中设置正确的中断向量表位置。中断向量表通常被放置在用户程序的开始,所以flash中运行时,向量表位于0x08000000处,而当代码被放置在SRAM中运行时,他的位置就成了0x20000000。在初始化NVIC时,我们可以放置如下代码,定义向量表的位置

NVIC_SetVectorTable(0x20000000 , 0x0)

NVIC_SetVectorTable(0x08000000 , 0x0)

3. 在编译器中,要进行正确的设置。这里以IAR 5.4为例说明。

3.1. 工程选好键项中Linker项,Config选项卡中,指定Linker Configuration File为stm32f10x_ram.icf, 该文件在FWLIB安装包中可以获得,IAR4和5分别有不同的配置文件。

3.2. 同样是工程选项中Debug项,Download选项卡中,去掉所有钩子,不下载代码到flash

经过以上步骤,代码就可以在内存中调试,下载速度飞快,调试速度也比flash中快了不少!

不一定是硬件问题,看看电源和时钟、复位供进去了没有,如果这些都正常,八成侍稿饥就是进入某种异常模式了,在每个异常处理里面做一些点敬纳灯之类的能直观判断程老返序位置的语句,逐步缩小问题范围.

1.

请求中断

当某一中断源需要CPU为其进行中断服务时,就输出中断请求信号,使中断控制系统的中断请求触发器置位,向CPU请求中断。系统要求中断请求信号一直保持到CPU对其进行中断响应为止。

2.

中断响应

CPU对系统内部中断源提出的中断请求必须响应,而且自动取得中断服务子程序的入口地址,执行中断 服务子程序。对于外部中断,CPU在执行当前指令的最后一个时钟周期去查询INTR引脚,若查询到中断请求信号有效,同时在系统开中断(即IF=1)的情 况下,CPU向发出中断请求的外设回送一个低电平有效的中断应答信号,作为对中断请求INTR的应答,系统自动进入中断响应周期。

3.

关闭中断

CPU响应中断后,输出中断响应信号,自动将状态标志寄存器FR或EFR的内容压入堆栈保护起来,然后将FR或EFR中的中断标志位IF与陷阱标志位TF清零,从而自动关闭外部硬件中断。因为CPU刚进入中断时要保护现场,主要涉及堆栈 *** 作,此时不能再响应中断,否则将造成系统混乱。

4.

保搜键护断点

保护断点就是将CS和IP/EIP的当前内容压入堆栈保存,以便中断处虚漏旁理完毕后能返回被中断的原程序继续执行,这一过程也是由CPU自动完成。

5.

中断源识别

当系统中有多个中断源时,一旦有中断请求,CPU必须确定是哪一个中断源提出的中断请求,并由中断控制器给出中断服务子程序的入口地址,装入CS与IP/EIP两个寄存器。CPU转入相应的中断服务子程序开始执行。

6.

保护现场

主程序和中断服务子程序都要使用CPU内部寄存器等资源差橡,为使中断处理程序不破坏主程序中寄存器的内容,应先将断点处各寄存器的内容压入堆栈保护起来,再进入的中断处理。现场保护是由用户使用PUSH指令来实现的。

7.

中断服务

中断服务是执行中断的主体部分,不同的中断请求,有各自不同的中断服务内容,需要根据中断源所要完成的功能,事先编写相应的中断服务子程序存入内存,等待中断请求响应后调用执行。

8.

恢复现场

当中断处理完毕后,用户通过POP指令将保存在堆栈中的各个寄存器的内容d出,即恢复主程序断点处寄存器的原值。

9.

中断返回

在中断服务子程序的最后要安排一条中断返回指令IRET,执行该指令,系统自动将堆栈内保存的 IP/EIP和CS值d出,从而恢复主程序断点处的地址值,同时还自动恢复标志寄存器FR或EFR的内容,使CPU转到被中断的程序中继续执行。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12361282.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存