http://blog.sina.com.cn/s/blog_6a31d1060100uaa3.html

STM32存储器 — <2>STM32存储器知识的相关应用(IAP、Bit Banding)

(2011-07-23 11:08:01)

转载▼
标签:

cortex-m3

kongst

stm32

初学

单片机

例程

原创

连载

杂谈

分类: STM32学习

< 2011-2-18>

<Kongst>

kongst@163.com

Notes Introduction

本连载笔记,记录了在STM32学习中对存储器的理解;描述了STM32存储器的结构划分,以及STM32存储器相关知识,能够获得对存储器的整体性认识;并能够顺利的付诸实践,达到真正的对存储器的认识+应用。

本连载共有三篇笔记,分别是:

《关于STM32的存储器》

能够了解STM32的存储器结构,及其结构设计由来;

能够明确自己所写的程序是放在什么地方,并且可以合法的随意放置;

能够知道STM32系统的启动相关;

《STM32存储器知识的相关应用(IAP和Bit Banding)》

能够理解Bit-banding;

一个简单IAP功能的整体设计;

能够IAP(In Application Programmable);

《STM32实现IAP(上位机和IAP程序设计)》

上位机和IAP程序的通讯协议;

能够通过自制上位机(C#)进行IAP;

< STM32存储器知识的相关应用(IAP、Bit Banding)>

If an error, please contact author, to be corrected.

For other uses, indicate the source, to express my recognition of the results.

Thank you.

在我的另一篇笔记《stm32的存储器》中讲述了STM32的存储器结构,及个人理解。

本篇文章将重点描述在对存储器有了比较深入了解之后的一些相关的操作案例;重点在于STM32启动设置和IAP使用,以及bit banding的理解,加上一个简单的IAP程序设计。

1 STM32的启动

根据参考手册RM0008中的图表:

得知STM32的启动有三种模式,三种模式的选择在于芯片上的两个Boot引脚,如RM0008种描述:

在系统复位之后的四个上升沿后索存BOOT引脚,从而决定启动方式;用户对BOOT引脚的设置决定了系统复位之后的启动模式。

三个不同的启动区域有着不同的起始地址,STM32这样规定:

注意的是:只有当从SRAM启动,只有一个单一的地址0x2000 0000可以访问;而其他两种启动方式除了从各自的地址访问,还可以从0x0000 0000地址访问。

不同的启动方式,决定了程序在设计过程中的方法,因此必须确认好程序存放空间和系统启动模式。

所以,通过设置BOOT0和BOOT1引脚,可以选择相应的启动模式。

2 STM32的ICP

In Circuit Programming,在电路编程。

ICP能够通过JTAG、SWD或Boot Loader去下载用户程序,以达到更新整个Flash的目的;

ICP提供一个快速的、有效的设计迭代,并消除不必要的包装处理或设备套接。

这里对ICP不做过多的论述。

3 STM32的ISP

In System Programming,在系统编程。

STM32在出厂时,已经固化了一段程序在System memory(medium-density devices的地址为:0x1FFF F000,大小为2KB)存储器中。

这段程序就是一个固定好的,并且没法修改的Boot Loader,如编程手册PM0042种描述的:

这个固定好的,出厂就有的Boot Loader可以通过USART1进行用户程序的烧写、更新;

当然,烧写软件(烧写流程)的设计需要按照其固定好的Boot Loader的烧写协议来进行。

因此在特殊的要求烧写方式的场合,使用ISP是不太方便的,可以采用更为方便的IAP编程方法,以下会详细介绍。

4 STM32的Bit Banding

Bit Banding功能是相对于以往能够进行bit操作的单片机而言的。

通过Bit Banding功能可以像51单片机的bit操作一样。MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 ; 就是这样把P1口的第三个脚(BIT2)置0或置1了。

而现在STM32的位段、位带别名区就为了实现这样的功能。只不过他是为需要操作的地址(1字节)的每一个位(共8位)起个别名,分别对应别名区的一个字(word)。也就是别名区的大小是Bit Band区的32倍。这样,对32MB的别名区地址的操作,就是对相应Bit Band区的位的操作。

注意:别名字的位[31:1]在 bit-band 位上不起作用。写入 0x01 与写入 0xFF 的效果相同。写入0x00 与写入0x0E 的效果相同。

如图是跟Bit Banding 有关系的存储器结构:

STM32有两个Bit Band区域,分别是:

0x2000 0000——0x2010 0000:该地址是STM32的SRAM低1MB的地址区域;

0x4000 0000——0x4010 0000:该地址是STM32的Peripherals低1MB的地址区域;

另外,STM32还有两个对应的Bit Band区域的别名区,分别是:

0x2200 0000——0x23FF FFFF:共32MB的空间,对应相应1MB的每一个位;

0x4200 0000——0x43FF FFFF:共32MB的空间,对应相应1MB的每一个位;

接下来的问题是如何确定Bit Band区字节的位所对应的那个别名区的字(word)。Bit Band区和别名区是一一对应的,具体的公式为:

bit_word_addr=bit_band_base+ (byte_offset×32) + (bit_number×4);

bit_band_base:32MB别名区首地址;

byte_offset:1MB位段区偏移量,即为bit-band 区中包含目标位的字节的编号;

bit_number:位段中目标位的位位置(0-7);

注意:别名字的位[31:1]在 bit-band 位上不起作用。写入 0x01 与写入 0xFF 的效果相同。写入0x00 与写入0x0E 的效果相同。

举个例子(通过别名区访问地址):

1、想操作SRAM中Bit Band区地址为 0x2000 0018字节的第2位

计算别名区对应子地址:0x2200 0000 +(18*32)+(2*4) = 0x2200 0248

所以,对0x2200 0248地址的操作,就是对0x2000 0018字节的第2位进行操作;

2、想操作Peripherals中Bit Band区地址为0x4000 0021字节的第7位

(可能是一个功能寄存器);

计算别名区对应子地址:0x4200 0000+(21*32)+(7*4)=0x4200 02BC

所以,对0x4200 02BC的操作,就是对0x4000 0021字节的第7位进行操作;

对比使用Bit Banding功能和直接访问Bit Band区域,如图:

5 STM32的IAP

In Application Programming,在应用编程。

5.1 什么是IAP

IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。 通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:

1)检查是否需要对第二部分代码进行更新

