STM32芯片开发之添加外置NOR FALSH扩展代码空间

网上查了很多资料,但都很零碎不是很完整,这里我系统总结一下从0开始建立一个使用外部NOR Flash的程序的方法。

Nor Flash是通过FSMC总线可以直接读写的Flash存储器,掉电不丢失,相比NandFlash成本高,容量小,但可以作为程序存储器使用,即可以直接在NorFlash上执行代码,NandFlash虽然也可以执行代码,在至少在STM32中是不支持的,可能ARM7都是不支持的。

STM32本身Flash容量较小,不能建立大型项目,或者在代码中有大量数据时就不够用了,至少在我一直STemWin时就不能全开所有的Demo程序,很不爽。当然你将数据存储在SD卡或Flash中在通过修改代码实现数据的读取,但中会有直接读取数组方便吗?而且读取数据也不能一次全部读出来,不然RAM又不够用了,得分多次读,不然就得在外扩RAM,怎么都没有以代码形式读取NorFlash方便。

所有就有了这篇文章。

如果要在NorFlash中执行代码或放置数据要分下面几个步骤:

1.生成可以通过JTAG烧写代码到NorFlash的算法。

2.配置MDK环境,设置外部ROM地址,长度,并添加第一步生成的Flash算法。

3.配置需要放置在NorFlash中的代码选项。

下面再详细解说一下这些步骤的实现。

这里以SST39VF160为例。

1. 生成可以通过JTAG烧写代码到NorFlash的算法

1)      新建一个工作目录,如:SST39VF160。

2)      将x:\Keil_v5\ARM\Flash\STM32F10x\下的所有文件拷贝到SST39VF160目录下。

x是你的MDK安装的盘符,Keil_v5是你MDK安装的目录,老版本是Keil。


     3)      将x:\Keil_v5\ARM\Flash\SST39x160x\下的FlashPrg.c文件拷贝到SST39VF160目录下,覆盖同名文件。

4)      将x:\ Keil_v5\ARM\Flash\下的FlashOS.h文件拷贝到SST39VF160目录下。

5)      打开STM32Fx.uvprojx项目

6)      打开文件FlashDev.c和FlashPrg.c将#include "..\FlashOS.H"改为#include "FlashOS.H"


7)      打开x:\Keil_v5\ARM\Flash\SST39x160x目录下的FlashDev.c文件,其他型号Flash要打开对于型号的目录。MDK型号很全,应该都能找到。

8)      复制下面代码到FlashDev.c文件,复制在#include "FlashOS.H"一行后面。


然后修改如下


其中主要注意两点,一是增加宏定义SST39x160x,这个随你喜好起名,只要后面用到时跟这个一致就行。二是将基地址由0x000000改为0x64000000,这个是STM32连接NorFlash的地址,如果你的不是就按照你的实际情况修改。

另外还要修改FlashPrg.c文件,其中Nor Flash是16位还是8位模式,一定要搞清楚,尤其是在发送命令和写数据时。

Nor Flash是挂在FSMC总线上的,该算法要有FSMC总线的初始化,且要写在初始化函数里。即

int Init (unsigned long adr, unsigned long clk, unsigned long fnc)

{

base_adr = adr;

FSMC_NOR_Init();

return (0);

}

FSMC_NOR_Init()要你自己写。

SST39x160x的代码如下:

 

/*

 *  Initialize Flash Programming Functions

 *    Parameter:      adr:  Device Base Address

 *                    clk:  Clock Frequency (Hz)

 *                    fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)

 *    Return Value:   0 - OK,  1 - Failed

 */

void FSMC_NOR_Init(void)

{

RCC->AHBENR|=1<<8;       //使能FSMC时钟    

RCC->APB2ENR|=1<<5;      //使能PORTD时钟

RCC->APB2ENR|=1<<6;      //使能PORTE时钟

 RCC->APB2ENR|=1<<7;      //使能PORTF时钟

RCC->APB2ENR|=1<<8;      //使能PORTG时钟   

 

//PORTD复用推挽输出      

GPIOD->CRH&=0X00000000;

GPIOD->CRH|=0XBBBBBBBB; //D8,9,10,11,12,13,14,15

GPIOD->CRL&=0XFF00FF00;

GPIOD->CRL|=0X00BB00BB; //D0,1,4,5          

//PORTE复用推挽输出      

GPIOE->CRH&=0X00000000;

GPIOE->CRH|=0XBBBBBBBB; //E8,9,10,11,12,13,14,15

GPIOE->CRL&=0X00000FFF;

GPIOE->CRL|=0XBBBBB000; //E3,4,5,6,7

//PORTF复用推挽输出

GPIOF->CRH&=0X0000FFFF;

GPIOF->CRH|=0XBBBB0000;  //F12,13,14,15                                                                                         

GPIOF->CRL&=0XFF000000;

GPIOF->CRL|=0X00BBBBBB;  //F0,1,2,3,4,5

 

//PORTG复用推挽输出 PG9->NE2                                                                                    

GPIOG->CRH&=0XFFFFFF0F;

GPIOG->CRH|=0X000000B0; //G9

       GPIOG->CRL&=0XFF000000;

GPIOG->CRL|=0X00BBBBBB;//G0,1,2,3,4,5                               

 

 

FSMC_Bank1->BTCR[2] =0X00001059;

FSMC_Bank1->BTCR[3] =0X10100705;

FSMC_Bank1E->BWTR[2]=0X0FFFFFFF;

}

 

