历史上的今天
今天是:2024年09月20日(星期五)
2018年09月20日 | STM32启动模式及IAP
2018-09-20 来源:eefocus
我们玩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中快了不少!

IAP在线升级
1.boot程序
(1) IROM1 起始地址:0x8000000
(2)关键代码
#define ApplicationAddress 0x8003000
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}
1, JumpAddress = *(vu32*) (ApplicationAddress + 4);是把用户代码的复位地址赋值给JumpAddress。
2, __MSR_MSP(*(vu32*) ApplicationAddress); 是把用户代码的堆栈地址写入堆栈指针
3, Jump_To_Application()是把用户代码的复位地址付给PC指针
if (((*(vu32*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
这句话的意思是把用户代码的首地址里面的数据拿出来,看看是不是以0x20000000开头。
(X & 0x2FFE0000 ) == 0x20000000 意思是说X是不是在0x20000000与0x2001FFFF之间,即栈顶是不是在以0x20000000开始的128K
前面说了用户代码的首地址放的是堆栈指针,而堆栈应该指向RAM,而RAM的首地址是0x20000000,所以这句话用来判断是不是已经有一个正确的堆栈指针地址写在了用户代码的首地址,进一步可以推测是不是有一个正确的用户代码写在了用户代码区,如果已经写入了,就可以跳过去运行,如果没有写入,就不跳过去。这是DEMO程序的判断逻辑,可以这样用,也可以不这样用。
2.APP程序
(1) IROM1 起始地址:0x8003000
(2)关键代码
#define VECT_TAB_OFFSET 0x3000 (修改地方) //NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000); //中断向量表映射
上一篇:STM32外设使用要点
史海拾趣
|
想要选择一款xilinx的FPGA型号 具体功能如下: 完成十路输入的编码器反馈功能,其中还包括计数单元以及滤波单元 请高人推荐几款能完成此功能的xilinx的FPGA的型号 先谢过了… 查看全部问答> |
|
各位大侠,请帮一下,如何用8051来控制直流电机的反正转,要求是按下转动键,电机30s正转,然后30s反转,如果可以的话,请上传电路图,并附上程序。谢谢大家啦… 查看全部问答> |
|
求conexant hsf cx11252-41 芯片的硬件说明文档/开发文档/databooks conexant hsf cx11252-41 芯片的硬件说明文档/开发文档/databooks/技术规格文档 多个同类设备如何同时工作? 比如:我在电脑上PCI上接入多个modem 卡想让它们同时工作.我应该怎么处理,是在modem驱动上作处理,还是在应用程序上作处理???? 要处理哪 ...… 查看全部问答> |
|
dsp 有eight stage pipeline的,请问这八个stage分别是什么? 知道5stage的 F/D - Fetch (from cache) and decode four instructions G - Group up to four instructions R & ...… 查看全部问答> |
|
有没有人能详细解释下? 我个人是这么认为的: 用户通过QT 或直接的C语言,调用以编写好的驱动(当然驱动已经编译到内核里) 然后驱动再调用更底层的命令,操作寄存器,实现ARM的各种功能 一般的内核都是配置好的,所以我们只要写底层驱动和QT ...… 查看全部问答> |
|
我在redhat 9.0上编译arm版本的apache时提示:输入make后提示的不知道哪里出了错,谢谢啦~~cd ../apache_1.3.39make出现以下错误信息:gcc -c -I../os/unix -I../include -DSOLARIS2=290 -DMOD_SSL=208114 -DEAPI `../apaci` util.cutil.c: In func ...… 查看全部问答> |




