网上查了很多资料,但都很零碎不是很完整,这里我系统总结一下从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。
上一篇:stm32驱动NOR Flash 之MX25L51245G(64MB)
下一篇:STM32-FSMC-SRAM
推荐阅读最新更新时间:2024-11-17 14:06
设计资源 培训 开发板 精华推荐
- 首都医科大学王长明:针对癫痫的数字疗法已进入使用阶段
- 非常见问题解答第223期:如何在没有软启动方程的情况下测量和确定软启动时序?
- 兆易创新GD25/55全系列车规级SPI NOR Flash荣获ISO 26262 ASIL D功能安全认证证书
- 新型IsoVu™ 隔离电流探头:为电流测量带来全新维度
- 英飞凌推出简化电机控制开发的ModusToolbox™电机套件
- 意法半导体IO-Link执行器电路板为工业监控和设备厂商带来一站式参考设计
- Melexis采用无磁芯技术缩小电流感测装置尺寸
- 千丘智能侍淳博:用数字疗法,点亮“孤独症”儿童的光
- 数药智能冯尚:ADHD数字疗法正为儿童“多动症”提供更有效便捷服务
- Vicor高性能电源模块助力低空航空电子设备和 EVTOL的发展