Flash写入校验采用采用16位循环冗余校验码CRC-CCITT;

/*----------------------------------------------
--功能: 字节查表法求CRC

------------------------------------------------
-*/
unsigned int do_crc(unsigned char *ptr, unsigned int len) // 字节查表法求CRC
{
  unsigned char tda;
  unsigned int crc = 0;
  while (len-- != 0)
  {
    tda = (unsigned char)(crc / 256); // 以8 位二进制数暂存CRC 的高8 位
    crc <<= 8;                        // 左移8 位
    crc ^= crc_Table[tda ^ *ptr];     // 高字节和当前数据XOR 再查表
    ptr++;
  }
  return (crc);
}

//用户自定义代码区;

/**********************************************
*功能    : crc校验
*修改    : 2004-12-07
*说明    :采用16位循环冗余校验码CRC-CCITT,其生成
          多项式为:G(x)= X16+X12+X5+1,能检测出所
          有的双错,奇数位错,突发长度不大于16的突
          发错,99.997%突发长度为17的突发错,和
          99.998%突发长度大于或等于18的突发错,
************************************************/

//unsigned int crc;          // CRC 码

const unsigned int crc_Table[256]=   //CRC表值
{0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};

uint8_t Flash_update_test(void)
{
      FLASH_EraseInitTypeDef EraseInitStruct;
    
    uint32_t uifalshdata1=0x5aa55aa5;
    //uint32_t uifalshdata2=0xffffffff;
    uint32_t PAGEError = 0;

EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;    // 刷除方式      
    EraseInitStruct.PageAddress = Flashdata_addr+USING_APPLICATIION_ADDR;    // 起始地址     
    EraseInitStruct.NbPages = 128;  //要删除的页数;

HAL_FLASH_Unlock();
    
    __disable_irq();
    HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError);
    if (PAGEError != 0xFFFFFFFF)
        {
            HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError);
    }
    
    if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,USING_APPLICATIION_ADDR ,uifalshdata1 )!=HAL_OK)
        {
            HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,USING_APPLICATIION_ADDR ,uifalshdata1);
    }
        __enable_irq();
        
    HAL_FLASH_Lock();
    
    return (0);
}

uint8_t Flash_update_Page(uint8_t *UpdateBuffer,uint8_t PageIndex,uint8_t *BufferLen)
{
      FLASH_EraseInitTypeDef EraseInitStruct;

uint8_t ucStatus=0;
    //uint32_t uifalshdata1=0x5aa55aa5;
    //uint32_t uifalshdata2=0xffffffff;
    uint32_t PAGEError = 0;
    uint32_t uiUpdata[FLASH_PAGE_SIZE/4]={0};
    uint32_t pagelen;
    //uint32_t WritePagelen;
    
    uint32_t flash_offset = (PageIndex - 1) * FLASH_PAGE_SIZE;
    uint32_t flash_addr   = Flashdata_addr+USING_APPLICATIION_ADDR + flash_offset;

EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;    // 刷除方式      
    EraseInitStruct.PageAddress = flash_addr;    // 起始地址     
    EraseInitStruct.NbPages = 1;  //要删除的页数;128

pagelen = BufferLen[0]*256 + BufferLen[1];
    pagelen -=9; //减去数据以外长度;
    if(pagelen>FLASH_PAGE_SIZE)return (1);
    memcpy(uiUpdata, UpdateBuffer, pagelen);
    IAPlen_total +=pagelen;

HAL_FLASH_Unlock();

/* 擦除1页 */
    __disable_irq();
    HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError);
    if (PAGEError != 0xFFFFFFFF)
        {
            HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError);
    }

/* 写1页,2次半页写完成 */
    for(uint8_t i=0;i<2;i++)
        {
            if(HAL_FLASHEx_HalfPageProgram(flash_addr+(i*Flash_HalfPage),&uiUpdata[i*16])!=HAL_OK)
                {
                    HAL_FLASHEx_HalfPageProgram(flash_addr+(i*Flash_HalfPage) ,&uiUpdata[i*16]);
            }
    }

/* 校验 */
    //TBD.
        __enable_irq();
    HAL_FLASH_Lock();
    
    return ucStatus;
}

uint8_t Flash_update_End(uint8_t *BufferLen,uint16_t NewAppLength)
{
    uint32_t uiUpDatelen;
    uint16_t uiCRC16out;
    uint16_t uiCRC16in;

uiUpDatelen=((BufferLen[12]<<16) +(BufferLen[13]<<8) + BufferLen[14]);
    uiCRC16in = ((BufferLen[15]<<8) + BufferLen[16]);

if((uiUpDatelen==0) || (uiUpDatelen!=NewAppLength))
        return(1);
    
    uiCRC16out= do_crc((unsigned char *)(Flashdata_addr+USING_APPLICATIION_ADDR), NewAppLength);
    if(uiCRC16out!=uiCRC16in)
        return(2);
    
    return (0);
}

//读取指定地址的半字(16位数据)
uint16_t FLASH_ReadHalfWord(uint32_t address)

return *(__IO uint16_t*)address; 
}

