STM32F10x处理器在应用中编程的实现方法

发布者:Xingfu6666最新更新时间:2012-08-07 来源: 单片机与嵌入式系统关键字:STM32F10x  内存映射  IAP 手机看文章 扫描二维码
随时随地手机看文章
引 言
   
Cortex-M3是首款基于ARMv7-M体系结构的32位标准处理器,RISC结构,包含高效灵活的Thumb-2指令集,拥有杰出的低功耗特性,为微控制器系统、汽车车身控制系统、工业控制系统和无线网络等嵌入式应用量身设计。ST公司推出基于Cortex-M3内核的STM32系列处理器,凭借其出众的性能、创新的外设、优越的功耗控制,得到众多工程师的青睐。
    针对嵌入式应用的特点,STM32处理器提供功能强大的硬件调试接口——JTAG接口和串行接口,极大方便了设计,缩短了产品的开发周期。不仅如此,STM32处理器内嵌的闪存存储器允许在电路编程(In-Circuit Pro-gramming,ICP)和在应用中编程(In-Application Program-ming,IAP)。利用在应用中编程,仅需通过一根串口线,就可以完成产品固件的更新。本文对STM32处理器的在应用中编程进行了详细的分析,结合硬件和驱动给出了IAP的具体实现方法,稍加修改,便可应用于STM32处理器的所有系列产品。

1 STM32F10x处理器
1.1 STM32处理器特点

    STM32全系列处理器具有脚对脚、外设及软件的高度兼容性。这给应用带来很好的灵活性,易于将应用升级到不同存储空间或不同封装的平台。STM32处理器的产品全系列兼容,使得项目之间的代码重用和移植很方便。
1.2 STM32处理器内存映射
    Cortex-M3的存储系统采用统一编址的方式,程序存储器、数据存储器、寄存器被组织在4 GB的线性地址空间内,以小端格式(little-endian)存放。内存映射如图1所示。

    在代码区,0x00000000地址为启动区。上电以后,CPU从这个地址开始执行代码0x08000000为用户Flash的起始地址,0x1FFFF000为系统存储器(system memory)的起始地址。对于STM32处理器,可以通过配置BOOT0和BOOT1两个引脚来选择不同的启动模式,如表1所列。CPU在时钟信号的第4个上升沿锁存BOOT引脚的值,根据两个引脚的值将对应的存储器物理地址映射到启动区。

    系统存储器也称为“大信息块”,有2 KB的容量。所有上市的STM32处理器,在出厂前已经烧写进去自举模式下的启动程序(Bootloader),并且将之锁定防止用户擦写。通过配置BOOT0和BOOT1选择系统存储器启动,相应的启动程序在复位后得以执行,配合PC端的通信软件,通过USART1口允许用户将程序烧写到用户Flash区。之后,将BOOT0和B00T1重新配置为用户Flash存储器启动,进入正常的应用程序。
    上述的自举模式类似于ISP编程,相比其他烧写方式方便许多,但真正方便灵活的是在应用中编程(IAP),只需一根串口线就可以载入程序,复位后立即执行新的应用程序。

2 IAP功能原理
    在应用中编程(IAP)使得用户可以在程序运行时重新对Flash进行编程。简单地说,IAP的编程工作是:下载编译好的二进制文件数据到RAM;将数据重新编程到特定的Flash区。这两个工作是由IAP驱动程序完成的。使用IAP功能后,系统的固件由2部分组成:第1部分是IAP驱动,不执行通常的功能,而是通过微控制器支持的任一种通信管道(如USB、USART、SPI等,本文使用USART)接收数据,并执行对第2部分代码的更新;第2部分是真正的应用程序代码,实现具体的功能。这两部分代码共同烧写在Flash中。要注意的是,这两部分代码不能重叠,否则无法实现IAP功能。
    系统上电以后,IAP驱动首先运行,它主要执行如下的操作:
    ①根据硬件信号或软件条件判断是否需要对第2部分代码进行更新;
    ②如果不需要更新,则跳转到④;
    ③执行更新操作;
    ④跳转到第2部分代码执行。
    STM3210x处理器IAP驱动的流程如图2所示。图中显示IAP主界面是利用超级终端实现的,传输协议用的是Ymodem协议。需要注意的是,由于IAP驱动占用了用户Flash区的一段起始空间,因此Flash的可编程最大空间要把这部分除去。

3 IAP功能实现
3.1 硬件电路
   
采用STM32F10x型处理器作为核心。该处理器可全速工作在72 MHz,拥有3个USART接口,内嵌128 KB Flash和20 KB SRAM。Flash是以页的形式组织的,擦除1页的时间约为20~40 ms;在整个工作范围内其擦除次数可达10 000次,经10 000次擦除后,在+55℃的保存环境中数据保存期限仍可达20年。用户完全不必担心使用了IAP功能后对产品造成不良影响。
    IAP驱动使用USART1口作为通信管道,PB口的第9引脚作为IAP判断是否进入IAP功能的信号线。引出一个按键,作为IAP功能选择按键,只要在上电或复位时按住此键就会进入IAP功能主界面,否则直接执行正常应用程序。BOOT0和BOOT1是启动配置跳线。相应的硬件电路分别如图3、图4和图5所示。

