STM32F单片机FLASH读写函数

作者:陈贞_Rock

转自:http://blog.chinaunix.net/uid-26729065-id-3419459.html


头文件
文件名:FLASH.h

点击(此处)折叠或打开

  1. #ifndef __FLASH_H__
  2. #define __FLASH_H__


  3. #include "stm32f10x.h"
  4. #include "stm32f10x_flash.h"




  5. #if defined (STM32F10X_HD)|| defined(STM32F10X_HD_VL)|| defined (STM32F10X_CL)|| defined(STM32F10X_XL)
  6. #define FLASH_PAGE_SIZE ((uint16_t)0x800)

  7. #else
  8. #define FLASH_PAGE_SIZE ((uint16_t)0x400)
  9. #endif




  10. int Flash_Read(uint32_t iAddress, uint8_t*buf, int32_t iNbrToRead);
  11. int Flash_Write(uint32_t iAddress, uint8_t*buf, uint32_t iNbrToWrite);


  12. #endif


源文件:

文件名:FLASH.c

点击(此处)折叠或打开

  1. #include "FLASH.h"

  2. uint16_t Flash_Write_Without_check(uint32_t iAddress, uint8_t*buf, uint16_t iNumByteToWrite)
  3. {
  4.     uint16_t i;
  5.     volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;
  6.     i = 0;

  7.     // FLASH_UnlockBank1();
  8.     while((i< iNumByteToWrite)&&(FLASHStatus== FLASH_COMPLETE))
  9.     {
  10.         FLASHStatus = FLASH_ProgramHalfWord(iAddress,*(uint16_t*)buf);
  11.         i = i+2;
  12.         iAddress = iAddress + 2;
  13.         buf = buf + 2;
  14.     }

  15.     return iNumByteToWrite;
  16. }
  17. /**
  18. * @brief Programs a half word at a specifiedOption Byte Data address.
  19. * @note This function can be usedfor all STM32F10x devices.
  20. * @param Address: specifies the addressto be programmed.
  21. * @param buf: specifies the datato be programmed.
  22. * @param iNbrToWrite: the numberto write into flash
  23. * @retval if success return the numberto write,-1iferror
  24. *
  25. */
  26. int Flash_Write(uint32_t iAddress, uint8_t*buf, uint32_t iNbrToWrite)
  27. {
  28.     /* Unlock the Flash Bank1 ProgramErase controller*/
  29.     uint32_t secpos;
  30.     uint32_t iNumByteToWrite = iNbrToWrite;
  31.     uint16_t secoff;
  32.     uint16_t secremain;
  33.     uint16_t i = 0;
  34.     uint8_t tmp[FLASH_PAGE_SIZE];

  35.     FLASH_UnlockBank1();
  36.     secpos=iAddress & (~(FLASH_PAGE_SIZE-1));//扇区地址
  37.     secoff=iAddress & (FLASH_PAGE_SIZE -1);//在扇区内的偏移
  38.     secremain=FLASH_PAGE_SIZE-secoff;//扇区剩余空间大小
  39.     volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;

  40.     if(iNumByteToWrite<=secremain) secremain= iNumByteToWrite;//不大于4096个字节

  41.     while( 1)
  42.     {
  43.         Flash_Read(secpos, tmp, FLASH_PAGE_SIZE);//读出整个扇区
  44.         for(i=0;i<secremain;i++)
  45.         { //校验数据
  46.             if(tmp[secoff+i]!=0XFF)break;//需要擦除
  47.         }
  48.         if(i<secremain)
  49.         { //需要擦除
  50.             FLASHStatus = FLASH_ErasePage(secpos);//擦除这个扇区
  51.             if(FLASHStatus!= FLASH_COMPLETE)
  52.             return -1;
  53.             for(i=0;i<secremain;i++)//复制
  54.             {
  55.                 tmp[i+secoff]=buf[i];
  56.             }
  57.             Flash_Write_Without_check(secpos,tmp,FLASH_PAGE_SIZE);//写入整个扇区
  58.         }
  59.         else
  60.         {
  61.             Flash_Write_Without_check(iAddress,buf,secremain);//写已经擦除了的,直接写入扇区剩余区间.
  62.         }

  63.         if(iNumByteToWrite==secremain)//写入结束了
  64.         {
  65.             break;
  66.         }
  67.         else
  68.         {
  69.             secpos += FLASH_PAGE_SIZE;
  70.             secoff = 0;//偏移位置为0
  71.             buf += secremain;//指针偏移
  72.             iAddress += secremain;//写地址偏移
  73.             iNumByteToWrite -= secremain;//字节数递减
  74.             if(iNumByteToWrite>FLASH_PAGE_SIZE) secremain=FLASH_PAGE_SIZE;//下一个扇区还是写不完
  75.             else secremain = iNumByteToWrite; //下一个扇区可以写完了
  76.         }
  77.     }
  78.     FLASH_LockBank1();
  79.     return iNbrToWrite;
  80. }






  81. /**
  82. * @brief Programs a half word at a specifiedOption Byte Data address.
  83. * @note This function can be usedfor all STM32F10x devices.
  84. * @param Address: specifies the addressto be programmed.
  85. * @param buf: specifies the datato be programmed.
  86. * @param iNbrToWrite: the numberto read from flash
  87. * @retval if success return the numberto write, withouterror
  88. *
  89. */
  90. int Flash_Read(uint32_t iAddress, uint8_t*buf, int32_t iNbrToRead)
  91. {
  92.     int i = 0;
  93.     while(i< iNbrToRead)
  94.     {
  95.         *(buf+ i)=*(__IO uint8_t*) iAddress++;
  96.         i++;
  97.     }
  98.     return i;
  99. }


 



stm32flash是一个用于在STM32单片机上进行固件编程的开源工具,它提供了一组读写函数,用于操纵STM32内部的闪存存储器。 stm32flash读写函数包括以下几个主要函数: 1. `flash_identify()` 函数用于识别目标单片机的型号和闪存大小,它会发送读标识命令到目标单片机,并解析返回的信息。通过该函数,我们可以获取目标单片机的型号和闪存容量,以便后续的操作。 2. `flash_emit_bootloader()` 函数用于向目标单片机的闪存中编程bootloader程序。该函数会将bootloader的二进制文件读取到内存中,并通过发送编程命令将其写入目标单片机的闪存。 3. `flash_emit_firmware()` 函数用于向目标单片机的闪存中编程应用程序固件。该函数会将应用程序固件的二进制文件读取到内存中,并通过发送编程命令将其写入目标单片机的闪存。 4. `flash_read()` 函数用于从目标单片机的闪存中读取数据。该函数会发送读取命令到目标单片机,并接收返回的数据。我们可以指定要读取的地址和数据长度,以及接收数据的缓冲区。通过该函数,我们可以获取目标单片机闪存中指定地址的数据。 5. `flash_write()` 函数用于向目标单片机的闪存中写入数据。该函数会发送写入命令和要写入的数据到目标单片机。我们可以指定要写入的地址和数据长度,以及要写入的数据。通过该函数,我们可以往目标单片机闪存中指定地址写入数据。 这些函数都是通过与目标单片机进行通信,发送特定的命令来实现相应的功能。通过stm32flash读写函数,我们可以对STM32单片机的闪存进行编程和读取操作,实现固件的更新和数据的读写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值