2)如果不需要更新则转到4)

3)执行更新操作

4)跳转到第二部分代码执行

第一部分代码必须通过其它手段,如JTAG或ISP烧入;第二部分代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一道烧入,以后需要程序更新是再通过第一部分IAP代码更新。

对于STM32来说,因为它的中断向量表位于程序存储器的最低地址区,为了使第一部分代码能够正确地响应中断,通常会安排第一部分代码处于Flash的开始区域,而第二部分代码紧随其后。

在第二部分代码开始执行时,首先需要把CPU的中断向量表映像到自己的向量表,然后再执行其他的操作。

如果IAP程序被破坏,产品必须通过JTAG或ISP重新烧写程序,这是很麻烦并且非常耗费时间和金钱的。针对这样的需求,STM32在对Flash区域实行读保护的同时,自动地对用户Flash区的开始4页设置为写保护,这样可以有效地保证IAP程序(第一部分代码)区域不会被意外地破坏。

如图为IAP示意图:

5.2 设计自己独特的IAP

IAP程序可以自己设计,这样能够符合自身对在先下载的特殊需求。针对这一要求,本文进行了一个IAP程序的结构设计,并已经通过测试。

带IAP的系统由两个工程需要编写,一个是IAP工程,一个User App工程。

设计将IAP程序放在0x0800 0000——0x0800 2000这段空间中,User App放在0x0800 2000之后的余下空间;

下面描述如何友好的处理着两个工程之间程序运行的关系,达到IAP这个功能:

1)  设置系统为Boot from main flash memory 启动模式;

2)  系统上电之后PC指向0x0800 0000处,进而运行到IAP工程的main()入口处;

3)  在IAP中:检测标志,如果UserApp_Flag为OK,则直接跳转到5)User App;

4)  在IAP中:检测标志,如果UserApp_Flag不为OK,则继续IAP历程,等到更新好User App后,设置UserApp_Flag为OK,然后跳转到5)User App;

5)  跳转到User App,运行系统功能;

6)  在User App中,如果检测到现在需要更新User App,先设置UserApp_Flag为OK,然后跳转到3)IAP中;

以上6个步骤能够保证IAP和User App之间的良好关系,实现STM32的IAP功能。

如图所示:

5.3 IAP例程

IAP程序设计思路:

1)IAP程序设计放置在Flash的起始地址,当用户选择从Main Flash memory启动时,系统进入了0x0800 0000地址,也就是进入了IAP程序;

2)在IAP中,判断UserApp程序是否有效(通过对标志地址内容的判断),若有效则直接跳转到UserApp程序地址0x08002000,也就是进入了UserApp程序(跳转到4));若UserApp程序标志无效,则更新UserApp。

3)在IAP中,需要更新的UserApp程序数据来自于USART,将从USART接收到的数据写入到UserApp程序地址中去,达到更新UserApp程序的目的;当UserApp程序完成更新之后,设置UserApp程序有效标志,然后跳转到UserApp程序地址0x08002000;

4)在UserApp程序中,可以实现系统功能;当有需要IAP信号产生之后,首先设置UserApp程序为无效,然后跳转到IAP程序首地址0x0800 0000,程序又进入IAP(跳转到2));

至此,关于《STM32存储器知识的相关应用(IAP、Bit Banding)》知识已经结束.

完成STM32存储器知识过程中,一共参考了以下官方文档:

《RM0008 Reference manual》

《Cortex-M3技术参考手册》

《PM0042 Programming manual:STM32F10xxx Flash programming》

《AN2557 Application note:STM32F10x in-application programming using the USART》

等等;

另外也参考了很多无私网友的奉献,在此感谢。

关于我的STM32存储器知识共有三篇文章,分别是:

《stm32的存储器》

《STM32存储器知识的相关应用(IAP、Bit Banding)》

《STM32实现IAP(上位机和IAP程序设计)》

如果有需要另外两篇篇笔记,可以联系我:kongst@163.com

 