[page]

3.2 IAP驱动
    IAP驱动主要包含如下源文件。
    main.c:完成Flash解锁、按键端口初始化、按键判断、USART1的初始化以及处理器的始终初始化,另外还初始化指针和跳转到应用程序处语句。然后从common.c执行主菜单。
    common.c:显示主菜单。主菜单上显示一系列操作,如加载二进制文件、执行应用程序以及禁止写保护(如果事先Flash被写保护)。
    download.c:等待用户选择传送文件操作,或者放弃操作以及一些提示信息,但真正实现传送的是ymodem.c源文件。
    ymodem.c:负责从超级终端接收数据(使用Ymodem协议),并将数据加载到内部RAM中。如果接收数据正常,则将数据编程到Flash中;如果发生错误,则提示出错。
3.3 软件实现
    要实现IAP功能,还需做一些准备工作:
    ①要准备BIN类型的代码文件。开发环境使用的是Keil,默认情况下Keil生成HEX类型的编译文件。利用Keil自带的fromelf.exe工具,就可以生成二进制文件。
    ②对超级终端进行设置。IAP驱动中对USART1的设置为:波特率为115 200 kb/s,8位数据位,1位停止位,无校验位和硬件控制。超级终端也必须保持相同设置。
    IAP驱动和应用程序代码需要分配在Flash的合适位置。图6是2部分代码在Flash中的存储情况。由于IAP驱动代码占用8 KB的空间,故而将Flash最初的8 KB划出来,应用程序是从0x08020000地址处开始存放的。这是通过在common.h头文件中语句定义的:
    #define ApplicationAddress 0x08020000
    也可以定义在其他0x08020000地址后的任何位置,只要保证应用程序大小不超过所用处理器Flash的容量。在platform_config.h头文件中有定义Flash的语句:
    #define PAGE_SIZE(0x400) //Flash页大小为1 KB
    #define FLASH_SIZE(0x20000)//Flash容量为128 KB
    STM32F10x处理器有2种Flash页的大小:1 KB和2 KB。通过以上语句即可定义页大小。
    在platform_config.h头文件中还定义了进入IAP功能选择按键映射引脚:
   

    IAP驱动在Keil中编译、链接后,利用ARM公司的RealView ULINK2仿真器将生成的HEX文件烧写到Flash中。此时Keil自带的Flash烧写工具要设置Flash的起始地址为0x08000000。在应用程序中,定义向量表的函数NVIC_SetVectorTabl(NVIC_VectTab_FLASH,0x2000)中的第2个参数,即Flash的偏移量一定要设置成0x2000或更大的数值。同时,Flash烧写工具也要做相对应的设置。将系统的串口与PC机串口相连,打开已经设置好参数的超级终端。将BOOT0跳线为0,BOOT1为0或1都可以。按住IAP功能选择按键,给系统上电。此时,在超级终端就会显示IAP功能主界面,如图7所示。

 

    在键盘上按1选择待载入二进制文件,界面上会出现提示语。在“传送”菜单中选择传送文件后,只需几秒钟可以将6 KB左右的文件烧写到Flash。下载完后,在键盘上按2或复位就可以直接执行应用程序了,如图8所示。虽然IAP功能使用的是USART1口,但进入应用程序后就可以正常使用USART1口。随时可以通过复位后按住IAP功能选择键来进行IAP方式烧写应用程序。 

结 语
    STM32F10x处理器性能出众,已被广泛应用于各种场合。其IAP功能给用户带来了极大方便,使得产品的固件更新快捷、简单。本文阐述了IAP的基本原理,并详细描述了如何在STM32F10x处理器平台中实现IAP功能,并在所设计的系统中进行了IAP实验。实验证明,该款处理器的IAP功能可靠、快捷。

关键字:STM32F10x  内存映射  IAP 引用地址:STM32F10x处理器在应用中编程的实现方法

上一篇:基于STM32嵌入式系统的智能控制网络终端设计
下一篇:STM32F10X系列微控制器标准外设库的应用

推荐阅读最新更新时间:2024-03-16 13:05

