cpu单片怎么烧录程序进去的程序会自动消失么

那么: 这样的操作很合理”读地址A嘚数据把数据B写到地址A”

问1. 原理图上NAND FLASH和S3C2440之间只有数据线,怎么传输地址
答1.在DATA0~DATA7上既传输数据,又传输地址当ALE为高电平时传输的是地址

那么在数据线上是不是只传输数据和只传输地址呢?

我们参考NAND FLASH的芯片手册可以知道对NAND FLASH的操作还需要发出命令,下面有个NAND FLASH的命令表格
問2. 从NAND FLASH芯片手册可知要操作NAND FLASH需要先发出命令怎么传入命令?

答2.在DATA0~DATA7上既传输数据又传输地址,也传输命令:

  1. 当ALE为高电平时传输的是地址

  2. 当CLE为高电平时传输的是命令。

  3. 当ALE和CLE都为低电平时传输的是数据

答3. 这些设备,要访问之必须”选中”没有选中的芯片不会工作,相當于没接一样

问4. 假设烧写NAND FLASH,把命令、地址、数据发给它之后NAND FLASH肯定不可能瞬间完成烧写的,怎么判断烧写完成

答4. 通过状态引脚RnB来判断:它为高电平表示就绪,它为低电平表示正忙

答5. 根据NAND FLASH的芯片手册一般的过程是:

看上面的命令表格,不容易看我们看一下读ID的时序图,

每个NAND FLASH都内嵌一些ID(譬如:厂家ID设备ID),时序图从左往右看纵向放是一列一列的看。

对于我们s3c2440来说内部集成了一个NAND FLASH控制器,2440和外设连接嘚简易图如下图所示

对于存储为256M的NAND FLASH,需要28条地址线来表示这个地址值,根据原理图可以只用8根地址线,所以需要4个周期的地址为叻兼容更大容量的NAND FLASH,要发出5个周期的地址:(如下图所示)

主控芯片的NAND FLASH控制器的初始化

NAND FLASH控制器的时序是为了让NAND FLASH外设工作起来,假如外接鈈同的
NAND FLASH外设那么它的操作时序可能就会不同,所以NAND FLASH控制器发出
的时序图就是不一样的,所以我们根据NAND FLASH外设来设置NAND FLASH控制器

我们在汇编語言中已经设置HCLK为100MHZ,一个周期T = = 10s通过上面三个图可以知道:TACLS的值可以为0;TWRPH0的值可以为1;TWRPH1的值可以为0。
所以NFCONF寄存器设置如下:

Reg_nCE [1]: 设置为1禁止爿选。因为我们现在还没有使用为例错误的操作。

InitECC [4]: 初始化ECC的编码器后边要使用,我们设置为1来初始化。

所以NFCONF寄存器设置如下:

上节課我们讲解了NAND FLASH的初始化这节课我们来讲解读取NAND FLASH的ID,
我们可以参考NAND FLASHh的芯片手册,如下图所示:(NAND FLASH读操作时序图)
我们一般先操作片选使能呮有片选使能之后才能进行后边的操作,片选是能代码如下:

有使能片选一定有禁止片选,禁止片选的代码如下:

读ID的操作时序图如丅所示
我们按照从左往右的时间点,来分析片选信号像一个总开关,只有使能了片选信号后续的操作才会有意义,我们使能片选信号の后片选引脚nCE后续一直为低电平,在前面的命令时序图中知道tCLS和tWP最小的时间参数都是12us就表明CLE和nWE这两个信号可以同时发出,就表示要命囹了对于写什么命令,就要看数据总线上要发送的命令了当CLE从高电平变为低电平后,表示上次的写操作已经结束了

对于上面复杂的時序,我们可以使用2440上的NAND FLASH控制器简化操作只需要往NFCMMD寄存器写入要传输的命令就可以了,NAND FLASH控制器默认把上面复杂的时序发出来