然后,打开项目属性


按照下面的示意图修改

修改ROM1地址


修改输出文件名,当然你不想改也可以,改了只是方便以后查找识别

定义预编译宏定义

完成这些之后进行编译,就会得到SST39x160x.FLM文件,将其复制到x:\Keil_v5\ARM\Flash目录中。

到此我们就有了烧写SST39VF160的算符文件。

以后我们就可以选到SST39VF160芯片,如下图


2. 配置MDK环境,设置外部ROM地址,长度,并添加第一步生成的Flash算法。

新建一个项目或打开你现有的项目,不过你的项目一定要有你的NorFlash的初始化代码,不然放在NorFlash中的代码还是不能执行。

在你的项目中在用的NorFlash的代码前必须完成对NorFlash的初始化。

下面介绍一下MDK环境的设置

1)  打开项目属性,设置ROM1的地址,注意ROM1不要打钩。


2)  选择Norflash芯片





到此MDK环境设置就可以了

3 .配置需要放置在NorFlash中的代码选项。

选中你想要放置在NorFlash中的代码文件,或文件夹,右键,选中属性设置。


将Code/Const选则到外部NorFlash上。


这样的这个文件的代码将会下载到NorFlash中。

也可以通过修改分散文件的方式实现



到此,你的程序就可以在内部Flash和外部的NorFlash中运行了。

当然一定要在使用前初始化NorFlash。

  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 我可以为您提供一个基于STM32芯片外置flash的OTA升级工程,它使用STM32CubeMX作为配置器,使用Keil IDE开发工具,支持校验文件,支持多种文件类型,支持多文件分段传输,支持断点续传,支持文件传输进度显示,支持文件烧写完成提示。 ### 回答2: STM32芯片外置Flash的OTA升级工程是一种通过网络或其他通信方式,将新的固件程序加载到主芯片外部Flash存储器中的方法。以下是一个简单的实现步骤: 1. 准备硬件配置:首先,需要连接主芯片外置Flash存储器。通常,可以使用SPI或I2C总线进行连接。确保外置Flash存储器与主芯片之间的物理接口正确连接,并正确配置主芯片的引脚。 2. 编写固件程序:开发一个用于OTA升级的固件程序。此程序负责从网络或其他通信方式接收新的固件文件,并将其写入外置Flash存储器。程序还应具备解析固件文件并验证文件完整性的功能。 3. OTA升级流程设计:设计OTA升级的流程,该流程应包括以下步骤: a. 主芯片在启动时检测外置Flash存储器中是否存在新的固件。 b. 如果检测到新的固件,主芯片启动OTA升级程序。 c. 从网络或其他通信方式接收新的固件文件。 d. 解析固件文件并验证其完整性。 e. 将固件程序写入外置Flash存储器。 f. 在固件升级完成后,主芯片重新启动,开始运行新的固件。 4. 确保稳定的升级过程:在OTA升级工程中,必须确保升级过程的可靠性。这可以通过在升级过程中使用一些算法和技术来实现,例如故障检测和恢复机制,重试机制,升级进度跟踪等。 以上是一个简单的STM32芯片外置Flash的OTA升级工程的基本步骤。具体实现还需要根据实际需求和硬件配置进行调整和扩展。 ### 回答3: STM32芯片外置Flash的OTA升级工程主要涉及软件和硬件两个方面。下面是一个简单的OTA升级工程步骤: 软件部分: 1. 首先,需要在主芯片上编写OTA升级的Bootloader程序。这个程序负责从外置Flash中读取固件升级文件,并将其写入主芯片Flash中。 2. Bootloader程序还需要检测固件升级的条件,例如外部触发信号(例如按键)、网络请求等。 3. 创建一个固件升级文件格式,包含固件的版本号、大小等信息,并将其存储在外置Flash中。 4. 当升级条件满足时,Bootloader程序将从外置Flash中读取固件升级文件,并将固件写入内部Flash中。升级过程需要进行CRC校验等操作,确保固件的完整性和正确性。 5. 升级完成后,重启系统,新的固件将会生效。 硬件部分: 1. 首先,需要选择合适的外置Flash芯片,并将其与主芯片连接。可以使用SPI或者QSPI接口进行通信。 2. 调整PCB设计,确保外置Flash与主芯片之间的电路连接正确,并提供足够的供电。 3. 外置Flash的容量和速度也需要根据实际需求进行选择,足够存储固件并达到预期的数据传输速度。 总结: 通过编写OTA升级的Bootloader程序,实现外置Flash的固件升级。在硬件上,通过正确连接和选择外置Flash芯片,确保其与主芯片之间的通信正常。这样就可以实现STM32芯片的OTA升级功能,方便进行固件升级以修复bug或添加新功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值