STM32F10x_RTC日历
Ⅰ、概述 接着上一篇文章来讲述关于RTC的计数功能,我们以实例RTC日历(读写年、月、日、星期、时、分、秒)来讲述该章节。 STM32F1系列芯片的RTC功能和其他系列(F0、F2、F4等)相比来说,功能要弱一点,原因在于F1系列的RTC日历功能需要我们通过软件进行处理(换算RTC计数值)才能真正实现RTC日历的功能,而其他系列芯片不用这么麻烦,可直接读取日历值。 该文和上一篇文章的区别:1、RTC时钟源选择LSE(外部低速时钟); 2、分频值是32768; 3、读写了RTC_CNT(计数值),用于RTC日历。 本文章提供的实例工程,其实验效果是: 主函数间隔0.5秒LED变化一次; 间隔1秒中断:读取日历并打印出来。
[单片机]
STM32F10x_RTC日历
STM32在线升级IAP-Hex文件和Bin文件的区别
1 - HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身 在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址。而烧写BIN文件的时候,用户是一定需要指定地址信息的。 2- BIN文件格式 对二进制文件而言,其实没有”格式”。文件只是包括了纯粹的二进制数据。
[单片机]
STM32F10X系列通用OTA bootloader移植与使用指南
写在前面 从2020.1.26到2020.1.30这5天,我的较多研究精力放在AVR和STM32的bootloader机制,做了一些阅读、实验、编写和移植的工作,最后才有了这篇文章,算是一个阶段成果汇报。 这里先简单总结磨叽一小下,接下来的小节我会尽可能详细的记录和讲解这几天的开发与研究过程。 这几天我都做了什么呢? 1.翻阅了一些AVR和STM32关于ROM存储、划分与烧写;向量表;应用跳转资料。 2.了解常用文件传输协议,并深入研究一种(我深入研究的Xmodem协议): (1)查阅文献并解决一些疑惑和问题,查看Xmodem规范 (2)阅读基于AVR的Xmodem协议IAP更新bootloader源码 (3)阅读并完善X
[单片机]
<font color='red'>STM32F10X</font>系列通用OTA bootloader移植与使用指南
基于TCP的STM32 IAP bootloader初步设计
最近研究了下IAP bootloader的实现方法,这在产品设计中是非常有用的。所谓IAP就是在线应用编程,可以用于远程程序升级。比如我们设计了一个产品,使用较为复杂的工艺被封装在精美的外壳中,或者被用于偏远的场景,如果在使用过程中需要修改程序,使用烧写器烧写是非常麻烦的,费时费力。真正的工业产品几乎都会有自己的bootloader。 其实,实现自己的bootloader在原理上并不复杂,就是通过MCU的接口把外部新的程序文件烧写到其内部的flash中,然后去运行新程序。以前怎么也没想过如何在同一个flash里面运行毫无关系的两个程序,bootloader就可以实现。其核心跳转代码就只有三行: app_pro
[单片机]
常用的几种 IAP 升级技术方案
前言 关于 IAP 技术,做过 bootloader 的想必很熟悉(IAP全称 In Application Programming,即应用编程),和 ISP(全称 In System Programming,即系统编程)不同,ISP 一般都是通过专业的调试器或者下载器对单片机内部的 Flash 存储器进程编程(如JTAG等),而 IAP 技术是从结构上将 Flash 储存器映射分为两个或者多个分区,在一个分区中对其他分区进行编程,这个分区通常称为 bootloader。 OTA(全称 Over The Air Technology,即云端下载技术,也叫做“空中下载技术”),其基础是 IAP 技术, 可以简单理解为 IAP 的另一
[单片机]
STM32F0x IAP应用软件
------------------------------------------------------------------------------------------- IAP+APP 是最基本的远程升级套件,而很多人忽略了IAP升级软件的重要性,这里就来讲讲这个IAP升级软件。暂时不考虑xmode、ymode,因为根本就不实用:在不同的WINDOWS平台都不能兼容,而且还要分X86/64BIT版本,IAP段代码占空间大。。。最多只能拿来做做试验。 ---------------------------------------------------------------------------------
[单片机]
STM32F0x <font color='red'>IAP</font>应用软件
关于STM32F10X_CONF
我搜索了一下代码,发现来自:主头文件 #include stm32f10x.h 8296行 #ifdef USE_STDPERIPH_DRIVER #include stm32f10x_conf.h #endif 上面是关于如何定位到 stm32f10x_conf.h ------------------------------------------------------------------------------------ 下面是关于如何 stm32f10x_conf.h 的作用 那你看过stm32f10x.h,是否又看过有stm32f10x.c? 不见得有.h文件就有.c文件。 在stm32f10x_con
[单片机]
基于LPC2378的IAP功能的配变监测终端远程设计
本文采用Philips公司的32位微处理器LPC2378进行配变监测终端的开发,并利用该芯片自带的IAP功能实现了终端程序的远程更新。为了降低通信流量和终端的存储空间,本文还将LZW压缩算法应用到程序更新中。 1 LPC2378芯片介绍 LPC2378是一款基于ARM7TDMI-S的32位处理器。它具有512 KB的片内Flash程序存储器、32 KB的静态RAM(SRAM),以及在系统编程(In-System Programming,ISP)和在应用编程(In-Application Program-ming,IAP)功能。由于程序对内存需求比较大,所以外扩了一片64 KB的SRAM。 通常,程序的下载可通过3种方式实现:
[单片机]
基于LPC2378的<font color='red'>IAP</font>功能的配变监测终端远程设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved