STM32启动模式及API(转)

源:STM32启动模式及API

我们玩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)     {       /* Jump to user application */       JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);       Jump_To_Application = (pFunction) JumpAddress;       /* Initialize user application‘s Stack Pointer */       __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);  //中断向量表映射

时间: 2024-10-28 16:17:12

STM32启动模式及API(转)的相关文章

Duanxx的STM32学习: 启动模式,BOOT0和BOOT1详解

在画STM32的电路图的时候,关于STM32的启动方式纠结了一下,现有的参考设计都是在STM32的启动选择引脚BOOT0和BOOT1上使用了跳帽,用以人工选择STM32的启动方式,但是在实际应用中这种设计就显得冗余,所以这里顺带研究了一下STM32的启动方式. STM32一共有三种启动模式,在ST官网上下载的RM0008中,我找到了启动相关的配置说明: 对应的中文翻译如下: 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存.用户可以通过设置

【转】STM32三种启动模式

@2018-12-16 [小记] STM32 启动区域 STM32三种启动模式 借助上述文章理解官方文档<一种从用户代码调用系统存储器中 Bootloader 的方法 > 原文地址:https://www.cnblogs.com/skullboyer/p/10129172.html

STM32启动过程的理解

对于STM32启动的过程,想象中应该是这样的上电--->启动---->main() 由于现在的集成开发环境,对于C语言之下的东西似乎都被屏蔽了,另外用编程也大都用封装好的库函数,连对寄存器的了解都少了一大步,但是这样总是让人觉得根基不够稳重.今天就整理下启动代码的理解,补充一下. 1.STM32存储器的组织 STM32作为32bit的操作系统,自然是2^32的寻址范围,所以正好是4GB的空间,再看一下对这个4GB是怎么分配的 8*512MB=4GB,图上很清晰了,一共分为  Code区  SR

Android Activity的4种启动模式详解(示例)

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5233269.html 先介绍下Android对Activity的管理,Android采用Task来管理多个Activity,当我们启动一个应用时,Android就会为之创建一个Task,然后启动这个应用的入口Activity(即<intent-filter.../>中配置为 MAIN和LAUNCHER的Activity). 因为Android并没有为Task提供API,因此我们无法真正去访问Task,只

android83 Activity的生命周期,启动模式,返回时传递数据

#Android四大组件 * Activity * BroadCastReceiver * Service * ContentProvider #Activity生命周期 * oncreate:Activity对象创建完毕,但此时不可见 * onstart:Activity在屏幕可见,但是此时没有焦点(不能够点,不能够交互) * onResume:Activity在屏幕可见,并且获得焦点 * onPause:Activity此时在屏幕依然可见,但是已经没有焦点 * onStop:Activity

STM32 BOOT模式配置以及作用

所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存.用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式. Main Flash memory是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序.System memory从系统存储器启动,这种模式启动的程序功能是由厂家设置的.一般来说,这种启动方式用的比较少.系统存储器是芯片内部一块特定的区域,STM3

Activity启动模式的深入分析

网上关于Activity启动模式的文章非常多,但是看起来都千篇一律,看完之后我们都能理解这4种启动模式,不过官方api对singleTask这个启动模式解释有些争议,导致我其实并没有真正理解这几种模式,特别是对实际开发到底怎么用还是一知半解,于是花了一天时间好好研究这4种启动模式. 首当其冲应该知道Task的概念,它是我们一系列操作连贯跳转activity形成的一个activity栈,后进先出也就是说当前看到的activity在最上面,关于Task的概念老罗一篇博客说的比较清楚,引自老罗博客:

Android启动模式以及IntentFilter匹配规则

一.Android的LaunchMode 共有四种启动模式 1.standard 标准启动模式,Activity的默认启动模式.Activity的每次启动都创建新的示例 2.singleTop 栈顶复用模式,当启动的Activity处于栈顶时,不再创建新的活动实例.将回调onNewIntent方法. 3.singleTask 栈内复用模式,当启动的Activity在一个栈中存在实例,不再创建新的实例,弹出在其之上的所有实例将其置于栈顶.同样会回调onNewIntent方法. 4.singleIn

《Android深入透析》之 浅析Activity启动模式

摘要 Activity的启动模式是一个既基础又容易忽视的问题,但是这个问题有个深刻的认识,对程序员写一个稳定高效的Android程序帮助很大,今天,在B哥引导下,我们对Activity启动模式.Intent Flags做了一番很好的探究,可以这么说,如果你不熟悉或了解Activity的启动模式或者Flags怎么用,今后你在实际开发中,绝对会被困扰,回过头来重新学习这一节,举个例子:有人写出的客户端,为什么崩溃了,底下仍然有一个乃至N个该应用的界面,如果你熟读并且准确理解此章,必然不会出此错误.