查看: 3008|回复: 0

[分享] (Kinetis K60)flash读写

[复制链接]
  • TA的每日心情
    开心
    2024-10-30 10:28
  • 签到天数: 48 天

    连续签到: 1 天

    [LV.5]常住居民I

    23

    主题

    138

    帖子

    0

    高级会员

    Rank: 4

    积分
    742
    最后登录
    2025-6-16
    发表于 2020-7-6 15:46:14 | 显示全部楼层 |阅读模式
    (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. }
    复制代码



    11111签到
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-23 21:05 , Processed in 0.079456 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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