如果有不足、需要改进的地方,请联系我:kongst@163.com

STM32存储器 — 2STM32存储器知识的相关应用(IAP、Bit Banding)相关推荐

  1. stm32存储结构 存储器映射

    问题: 1   什么是存储器映射?是怎么一个运作过程? 2   stm32总体架构 3   CM3内核结构 1 STM32系统结构 要想深刻理解STM32的存储器,需要首先知道STM32的系统结构. ...

  2. 计算机的存储器先关知识,最详细的存储器知识大盘点!

    存储器是记忆信息的实体,是数字计算机具备存储数据和信息能力,能够自动连续执行程序,进行广泛的信息处理的重要基础. 1存储器的概念 (1) 存储器:存储器是计算机硬件系统的记忆设备,用来存放程序(软件) ...

  3. 单片机片外程序存储器数据存储器操作命令

    说明:单片机片外程序存储器数据存储器操作命令与通常所说的存储器不同,和I2C总线的AT24C02不同,SPI协议的也不同,是指采用专用接口电路,应用P0口P2口地址总线和控制线的"三总线&q ...

  4. stm32学习笔记---STM32F4知识

    一.STM32F4存储器映射 1.Cortex-M4存储器映射 存储器本身没有地址,给存储器分配地址的过程叫存储器映射 注:被控单元的FLASH,RAM和各类片上外设,这些功能部件共同排列在一个 4G ...

  5. 【iCore1S 双核心板_ARM】例程十二:DMA实验——存储器到存储器的传输

    实验原理: DAM(直接存储器访问)传输不需要占用CPU,可以在存储器至存储器实现高速的数据 传输.本实验采用DAM2控制器的数据流0,选用通道0进行数据传输.通过LED的颜色来 判断传输是否成功. ...

  6. HDMI光端机基本知识及相关品牌介绍

    因技术的提高,光纤价格的降低使它在各个领域得到很好的应用,因此各个光端机的厂家就好比是雨后春笋般发展起来.但是这里的厂家大部分技术并不是完全成熟,开发新技术需要耗资和人力.物力等,这就产生厂家多是中小 ...

  7. 速览EMNLP 2020上录取的知识图谱相关论文

    文 | 泽宇 源 | 知乎 前不久,自然语言处理领域三大顶会之一的 EMNLP 2020 发布了论文录取的结果.在EMNLP 2020论文正式出版之前,泽宇搜集了目前Arxiv上已经发布出来的录取在E ...

  8. 会议交流|大模型与图学习等知识图谱相关技术实践探索

    2021年,在疫情隔离和复杂国际形势的背景下,我们越发认识到重视核心基础技术,对保持国家独立自主发展的关键价值,互联网和科技行业也面临着新的挑战和变革机遇,新的AI技术正发挥越来越大的作用,AI技术本 ...

  9. 科普 | 知识图谱相关的名词解释

    知识图谱(Knowledge Graph)是谷歌于2012年提出.企业通常出于商业目的去设计新的概念和名词.但每一个概念的提出都有其历史渊源和本质内涵.下面列举了知识图谱相关的几个概念,并简要阐明了它 ...

最新文章

  1. linux 学习 14 日志管理
  2. java对托盘加监听右击报错_java实现系统托盘示例
  3. PagingAndSortingRepository接口与 JpaRepository接口
  4. java fx dialog_JavaFX 如何使用內建的對話框(Dialog)?
  5. Visual Studio 15.5预览版先睹为快
  6. linux搭建rabbitmq环境,RabbitMQlinux-centos环境配置
  7. java string中indexOf()常用用法
  8. 小鹏汽车提交赴美IPO:上半年营收1.42亿美元 何小鹏持股31.6%为最大股东
  9. 基片集成波导原理_第5讲基片集成波导.ppt
  10. AGC 26 F Manju Game
  11. 《Android安全技术揭秘与防范》——第2章,第2.1节钱从哪里来
  12. 生成Treeview树 递归方法
  13. 在肉鸡上构建一个完美的虚拟主机
  14. 求两个整数最大公约数
  15. 【安装记录】安装 pyzmq ==19.0.2 报错记录
  16. 需求文档(PRD)撰写指南
  17. 黄金避险有效?量化实测黄金资产与A股轮动真实收益
  18. 程序猿还在拿死工资?还不知道怎么利用技术挣钱?——python量化实践
  19. 反向比例运算电路微分关系_电气必备20个经典电路,老电工必看!
  20. 复旦大学计算机本科培养方案,复旦大学本科通识教育培养方案(核心课程)

热门文章

  1. Linux-逻辑卷LVM
  2. 数据库设计3个泛式和经验谈
  3. 从零实践强化学习之连续动作空间上求解RL(PARL)
  4. TypeError: __init__() takes 1 positional argument but 2 were given
  5. 【UVA10859】Placing Lampposts
  6. CentOS 配置 NodeBB
  7. 吴恩达机器学习笔记-无监督学习
  8. 解决lightdm启动时黑屏的问题
  9. Blog的浏览量达到1000时将发布“曾经桑海难为水之三”
  10. IDEA 使用 git (码市)