stm32的flash地址起始于0x08000000,结束地址是0x080000000加上芯片实际的flash大小,不同的芯片flash大小不同。RAM起始地址上0x200000000,结束地址是0x20000000加上芯片的RAM大小。STM32将外设等都映射为地址的形式,对地址的操作就是多外设的操作。
stm32的外设地址从0x40000000开始,可以看到在库文件中,是通过基于0x40000000地址的偏移量来操作寄存器以及外设的。
一般情况下,程序文件从0x08000000地址写入,这是STM32开始执行的地方,0x08000004是stm32的中断向量表起始地址。
在使用keil编程的过程中,其编程地址的设置一般是这样:
即程序程序的写入地址从0x08000000(数好零的个数)开始的,其大小为0x80000也就是512K的空间,换句话说就是告诉编译器flash的空间是从0x08000000-0x08080000,RAM的地址从0x20000000开始,大小为0x10000也就是64K的RAM。这与STM32的内存地址映射关系是对应的
M3复位后,从0x08000004取出复位中断的地址,并且跳转到复位中断程序,中断执行完之后会跳到我们的main函数,main函数里边一般是一个死循环,进去后就不会再退出,当有中断发生的时候,M3将PC指针强制跳转回中断向量表,然后根据中断源进入对应的中断函数,执行完中断函数之后,再次返回main函数中。大致的流程就是这样。
下面说正题,IAP下载方式:
IAP下载的原理就是在M3中运行有一个程序,这个程序的起始地址是从0x08000000开始的,也就是说M3复位后执行的就是这个程序,称之为bootloader吧,一般这个程序的作用是接收APP程序,就是我们想要下载到M3上的程序,就好比给手机下载新的APP程序一样,下载完成之后就可以跳转APP的地址开始执行新的APP程序。当有APP程序发送到M3上之后,bootloader程序就开始接收并保存在RAM中(其实保存在哪里是由自己决定的,就看你程序怎样设计了),程序下载完成之后,将PC指针指向程序的开始地址就可以执行该程序了,但是还有其他的要设置,那就是中断向量表的偏移量需要根据APP程序的起始地址设置。
例如,在bootloader程序中,程序的起始地址是这样设置的:0x08000000 ,size=0x80000。 RAM从地址:0x2000F800开始,size=0x800。0x20000000-0x2000F800用来作为缓存,接收APP程序,接收完APP程序后将程序复制到flash中,就是最终执行程序的时候,程序要已经写在flash中。
APP程序中,我选择将APP程序烧写在flash中,因为bootloader也会占用flash的空间,APP程序的存储地址从0x08010000开始,size=0x70000,也就说0x08000000-0x08010000这段空间内存放的是bootloader程序。接下来就是中断向量表的设置:因为APP程序的起始地址是0x08010000,所以偏移量为10000,使用语句SCB->VTOR = FLASH_BASE | 0x10000;设置中断向量表的偏移量。
设置好之后,将bootloader程序下载到板子上,复位运行程序,接着下载bin文件程序,要运行bin文件,将PC指针指向BIN文件的开始地址就可以了,也就是指向0x08010000.
APP程序也可以直接运行在RAM中,原理和上边是一样的,就是程序的起始地址不一样了,还有一点就是,既然程序放在了RAM中运行,那么设置RAM要注意地址,一部分是bootloader运行的RAM,一部分是APP程序存放的空间,还有一部分是APP程序运行需要的RAM。
bootloader接收bin文件的时候,我将存放地址定义成 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000))),也就是接收到的APP程序开始地址是0x20001000
在RAM运行APP的设置如下:
设置好之后下载bin文件,运行方式和上边是一样的。
本人菜鸟,记录一下,顺便把学到的知识梳理一下,就写了这个,如有错误欢迎大神指出!
关键字:STM32 内存 地址映射 IAP下载
引用地址:
STM32的内存地址映射与IAP下载
推荐阅读最新更新时间:2024-03-16 15:36
保留前置补光灯 三星J系列手机2016版更新
新浪手机讯 4月26日上午消息,去年6月三星推出Galaxy J系列,在中端机型领域取得了一定市场。今年三星对该系列两款手机J5&J7进行了升级,从外观到性能都有不小的变化。 Galaxy J系列
相比三星高端Galaxy S系列,Galaxy J系列更加注重产品综合性价比概念。与上一代产品相比,2016年J系列的金属边框设计更加年轻化。采用分辨率更高的Super AMOLED屏幕,并保留了前置补光灯。运行内存最高升级至3GB,搭载超过3000毫安时大容量电池。
作为主打年轻市场的性价比系列,在外观、拍照和性能方面J系列均有明显提升。三星或许希望用这款手机提升自己的竞争力。
[手机便携]
Stm32 debug停留在"BKPT 0xAB"或者"SWI 0xAB"的解决办法
一、、背景: 曾经在工作中接触过STM32一段时间,但没有深入的去学习,只是用前辈搭建好的模型来实现一些功能罢了,俗话说的好,大树底下好乘凉,开发确实轻松了,可是不深究点,又觉着心里不踏实,然而也一直没花时间去深究。刚好,最近需要重新使用STM32,完全自己开发,没想到今天一上来就让我碰上个不小的问题,废话不多说,进入正题。 二、正文: 在使用串口的时候,代码可以正常编译,没有报任何错误,烧录进MCU内,就是看不到程序正常运行的现象,而把串口部分注释掉就没问题。进入调试模式,发现代码停在 BKPT 0xAB 这里,并不是死循环,按下全速运行键“F5”,代码会立马在该段被终止,不会继续往下跑,这里说明了main函数都没
[单片机]
解决STM32 I2C接口死锁在BUSY状态的方法讨论
关于STM32的I2C接口死锁在BUSY状态无法恢复的现象,网上已有很多讨论,看早几年比较老的贴子,有人提到复位MCU也无法恢复、只有断电才行的状况,那可是相当严重的问题。类似复位也无法恢复的情况是存在的,技术支持矢口否认问题存在,并不是正确面对问题的态度。比如我用这款F439芯片的SDRAM控制器,在错误操作后进入HardFault状态,复位无法恢复,JTAG也无法联机,只能断电重来,官方的Erratasheet里也提到了。 如果I2C接口无法可靠工作,那么所做的设计将存在严重隐患,不可能要求用户用断电的方法恢复系统。如果像某些网友提到弃用硬件I2C,转为GPIO模拟I2C时序,那么首先I2C时钟频率不易确定,因为STM32的时
[单片机]
STM32接口FSMC/FMC难点的理解
一,FSMC FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接, STM32 的 FSMC 接口支持包括 SRAM、NAND FLASH、NOR FLASH 和 PSRAM 等存储器。 二,FSMC存储块 STM32F767的FMC将外部存储器划分为6个固定大小的256M的存储区域,如下图 如图: FSMC分为4块,每块256M字节又被划分为4*64,即四个片选 NOR / PSRAM使用块1,共256M NAND闪存使用块2,3,共512M PC卡使用块4,共256M 三,存储块1(Bank1)寄存器 STM32 的 FSMC 存储块 1(Bank1)被分为 4
[单片机]
STM32 SysTick 精准延时 简单分析
在设计软件的时候,有的对时序要求比较严格,但是简单的延时函数又不能准确延时---STM32中有一个系统滴答时钟是不错的配置--- ----第一部分是---向滴答时钟寄存器写初值,也就是要根据系统频率来递减----然后为0 则产生中断 void SysTick_Init(uint32_t a) //a-us { /* SystemFrequency / 1000 1ms中断一次 * SystemFrequency / 100000 10us中断一次 * SystemFrequency / 1000000 1us中断一次 */ // if (SysTick_Config(SystemCoreClock
[单片机]
STM32基础之中断--外部中断
EXTI简介 EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 19个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 EXTI功能框图 输入线,EXTI 控制器有 19 个中断/事件输入线,这些输入线可以通过寄存器设置为任意一个 GPIO,也可以是一些外设的事件。输入线一般是存在电平变化的信号。 一个边沿检测电路,它会根据上升沿触发选择寄存(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTS
[单片机]
STM32之ADC
ADC是多少位的? 12位 ADC有多少个? 1个、2个或多至3个,视不同的器件而不同;每个又有多个通道。 关于通道的名堂: 10.3.3 通道选择 有16个多路通道。可以把转换分成两组:规则的和注入的。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。 ● 规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规则组中转换的总数写入ADC_SQR1寄存器的L 位中。 ● 注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄
[单片机]
iPhone 4内存容量512MB为iPad两倍
据国外媒体报道,苹果在发布iPhone 4时并未透露这款手机的一些技术参数,例如内存大小和CPU速率。有消息称,iPhone 4的内存容量为512MB。 苹果希望用户不要关注iPhone 4的具体技术参数,而是关注手机的整体功能,因此隐藏了部分参数。第一代iPhone和iPhone 3G采用128MB内存,而iPhone 3GS和iPad均采用256MB内存。然而随着苹果推出支持多任务的iOS 4操作系统,256MB内存已经显得不够。 消息显示,iPhone 4采用了512MB内存,是iPhone 3GS和iPad的两倍。这与网上此前曝光的iPhone 4原型机不同,当时的原型机仍然采用256MB内存。 内存
[手机便携]