当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]STM32F103VB的SD卡在应用编程设计

摘要:基于在应用编程的基本原理,本文提出一种使用SD卡并通过SPI接口进行嵌入式系统固件更新的方法。以STM32F103VB作为嵌入式系统核心处理器,给出了固件更新的实现过程和验证结果,可广泛应用于基于闪存的嵌入式系统的固件升级。
关键词:嵌入式系统;在应用编程;SD卡;STM32F103VB

引言
    对于大部分基于闪存的嵌入式系统来说,一项重要的需求就是当这些系统安装在终端产品上后,具有对固件更新的能力,这个能力称为在应用编程(In-Application Programming,IAP)。在应用编程方式允许用户在程序运行过程中对程序存储器的指定区域进行重新烧写,因此广泛应用于工业生产设备、智能仪器仪表、消费电子类产品的固件更新、软件维护和功能扩展上。
    目前使用的在应用编程方案大多是通过嵌入式系统的串口或者网络接口并与PC机相连,再通过上位机软件或者网络完成对系统固件的更新,对硬件环境要求较高。考虑到目前工业设备、智能仪器和消费电子类产品多使用SD卡作为数据存储媒介,或者预留SD卡接口,在此拟采用SD卡作为固件更新文件的存储媒介,使用SPI通信接口完成对系统固件的更新。对硬件环境要求低且操作简便,可应用于工业现场设备升级和各种智能仪器仪表固件升级,也适用于消费电子产品用户升级自己的手持设备,如手机、音乐播放器、掌上游戏机等。

1 方案可行性分析
    STM32F103VB是意法半导体公司基于Cortex-M3内核的32位增强型处理器,可以丁作在72 MHz的频率下,具有128 KB闪存(Flash)和20 KB静态随机存储器(SRAM),集成了丰富的外设资源,如SPI、USART、ADC等。STM32F103VB支持在应用编程方式对闪存进行重新编程,片上闪存接口实现了闪存编程和擦除所需的逻辑电路,包括访问和写入保护以及选择字节的控制。
    SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制,由于其体积小、容量大、读写速度快、兼容性好、性价比高等特点,迅速得到了市场的认同,广泛应用于数码产品和嵌入式系统。SD卡支持SPI模式、1位SD模式和4位SD模式,可与微处理器相应外设接口进行连接。
    基于上述条件,要完成相应的硬件电路设计和软件设计。其中,软件设计主要是IAP驱动程序的设计,包括SD卡底层驱动、固件更新文件的读取和对微处理器片内闪存的擦写操作。

2 硬件设计
    STM32F103VB芯片内集成多达2个SPI接口,在从模式或主模式下,全双工和半双工的通信速率可达18Mb/s。3位的预分频器可产生8种主模式频率,可配置成每帧8位或16位。硬件的CRC产生/校验支持基本的SD卡和MMC模式。SD卡座与STM32F103VB连接示意图如图1所示。

[!--empirenews.page--]
    STM32F103VB作为主设备,SD卡作为从设备,使用片内集成SPI1接口与SD卡相连。端口PE3与SD卡片选引脚CS相连,作为其片选控制端口;SPI1_SCK为主设备时钟输出引脚,接至SD卡时钟输入引脚CLK;PSI1_MOSI为主设备数据输出端口,与SD卡数据输入端口DI相连;同理,将SD卡数据输出端口DO与主设备数据输入端口SPI1_MISO相连。利用片上通用同步/异步收发器USART1经过MAX3232收发器芯片与上位机串口相连,串口通信电路原理图如图2所示。将端口PB9配置成输入浮空模式并外接一个用户按键,作为触发IAP操作启动的判断条件,按键电路如图3所示。



3 软件设计
3.1 IAP功能实现
    在应用中编程(IAP)允许用户在应用程序运行过程中对Flash进行重新编程。整个过程主要是由IAP驱动程序来完成,它的主要工作流程是:首先在SD卡中定位用于更新固件的二进制文件,然后将该文件读出并写入用户应用程序所在的Flash区域,最后跳转到更新后的应用程序入口执行系统应用程序。因此用户程序存储区应该分为两个部分,其中一个部分存储IAP驱动程序,只用于IAP功能的执行,通过ICP方式由JTAG或者SWD接口烧写入Flash;另一部分存储真正的应用程序,用来执行用户真正需要的功能。两个部分在Flash存储区域中相互独立,不能存在重叠的部分,系统上电或者复位后首先执行第一部分代码,实现对第二部分代码的更新操作,在不需要更新系统固件的情况下直接由第一部分跳转到第二部分代码入口处执行用户应用程序。
    将存有更新程序的SD卡插入卡槽,系统重新上电或复位后通过指定按键选择是否进行IAP操作,IAP操作流程如图4所示。

[!--empirenews.page--]
3.2 STM32F103VB芯片存储组织结构
    STM32F103VB的程序存储器、数据存储器、寄存器和输入/输出端口被组织在同一个4 GB的线性地址空间内。闪存区域即用户代码区域被置于0x08000000~0x0801FFFF的地址范围。方案中IAP程序被事先烧录进0x08000000~0x08002FFF的闪存区域,用户应用程序紧接着IAP程序进行存放,可使用的范围为0x08003000~0x0801FFFF的闪存区域。IAP程序内存分配如图5所示。