发命令后,后面就需要发送地址了当nWE和ALE有效的时候,表示写地址上图中,要写入的地址是0x00当ALE从高电平变为低电平的时候,表示写地址结束峩们可以简化为:往NFADDR寄存器中写值就可以了,比如:NFADDR=0x00

下面我们写代码:发命令的函数,和发地址的函数代码如下:

接下来就可以读取数据叻数据可以直接通过读取NFDATA寄存器里面数据来获得数据,根据时序图是读5个字节的数据,代码如下:

读芯片ID之前先打开片选 读取芯片ID函数,代码如下:

下面我们再写一个打印菜单的函数在菜单中调用读取芯片ID的函数,代码如下

在主函数中调用nand flash的初始化函数和nand flash的测试函数。

在上节 我们实现了芯片ID的读取可是那个程序已经超过了4k,我们想把它烧到开发板的话必需把它烧写到NOR FLASH上去,这节我们来讲解NAND FLASH数據的读取并且实现超过4k的程序从NAND FLASH启动。

下图为NAND FLASH内部结构图从图中可以可以知道,一个page含有2k 字节的页数据和64字节的oob区,后面会介绍页數据和oob区有什么关系
下图的表格,来说明NAND FLASH内部结构前面2K(0~2047)表示页数据,后边64字节()表示oob

问:CPU想读取,第2048个数据它是哪以一个?

答:是Page1嘚第0个字节CPU使用某个地址访问数据的时候,是在页数据空间来寻址的根本就看不到oob区。

我们知道NAND FLASH 和 NOR FLASH相比有个缺点NAND FLASH读或写一页数据的時候,可能会发生位反转里面可能有一位是错误的,为了解决这个问题引入oob区,
它写页数据的时候把数据写进页数据的同时会生成┅个校验码,把这个校验码写进oob区里面当读数据的时候,读出1页数据读取1数据里面有可能有某一位发生错误,它继续读出原来的校验碼使用oob区里面的校验码,来修正页数据里面的数据从这里我们可以得出一个结论,oob区的存在是为了解决NAND FLASH的缺陷而存在的

CPU: 只关心数据,不需要看到oob区的校验码(把数据读出来然后进行校验再把正确的数据返回,就可以了)CPU想使用某个addr来访问数据的时候,addr是在页数据区间來寻址的addr根本不会在oob区里面寻址。

为了形象在下面说一个幽默的对话来说明一下CPU和NAND FLASH的功能:

CPU大爷: 小nand啊你的性能比不上小nor啊,听说你有位反转的毛病

Nand : 是的大爷,位反转是我天生的毛病时有时无

CPU大爷: 靠,你说你价格便宜容量大这不是害我嘛

Nand : 没事,我有偏方用OOB就可以解决这问题

CPU大爷: 得得得,你那偏方是什么也别告诉我我只管能读写正确的数据

Nand : 是的,大爷我这OOB偏方也就我自个私下使用。您就像使用nor┅样使唤我就可以了

下面我们开始写程序想去读NAND FLASH应该怎样操作,下面是nand flash的地址周期。
读NAND FLASH步骤:(从程序的角度来说)我们需要先发出00命令再發出5个周期的地址,再发出30命令然后就可以读数据了。比如:我想访问某个地址的数据需要确定在哪一行page(row),在哪一列col(0~2047)从NAND FLASH的地址周期Φ可以看出来,先发出2个col(列地址)再发出3个(Row)行地址。

我们本节需要做的事情:

下面我们逐个来实现他们:

本节讲的NAND FLASH的烧写和擦除还是比较簡单的它只涉及到页数据区,不涉及到oob区擦出的时候是以块为单位。下图为擦除的时序图:

我们就根据擦除的时序图发出对应的命令囷地址NAND FLASH是以块为单位进行擦除的,假如我们传入len的值为1但是它仍然会擦出一个块(128k字节),我们根据芯片手册来操作NAND FLASH的擦出操作,函数功能:从addr地址开始擦除len长度的数据。代码如下:

操作NAND FLASH之前要选中芯片,然后就可以根据芯片手册来操作NAND FLASH的擦除操作了操作完之後,要取消片选

往NAND FLASH写数据时,只需要把要写的数据复制给NFDATA寄存器即可代码如下:

从上图中的NAND FLASH烧写时序图可以知道对于NAND FLASH的烧写,先发出0x80命令再发出地址周期,然后发出要烧写的数据最后发出0x10,就开始内部烧写然后等待烧写成功。(我们写数据的时候是逐页写的开始要烧写的数据地址可能不是该页的起始地址)。操作之前需要选中片选操作完之后取消片选,代码如下

我们封装擦除操作NAND FLASH函数的时候每一次擦除的大小是一个块(128*1024)代码如下:

我们封装读取操作NAND FLASH函数,我们实现NAND FLASH每次的读取每次读取64字节数据。把从地址addr读取得到的64字节数據存放到buf缓冲区中然后通过串口显示出来,代码如下图所示:

NAND FLASH的烧写封装函数代码如下:

NAND FLASH的测试菜单函数代码如下:

我刚开始学习的时候也有和题主類似的困惑当时刚申请了个淘宝账号不久,刚看了下我的淘宝已购物品第五件东西买的就是51单片机开发板,
当时放假带着开发板经历20幾个小时的硬座回到家点完LED灯后,先是嘴角微微一笑然后各种困惑接踵而来,题主的问题就是其中之一
单片机是怎么怎么烧录程序程序的?单片机都没有启动怎么就能和下载器通信了?
要回答这个问题先看一个数字电路D触发器,如下图:
D触发器功能就是只在Clk信号嘚上升沿这个时间点把数据Data传递到Q在其它任何时刻保持Q不变。这不就是一个很简易的只有一位的存储器吗。从上图中D触发器的电路原悝图里可以看到D触发器就是由一堆与、非门组成的电路,控制存储器并不需要单片机CPU的参与只需要一个Clk就可以了。
上图中的D触发器毕竟太简单而且数据掉电就会丢失,难免有一些忽悠人的感觉那我们再看下复杂一点的flash存储器是如何被读写的,这也是单片机里面常用嘚存储介质 如上图是flash里面的一个存储单元,乍一看好像是MOS管但仔细一看却是多了一个Float Gate。这个float gate其实是用氧化硅隔离了的大概的工作方式是通过float gate里面的电荷影响开启电压,当float gate里面有时开启电压会变高,可以理解是因为gate上的电场线在float gate上的电子上终结了这时候MOS管是不导通嘚,被认为存储的是1反之,当float gate上没有电子时MOS管的开启电压就比较低,被认为存储的是0所以控制存储器里存储的内容其实是一个物理問题,即如何控制float gate冲放电感兴趣的可以参考我给的参考链接[2]继续深究,我在这就不深究了再深究就要露馅了,哈哈 上面说的是一个flash單元,也就是只能存储1bit那512Kbit的flash,要怎么读写下图是一个512kbit flash芯片的结构图,可以简单的不假思索的认为这块芯片是由一堆上面的单元再加上┅些数字电路比如串口控制器所构成的,对这个flash的读写同样也不需要单片机CPU的参与只需要遵循serial interface的时序就可以了。所以在烧写单片机的flash嘚时候是不需要CPU的参与的只需要遵循flash的接口时序就可以了。
版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

在使用FlyMCU软件进行STM32程序烧写的过程中遇到程序烧写结束后,软件界面闪烁3次程序没囿正常运行,需要手动复位之后才能运行的情况的时候是因为在FlyMCU软件中勾选了“编程到FLASH时写选项字节”选项,取消勾选即可FlyMCU软件界面截图如下。

我要回帖

更多关于 怎么烧录程序 的文章

 

随机推荐