//读取指定地址的全字(32位数据)
uint32_t FLASH_ReadWord(uint32_t address)

return *(__IO uint32_t*)address;
}

STM32L071 Flash写入的数据进行CRC-CCITT校验相关推荐

  1. STM32F103C8T6通过内部Flash写入读取数据,模拟EEPROM(附代码)

    STM32F103C8T6通过内部Flash写入读取数据,模拟EEPROM(附代码) 优点: 1. 模块化编程,方便移植,集成度高: 2. 拿来直接用 Flash空间定定义 主函数初始化已经Flash ...

  2. 新唐M480系列单片机写入dataflash数据

    因为项目第一次接触新唐的单片机,其大部分功能和开发环境和STM32是相似或者一样的,所以很多操作可以借鉴STM32的开发方式.也有很多操作细节不太一样,这篇博客主要是记录我在开发过程中所遇到的问题. ...

  3. STM32F10X SPI操作flash MX25L64读写数据

    STM32F10X SPI操作flash MX25L64读写数据 前一段时间在弄SPI,之前没接触过嵌入式外围应用,就是单片机也只接触过串口通信,且也是在学校的时候了.从离开手机硬件测试岗位后,自己一 ...

  4. STM32 FLASH 写入不成功问题

    STM32 FLASH 写入不成功问题 STM32 FLASH 写入不成功问题 STM32 FLASH 写入不成功问题 遇到一个很奇怪的问题,我从STM32FLASH的0x08024000开始往进些数 ...

  5. STM32F10X SPI操作flash MX25L64读写数据(转)

    源:STM32F10X SPI操作flash MX25L64读写数据 前一段时间在弄SPI,之前没接触过嵌入式外围应用,就是单片机也只接触过串口通信,且也是在学校的时候了.从离开手机硬件测试岗位后,自 ...

  6. [单片机][cx32][填坑日记] 从AC5到AC6 flash写入功能异常

    通过keil ide 把编译换成AC6,发现flash写入失效了,通过仿真发现,栈数据全部异常了(错位).于是找到了uint64_td导致的异常. 先看看修复内容:

  7. STM32利用flash读取音频数据读取与DAC播放

    目录 一.博客内容 二.Flash地址空间的读取 2.1 Flash原理 2.2 软.硬件准备 2.3 利用CubeMX建立工程 2.4 工程代码 2.5 ST-Link的使用 ​2.6 仿真调试 三 ...

  8. MATLAB读取写入文本数据最佳方法 | Best Method for Loading Saving Text Data Using MATLAB

    MATLAB读取文件有很多方法.然而笔者在过去进行数据处理中,由于函数太多,相互混杂,与C#,Python等语言相比,反而认为读取文本数据比较麻烦.C#和Python等高级语言中,对于大部分的文本数据 ...

  9. 写文件 —— 将内容按照指定格式写入配置文件(fwrite()函数-》》向指定的文件中写入若干数据块)

    例如 -- 文件中的配置内容格式如下: dat.txt的文件的内容为 [root@localhost tool]# cat dat.txt  aa1213bbcc1415dd 参数说明 size_t ...

最新文章

  1. 旧电脑装什么系统最快_旧电脑装什么系统最好?试试Porteus,小巧强悍,直降CPU占用率!...
  2. python怎么知道用哪个库使用-Python链接数据库,使用哪个库,怎么操作?
  3. Eval.cs的改进版 动态编译类,可以计算表达式,也可以调用系统中的类
  4. 二十万字C/C++、嵌入式软开面试题全集宝典七
  5. 在vue项目中使用树形结构的穿梭框
  6. 华兴数控g71外圆循环编程_数控车床加工时的复合循环指令G70,G71,G72,G73
  7. CCF 201612-2 工资计算 java 解题
  8. 博文荐书:阿里运维、Java微服务、Scala编程
  9. linux查看文件标签,linux下不解包查看tar包文件内容
  10. delphi 2010 mysql_Delphi2010 DBExpress+MySQL 程序的打包
  11. java实现文件的复制
  12. 论文指导教师评语计算机,毕业论文指导教师评语
  13. 合并多个DataTable统计数据
  14. 计算机复制教程,介绍几款常用的屏幕拷贝工具,快速抓取电脑画面
  15. html可编辑的表格
  16. Vue实例生命周期函数(钩子函数)详解
  17. maven打包报错 Failed to execute goal org.apache.maven.plugins:maven-jar-plugin:3.0.2:jar
  18. 汉锐4K广播专业会议摄像机
  19. 基于Opencv的颜色识别
  20. 物联网实训室建设方案

热门文章

  1. sqlite 查找表中多余的重复记录
  2. 索引及其背后的数据结构(顺带介绍了一下子查询和合并查询)
  3. 【算法】求n的m次方(快速幂取模)
  4. 写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。
  5. 不同比例,不同尺寸的笔记本屏幕对比
  6. 国产手机已经用上了 120W 快充技术,苹果还在用20W的原因
  7. 大学生创新创业万学答案
  8. Unity引擎UI模块知识Tree
  9. Allegro基本规则设置指导书之Electrical Total Etch Length
  10. 从初级到资深:程序员的职业生涯思考与可迁移技能培养