STM32F130ZET6执行Nor Flash程序的方法
网上查了很多资料
,但都很零碎不是很完整
,这里我系统总结一下从
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。
祝你成功。
再有,就是你的教程,其实是部分代码在外部norflash运行的问题,并不是全部代码在外部norflash,这个和代码在ram的做法有些类似,也有不同
总体而言,这个教程相当不错,lz幸苦了,建议加精。。。
貌似中断向量映射到外部norflash有点问题
Contents mismatch at: 640001D5H (Flash=FFH Required=0BH) !
Contents mismatch at: 640001D6H (Flash=FFH Required=8AH) !
Contents mismatch at: 640001D7H (Flash=FFH Required=4BH) !
Contents mismatch at: 640001D8H (Flash=FFH Required=00H) !
Contents mismatch at: 640001D9H (Flash=FFH Required=12H) !
Contents mismatch at: 640001DAH (Flash=FFH Required=91H) !
Contents mismatch at: 640001DBH (Flash=FFH Required=2EH) !
Contents mismatch at: 640001DCH (Flash=FFH Required=00H) !
Contents mismatch at: 640001DDH (Flash=FFH Required=16H) !
一周热门 更多>