STM32f103 —— 内部flash读写

来源:互联网 发布:php类与对象person 编辑:程序博客网 时间:2024/06/04 22:21
#ifndef _MCU_FLASH_H_#define _MCU_FLASH_H_#include "type.h"// STM32C8T6 64KB FLASH,20KB RAM,1个扇区1KB,程序起始0x8000000#define FLASH_START_ADDR    ((uint32_t)0x8000000)#define FLASH_END_ADDR      ((uint32_t)(0x8000000 + FLASH_SECTOR_NUM * FLASH_SECTOR_SIZE))#define FLASH_SECTOR_NUM    128  // 扇区数量#define FLASH_SECTOR_SIZE   1024 // 扇区大小1KBtypedef enum{   FLASH_FAILURE = 0,  FLASH_SUCCESS,} flash_status_t;//===========================================================================flash_status_t FlashErase(uint32_t addr, uint8_t count);uint32_t FlashWrite(uint32_t addr, uint8_t *buffer, uint32_t length);uint32_t FlashRead(uint32_t addr, uint8_t *buffer, uint32_t length);#endif /* _MCU_FLASH_H_ */

#include "mcu_flash.h"#include <string.h>#include "stm32f10x_flash.h"// addr:地址  count:块数量flash_status_t FlashErase(uint32_t addr, uint8_t count){  uint8_t i;  for(i = 0; i < count; ++i)  {    if(FLASH_ErasePage(addr + i * FLASH_SECTOR_SIZE) != FLASH_COMPLETE)    {      return FLASH_FAILURE;    }  }  return FLASH_SUCCESS;}uint32_t FlashWrite(uint32_t addr, uint8_t *buffer, uint32_t length){  uint16_t i, data = 0;  FLASH_Unlock();  for(i = 0; i < length; i += 2)  {    data = (*(buffer + i + 1) << 8) + (*(buffer + i));    if(FLASH_ProgramHalfWord((uint32_t)(addr + i), data) != FLASH_COMPLETE)    {      return i;    }  }    FLASH_Lock();  return length;}uint32_t FlashRead(uint32_t addr, uint8_t *buffer, uint32_t length){  memcpy(buffer, (void *)addr, length);  return length;}

0 0
原创粉丝点击