打印
[Kinetis]

【经验分享】flash中一次编程区域操作讲解

[复制链接]
3782|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
【经验分享】flash中一次编程区域操作讲解
一,一次编程区域描述
        一次编程区域是芯片提供的一块具有64个字节,可以供用户存储数据的flash。这个区域对应芯片本身来说,终生只能写一次,然后就只可以进行读操作。写进去的数据无法擦除,所以操作的时候一定要三思而后行。这块flash是以8个字节为块的,也就是说64个字节一共有8块,每次操作都是针对8个字节为单位的。下面以我们的K64F120M的芯片为例,具体讲解该区域内容。
        支持这块区域的操作一共有两种命令,分别为:一次读命令(0x41)以及一次写命令(0x43).
1, 一次读命令
    执行一次读命令可以读出一次编程区域的8个字节的数据。控制命令与寄存器对应情况如下:

写完命令(其实只需要写FCCOB0和FCCOB1)之后,需要通过清除FTFE_FSTAT来发起一次区域读命令,然后读出来的值就会刷新到FCCOB4-B的寄存器中,用户只需要读取该寄存器的值即可。这里需要注意,FCCOB1的值范围只有0x00-0x07,因为我们的一次编程区域只有8块,每块8字节。读操作指令没有限制,可以无限次读。
2, 一次编程命令
    执行一次编程命令,可以对一次编程区域的8个字节写入用户想要的数据。
一次编程控制命令与寄存器对应情况如下:

写命令需要在FCCOB0写入0X43,FCCOB1写入要写数据的块号,写完命令之后,需要通过清除FTFE_FSTAT来发起一次区域读命令,然后寄存器FCCOB4-B中的数据就会永久的写入到一次编程区域,再也不能进行第二次编程以及擦除,数据对于芯片来说终身存在。
二,一次编程区域读写实现
         下面讲解如何使用代码实现一次编程区域的读与写操作。
1, 一次读命令操作
          这里以读第一个块为例,即块号为0,不同的块,只需要改变块号就行,代码操作如下:
FTFE_FCCOB0 = FTFE_FCCOB0_CCOBn(0x41); // Selects the PGMPART command
FTFE_FCCOB1 = 0x00;//选择读取第0块
/*All required FCCOBx registers are written, so launch the command */
FTFE_FSTAT = FTFE_FSTAT_CCIF_MASK;
/*Wait for the command to complete */
while(!(FTFE_FSTAT &FTFE_FSTAT_CCIF_MASK));
//存值
RecBuf[0]= FTFE_FCCOB4;
RecBuf[1]= FTFE_FCCOB5;
RecBuf[2]= FTFE_FCCOB6;
RecBuf[3]= FTFE_FCCOB7;
RecBuf[4]= FTFE_FCCOB8;
RecBuf[5]= FTFE_FCCOB9;
RecBuf[6]= FTFE_FCCOBA;
  RecBuf[7]= FTFE_FCCOBB;
通过以上的代码,就可以实现第一个块的读操作,最终读的值又放到了RecBuf数组中保存。
2, 一次编程命令操作
        这里同样以第一个块为例,即块号为0,不同的块,只需要改变块号就行,代码操作如下:
FTFE_FCCOB0 = FTFE_FCCOB0_CCOBn(0x43); // Selects the PGMPART command
FTFE_FCCOB1 = 0x00;//选择块号
FTFE_FCCOB4 = 0x00; //write data
FTFE_FCCOB5 = 0x00;
FTFE_FCCOB6 = 0x00;
FTFE_FCCOB7 = 0x00;
FTFE_FCCOB8 = 0x00;
FTFE_FCCOB9 = 0x00;
FTFE_FCCOBA = 0x00;
FTFE_FCCOBB = 0x00;
//*All required FCCOBx registers are written, so launch the command
FTFE_FSTAT = FTFE_FSTAT_CCIF_MASK;
  while(!(FTFE_FSTAT& FTFE_FSTAT_CCIF_MASK));
通过以上操作,就可以实现第一个块数据为0的写操作。
三,一次编程区域读写实例测试
本次测试的硬件平台是TWR-K64F120M, 软件平台是飞思卡尔的CW10.6。这里操作两个块,块号分别为0,1.对于0号的8个字节写入全0,对于1号写入1-8的数据。
1.     0号块写入全0读出的结果
2.     1号块写之前读的结果

3.     1号块写入1-8数据读的结果

        从寄存器中可以看到,读写的结果和预期的操作结果一直,当然本例程还做了用串口中直接发出读取的结果值,可以通过串口助手查看。
四,附件
    附件中提供了本经验分享的测试代码以及文档供大家参考,希望能够对大家带来帮助。

K64_PG1.rar (1.3 MB)

【经验分享】flash中一次编程区域操作讲解.pdf (538.54 KB)


相关帖子

沙发
FSL_TICS_ZJJ|  楼主 | 2014-8-22 17:28 | 只看该作者
不足之处欢迎指正,同时也欢迎大家分享自己的经验。

使用特权

评论回复
板凳
ar_m_cu| | 2014-8-22 20:06 | 只看该作者
这个区域一般用作什么用途呢?产品ID之类的吗?

使用特权

评论回复
地板
FSL_TICS_Jeremy| | 2014-8-25 09:35 | 只看该作者
好贴啊,不能沉啊!

使用特权

评论回复
5
FSL_TICS_ZJJ|  楼主 | 2014-8-25 15:48 | 只看该作者
ar_m_cu 发表于 2014-8-22 20:06
这个区域一般用作什么用途呢?产品ID之类的吗?

是的, 你可以放你芯片的自定义ID,以及一些你芯片唯一的数据,这个具体看你自己使用了。
芯片只是提供了这样一个区域,但切记,终生只能写一次,写之前一定要慎重。

使用特权

评论回复
6
jd972594| | 2014-8-26 09:52 | 只看该作者
仔细学习一下,免得不小心玩坏了。

使用特权

评论回复
7
qq65411253| | 2014-8-26 18:45 | 只看该作者
楼主确定只能写一次?

使用特权

评论回复
8
FSL_TICS_ZJJ|  楼主 | 2014-8-27 11:09 | 只看该作者
qq65411253 发表于 2014-8-26 18:45
楼主确定只能写一次?

当然了,这块区域就是只写一次的。

使用特权

评论回复
9
vavsz003| | 2014-8-30 15:57 | 只看该作者
   作业很精彩,顶贴。  

使用特权

评论回复
10
allknow| | 2014-9-2 14:54 | 只看该作者
很好了,了解一下,可以参考

使用特权

评论回复
11
myl593799546| | 2014-9-4 13:41 | 只看该作者
早就听说过但是还没接触过。飞思卡尔

使用特权

评论回复
12
陈泽发| | 2014-9-13 13:20 | 只看该作者
早就听说过但是还没接触过。飞思卡尔行啊

使用特权

评论回复
13
71654294| | 2014-9-26 12:20 | 只看该作者
mark 就升级了,不用输验证码了

使用特权

评论回复
14
John_Li| | 2014-9-29 12:03 | 只看该作者
长见识了,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

165

主题

5069

帖子

88

粉丝