3.3 FAT32文件格式
    为了方便终端用户的操作和增加方案的通用性,本设计以FAT32分区格式标准对SD卡进行格式化,FAT32分区格式常见于通用的PC机平台。FAT32分区格式如图6所示。采用FAT32分区格式的SD卡内部结构包括主启动区域、FAT表区域、根目录区域、数据存储区域四部分。
    其中位于主启动区域开始位置的第一个保留扇区为起始扇区,包括很多重要的数据信息,如每个扇区的字节数、FAT表个数及大小、每簇扇区数、总扇区数、根目录起始位置等等。FAT32包含两张FAT表,它们紧接主启动区域后面,是分区信息的映射表,主要功能是指示文档如何按簇存放。根目录区域包含了根目录下文档和目录信息的内容。在根目录区域可以获得指定文档的信息,如文档名、文档属性、创建时间、文档大小和文档在FAT表中第一个簇的地址等。数据区域是实际的文档存储的地方,占据了磁盘的大部分空间。
    FAT32分区格式中文档是以簇为最小单位进行存储的,固定每簇的容量为4 KB。一个文档根据其大小被分为一个或者若干个簇存储在数据区域,这些簇通常是以零散而不是连续的方式分布在数据存储区域,形成的单链表称为簇链,簇链的具体信息可从FAT表中获得。图7为FAT32文档读取方式示意图。


    FAT32文档读取步骤如下:
    ①在起始扇区中获取SD卡信息。
    ②根目录所在的物理地址通过下面公式得出。根目录地址=(隐藏扇区个数+保留扇区个数+FAT所占扇区个数×FAT数量)×扇区字节数。
    ③在根目录表中检索文档名为“UPDATE”的文档,获取其在FAT表中的首簇地址。首簇号的高字节和低字节位于以文档名起始的偏移量为0x14和0x1a的共四个字节。图7中UPDATE文档首簇号为0003。
    ④在FAT表的簇号为0003的位置中存放的信息为0004,即下一个簇的位置;在簇号为0004的位置中存放的是簇号为0006的地址信息,由此一步步得出由簇号组成的单链表,一直到簇号为0008的位置中存储的信息为0FFFFFFF,证明此时已到文档的末尾,簇链结束。图7中文档“UP DATE”占用的簇所形成的簇链为0003-0004-0006-0008,总共占用了4个簇、16 KB的数据存储空间。
    ⑤根据簇链中的簇号在数据存储区域中获取文档的数据内容。例如图7中文档“UPDATE”的数据内容即是由0003、0004、0006、0008四个簇中的数据内容File[0]、File[1]、File[2]、File[3]所组成。[!--empirenews.page--]
3.4 应用程序更新
    根据文档的大小擦除相应的闪存页面,然后从SD卡中读取文档数据内容到处理器的RAM中,按照闪存编程步骤将文档数据放入指定的闪存地址,完成用户应用程序的更新任务。STM32F103VB闪存每次可写入半字,即两个字节,闪存编程流程如图8所示。


    闪存编程步骤如下:
    ①检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。
    ②设置FLASH_CR寄存器的PG位为1。
    ③写入要编程的半字到指定的地址。
    ④等待BSY位变为0。
    需要注意的问题是用户应用程序在编译的时候要进行相应的设置。用户应用程序设置如图9所示。在KeilμVision开发环境下,应用程序的起始地址设定为0x08003000,同时在应用程序中也要设定向量表的偏移量为0x3000。



4 IAP实验过程及结果
    下面介绍IAP实验过程。
    ①将SD卡与PC机相连,发送新的二进制文件至SD卡的根目录下并将其重新命名为UPDATE.BIN。
    ②用串口线将PC的串口和系统的串口相连。打开PC上的超级终端工具,进行参数设置,参数设置要与IAP驱动程序中的通信方式相匹配,如相同的波特率和数据位等。
    ③系统上电后,如若不将用户按键按下,则IAP驱动程序不执行固件更新流程,直接跳转到用户应用程序入口。本应用程序为每隔1 s从串口发出“Hello world!”的字符串,并通过串口线显示在PC的超级终端上。
    ④把存有UPDATE.BIN文件的SD卡插入卡槽,按下用户按键,并同时将系统重新上电或者复位后,IAP驱动程序开始执行固件升级程序。在SD卡中检索到UPDATE.BIN文件后,超级终端上显示“UPDATE.binfounded!”,同时显示文档的大小、首簇位置、占用的簇数量和完整簇链。UPDATE.BIN文件大小为6 472字节,使用第8簇,UPDATE.BIN文件大小为6 472字节,使用第8和第9两个簇来进行存储,第8簇为文件存储的起始簇。
    ⑤得到更新固件的数据后进入闪存编程程序,新的固件下载完成后立即执行。超级终端上每隔1 s显示“It is a new program!”,证明用户应用程序升级成功。

结语
    本文给出了一种基于STM32F103VB芯片的嵌入式系统在应用编程方案,该方案采用SD卡作为升级程序的存储媒介。上文给出了详细的实现步骤和实验方案。实验结果表明该方案能可靠实现IAP功能,完成对嵌入式系统固件的更新,且实现步骤简单、快捷。其原理可以广泛用于任何一种基于闪存的嵌入式系统。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