历史上的今天
返回首页

历史上的今天

今天是:2025年03月23日(星期日)

正在发生

2020年03月23日 | STM32芯片开发之添加外置NOR FALSH扩展代码空间

2020-03-23 来源:eefocus

网上查了很多资料,但都很零碎不是很完整,这里我系统总结一下从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_v5ARMFlashSTM32F10x下的所有文件拷贝到SST39VF160目录下。

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

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

4)将x: Keil_v5ARMFlash下的FlashOS.h文件拷贝到SST39VF160目录下。

5)打开STM32Fx.uvprojx项目

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

7)打开x:Keil_v5ARMFlashSST39x160x目录下的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_v5ARMFlash目录中。

到此我们就有了烧写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。

推荐阅读

史海拾趣

ALTERA(阿尔特拉)公司的发展小趣事

阿尔特拉(Altera Corporation)是一家以可编程逻辑器件(FPGA)和相关技术为主的半导体公司,成立于1983年,总部位于美国加利福尼亚州的圣塔克拉拉。以下是关于阿尔特拉公司发展的五个相关故事:

  1. 创立与早期发展:阿尔特拉公司由Robert Hartmann和Michael Magranet等人于1983年创立,最初致力于设计和制造电可擦除可编程只读存储器(EEPROM)。1984年,公司推出了业界第一个商用FPGA产品,即EP300系列,标志着阿尔特拉在FPGA领域的开创性突破。随后,公司不断扩大产品线,加大研发投入,逐步成为FPGA领域的领军企业之一。

  2. FPGA技术创新:阿尔特拉公司在FPGA技术方面持续进行创新。1992年,公司推出了基于静态随机存储器(SRAM)的FPGA器件,使得FPGA在速度和灵活性方面有了显著提升。此后,阿尔特拉不断推出新的器件系列和工具软件,以满足客户对于性能和可编程性的不断提升的需求。

  3. 与竞争对手的竞争:在FPGA市场,阿尔特拉与Xilinx是两大主要竞争对手。两家公司之间展开了激烈的竞争,包括技术研发、产品性能、市场份额等方面。为了在市场上取得优势,阿尔特拉不断加大研发投入,推出了一系列领先的产品和解决方案,并通过全球销售网络拓展市场。

  4. 收购与合并:阿尔特拉公司在发展过程中进行了多次收购与合并,以扩大市场份额和提升技术实力。2015年,英特尔公司以约160亿美元的价格收购了阿尔特拉,将其并入英特尔旗下成为其子公司。这一收购使得英特尔得以整合阿尔特拉的FPGA技术和产品,进一步巩固了其在半导体行业的地位。

  5. 公司发展与创新:作为英特尔的子公司,阿尔特拉继续致力于技术创新和业务拓展。公司不仅持续改进现有产品的性能和功能,还积极投入到新兴领域的研发与应用,如数据中心、人工智能、物联网等。阿尔特拉通过不断推出创新产品和解决方案,保持了在半导体行业的领先地位。

以上是关于阿尔特拉公司发展的五个相关故事,这些故事展示了阿尔特拉从创立初期到被英特尔收购的发展历程,以及其在FPGA技术领域的技术创新、市场竞争和业务拓展等方面的重要进展。

CP Technology Inc公司的发展小趣事

CP Technology Inc一直注重产品质量和客户服务。公司建立了严格的质量管理体系,从原材料采购到生产过程控制,再到产品检测和售后服务,都力求做到精益求精。这种对品质的执着追求赢得了客户的广泛赞誉和口碑传播,为公司的长期发展奠定了坚实基础。

GE Oil & Gas Digital Solutions公司的发展小趣事
检查电容和电阻元件是否有损坏或老化现象,检查电路布局是否合理以避免电磁干扰。
ELEKTRO-PLAST NASIELSK公司的发展小趣事

近年来,随着数字化技术的快速发展和应用普及,电子行业也迎来了数字化转型的浪潮。ELEKTRO-PLAST NASIELSK公司紧跟时代步伐,积极推进数字化转型工作。公司引入先进的数字化设备和系统提升生产效率和质量水平;同时加强信息化建设,实现数据共享和协同办公;此外还通过电子商务平台拓展销售渠道和服务范围。数字化转型不仅提升了公司的竞争力还为客户提供了更加便捷高效的服务体验。

Data Translation Inc公司的发展小趣事

随着公司业务的不断发展,Data Translation开始寻求全球扩张的机会。公司通过设立海外分支机构、与当地企业合作等方式,成功将产品推向全球市场。同时,公司还加大了品牌建设的力度,通过参加国际展会、发布新产品等方式提高品牌知名度。这些举措不仅为公司带来了更多的客户和合作伙伴,还进一步巩固了其在全球数据采集和处理领域的领先地位。

高通(GENITOP)公司的发展小趣事

进入21世纪,超霸电池继续加大技术研发力度,推出了Recyko绿再系列高端绿色充电套装。这一系列产品不仅外观时尚、性能卓越,还实现了快速充电、低自放电等先进技术。其中,“十分充”产品更是将充电速度提升到了前所未有的高度,仅需10分钟即可将电池电量从0充至90%以上。Recyko绿再系列的成功推出,不仅为超霸电池赢得了更多用户的青睐,也推动了整个电池行业的技术进步。

问答坊 | AI 解惑

世界名校课件网络版

本文是在网上无意看到的,觉得挺好的,就粘贴过来了。 如果有侵害到著作者的权益,请声明一下哦。 http://realcourse.grids.cn/   大学课程在线 一、伯克利 加州大学伯克利分校 http://webcast.berkeley.edu/courses.php 作为美 ...…

查看全部问答>

在不同的负载下电机的匀速转动问题

这个该怎么搞呢? 难道要去监控电机转速,发现比设定转速慢了就提高点,快了就减点,这样貌似复杂了点 有没有做过的人告诉我个解决方法啊…

查看全部问答>

谁能和我说一下:wince 远程工具的使用怎么配置,怎么连不上设备?

我用evc或者pb中的远程工具都没有连上设备 想通过tcp/ip进行连接 这是怎么回事? 怎么进行配置?…

查看全部问答>

请各位推荐一款数控电位器

阻值10K,精度能达到1欧的,谢谢了…

查看全部问答>

DSP中SCI部分的困惑!

我也是新手,我是这样理解的,刚才那两句话是不是把函数地址 赋值过去了,在调用时因为地址已经被赋值成自己写的函数所以就执行了…

查看全部问答>

用msp430完成频率的测量

#include unsigned int pwm_start,pwm_end,pwm_wide=0;   float fre=0.000; #define uchar unsigned char #define uint  unsigned int #define lint  long int unsigned int start,end; float data,num,m ...…

查看全部问答>

开发工作,我们在干吗?

        写这个帖子,是最近某个群的一个朋友经常找我帮忙弄他的毕业设计,以及我自己最近工作的一个活的一种简单思考。(当然不会提到细节咯)我在小宋哥的Q群里呆了有些时日。一天,一个叫 南瓜 的童鞋找我(真的不好意思, ...…

查看全部问答>

急求一个LM2576扩展输出电流电路

要求将LM2576的输出电流从3A扩展到10A.…

查看全部问答>

if(OSTCBPrioTb1[prio]==(OS_TCB*)0)

if(OSTCBPrioTb1[prio]==(OS_TCB*)0) 这个(OS_TCB*)0)的“0”怎么理解?…

查看全部问答>