查看: 3865|回复: 4

[分享] Kinetis K60系列之flash读写

[复制链接]

该用户从未签到

16

主题

78

帖子

0

注册会员

Rank: 2

积分
178
最后登录
2018-6-1
发表于 2016-9-8 14:07:31 | 显示全部楼层 |阅读模式
Kinetis K60系列之flash读写

  1. #include "uart4.h"
  2. #include "LED.h"



  3. void Flash_init(void);
  4. U8 Flash_erase_sector(U16 sectorNo);
  5. U8 Flash_write(U16 sectNo,U16 offset,U16 cnt,U8 buf[]);
  6. U32 Flash_cmd_launch(void);
  7. U8 Flash_read(U16 sectNo,U16 offset,U16 cnt,U8*bBuf);

  8. void main(void)
  9. {
  10.     U8 NUM;
  11.     U8 Send_Flash[] = "flash ";
  12.     U8 Receive_Flash[6];

  13.     DisableInterrupts;  

  14.     UART4_Init(115200);
  15.     Flash_init();

  16.     EnableInterrupts;

  17.     while(1)
  18.     {
  19.         Flash_erase_sector(100);
  20.         Flash_write(100,0,6,Send_Flash);  
  21.         Flash_read(100,0,6,Receive_Flash);
  22.         for(NUM=0;NUM<6;NUM++)
  23.             Uart4_SendByte(Receive_Flash[NUM]);
  24.         Delay(1000); //一秒
  25.     }
  26.    
  27. }

  28. void Flash_init(void)
  29. {
  30.     FMC_PFB0CR |= FMC_PFB0CR_S_B_INV_MASK;       // 清除Flash预读取缓冲区
  31.    
  32.     while(!(FTFL_FSTAT & FTFL_FSTAT_CCIF_MASK));    // 等待命令完成
  33.    
  34.     FTFL_FSTAT = (0 | FTFL_FSTAT_ACCERR_MASK      // 清除访问错误标志位
  35.                     | FTFL_FSTAT_FPVIOL_MASK);   
  36. }


  37. U8 Flash_erase_sector(U16 sectorNo)
  38. {
  39.     union
  40.     {
  41.         U32  word;
  42.         U8   byte[4];
  43.     } dest;
  44.    
  45.     dest.word    = (U32)(sectorNo*(1<<11));

  46.     FTFL_FCCOB0 = 0x09; //擦除扇区
  47.    
  48.     // 设置目标地址
  49.     FTFL_FCCOB1 = dest.byte[2];
  50.     FTFL_FCCOB2 = dest.byte[1];
  51.     FTFL_FCCOB3 = dest.byte[0];
  52.    
  53.     // 执行命令序列
  54.     if(1 == Flash_cmd_launch())    //若执行命令出现错误
  55.         return 1;     //擦除命令错误
  56.    
  57.     // 若擦除sector0时,则解锁设备
  58.     if(dest.word <= 0x800)
  59.     {
  60.         
  61.         FTFL_FCCOB0 = 0x06; // 写入4字节
  62.         // 设置目标地址
  63.         FTFL_FCCOB1 = 0x00;
  64.         FTFL_FCCOB2 = 0x04;
  65.         FTFL_FCCOB3 = 0x0C;
  66.         // 数据
  67.         FTFL_FCCOB4 = 0xFF;
  68.         FTFL_FCCOB5 = 0xFF;
  69.         FTFL_FCCOB6 = 0xFF;
  70.         FTFL_FCCOB7 = 0xFE;
  71.         // 执行命令序列
  72.         if(1 == Flash_cmd_launch())  //若执行命令出现错误
  73.             return 2;   //解锁命令错误
  74.     }  
  75.    
  76.     return 0;  //成功返回
  77. }



  78. U8 Flash_read(U16 sectNo,U16 offset,U16 cnt,U8*bBuf)
  79. {
  80.     U32 wAddr = 0;
  81.     wAddr = sectNo * 2048 + offset;
  82.     while (cnt--)
  83.         *bBuf++=*(U8*)wAddr++;
  84.    return TRUE;
  85. }


  86. U8 Flash_write(U16 sectNo,U16 offset,U16 cnt,U8 buf[])
  87. {
  88.     U32 size;
  89.     U32 destaddr;
  90.    
  91.     union
  92.     {
  93.         U32   word;
  94.         U8  byte[4];
  95.     } dest;
  96.    
  97.     if(offset%4 != 0)
  98.         return 1;   //参数设定错误,偏移量未对齐(4字节对齐)
  99.    
  100.     // 设置写入命令
  101.     FTFL_FCCOB0 = 0x06;
  102.     destaddr = (U32)(sectNo*(1<<11) + offset);//计算地址
  103.     dest.word = destaddr;
  104.     for(size=0; size<cnt; size+=4, dest.word+=4, buf+=4)
  105.     {
  106.         // 设置目标地址
  107.         FTFL_FCCOB1 = dest.byte[2];
  108.         FTFL_FCCOB2 = dest.byte[1];
  109.         FTFL_FCCOB3 = dest.byte[0];

  110.         // 拷贝数据
  111.         FTFL_FCCOB4 = buf[3];
  112.         FTFL_FCCOB5 = buf[2];
  113.         FTFL_FCCOB6 = buf[1];
  114.         FTFL_FCCOB7 = buf[0];
  115.         
  116.         if(1 == Flash_cmd_launch())
  117.             return 2;  //写入命令错误
  118.     }
  119.    
  120.     return 0;  //成功执行
  121. }


  122. U32 Flash_cmd_launch(void)
  123. {
  124.     // 清除访问错误标志位和非法访问标志位
  125.     FTFL_FSTAT = (1<<5) | (1<<4);
  126.    
  127.     // 启动命令
  128.     FTFL_FSTAT = (1<<7);

  129.     // 等待命令结束
  130.     while(!(FTFL_FSTAT &(1<<7)));

  131.     // 检查错误标志
  132.     if(FTFL_FSTAT & ((1<<5) | (1<<4) | 1))
  133.         return 1 ; //执行命令出错
  134.   
  135.     return 0; //执行命令成功
  136. }
复制代码



回复

使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16697
    最后登录
    1970-1-1
    发表于 2016-9-8 14:57:01 | 显示全部楼层
    多谢分享
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    连续签到: 1 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7878
    最后登录
    2025-4-11
    发表于 2016-9-8 15:26:30 | 显示全部楼层
    先水一波金币再说
    nxp.png
    来根华子
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    83

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    234
    最后登录
    2016-9-11
    发表于 2016-9-8 20:06:59 | 显示全部楼层
    同上,水一波再说
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-12-11 06:45
  • 签到天数: 37 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    167

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    342
    最后登录
    2023-7-19
    发表于 2016-10-20 16:57:44 | 显示全部楼层

    同上,水一波再说
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-18 14:54 , Processed in 0.095255 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表