OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6492|回复: 8

stm32f207的片内falsh,擦除是选择sector的

[复制链接]

15

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2015-3-20
在线时间
5 小时
发表于 2015-9-1 14:30:18 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]/** * @brief Erases a specified FLASH Sector. * * @param FLASH_Sector: The Sector number to be erased. * This parameter can be a value between FLASH_Sector_0 and FLASH_Sector_11 * * @param VoltageRange: The device voltage range which defines the erase parallelism. * This parameter can be one of the following values: * @arg VoltageRange_1: when the device voltage range is 1.8V to 2.1V, * the operation will be done by byte (8-bit) * @arg VoltageRange_2: when the device voltage range is 2.1V to 2.7V, * the operation will be done by half word (16-bit) * @arg VoltageRange_3: when the device voltage range is 2.7V to 3.6V, * the operation will be done by word (32-bit) * @arg VoltageRange_4: when the device voltage range is 2.7V to 3.6V + External Vpp, * the operation will be done by double word (64-bit) * * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM, * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE. */ FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange)[/mw_shl_code]
sector是从0到11,头文件定义如下
[mw_shl_code=c,true]#define FLASH_Sector_0 ((uint16_t)0x0000) /*!< Sector Number 0 */ #define FLASH_Sector_1 ((uint16_t)0x0008) /*!< Sector Number 1 */ #define FLASH_Sector_2 ((uint16_t)0x0010) /*!< Sector Number 2 */ #define FLASH_Sector_3 ((uint16_t)0x0018) /*!< Sector Number 3 */ #define FLASH_Sector_4 ((uint16_t)0x0020) /*!< Sector Number 4 */ #define FLASH_Sector_5 ((uint16_t)0x0028) /*!< Sector Number 5 */ #define FLASH_Sector_6 ((uint16_t)0x0030) /*!< Sector Number 6 */ #define FLASH_Sector_7 ((uint16_t)0x0038) /*!< Sector Number 7 */ #define FLASH_Sector_8 ((uint16_t)0x0040) /*!< Sector Number 8 */ #define FLASH_Sector_9 ((uint16_t)0x0048) /*!< Sector Number 9 */ #define FLASH_Sector_10 ((uint16_t)0x0050) /*!< Sector Number 10 */ #define FLASH_Sector_11 ((uint16_t)0x0058) /*!< Sector Number 11 */[/mw_shl_code] [mw_shl_code=c,true]一个sector应该是4k[/mw_shl_code] [mw_shl_code=c,true]请问 sector 10 对应地址是0x08050000吗 (0x50 * 4k)[/mw_shl_code] [mw_shl_code=c,true]刚用2系列的库,求解[/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

 207和103完全不一样,具体如下,最小擦除16KB 而且flash大小和你cpu的型号有关 VC 256KB VE 512KB VF 768KB VG 1024KB 末尾不同,能用到的select数目也不一样!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2015-9-1 14:30:19 | 显示全部楼层
 207和103完全不一样,具体如下,最小擦除16KB


而且flash大小和你cpu的型号有关
VC 256KB
VE 512KB
VF 768KB
VG 1024KB
末尾不同,能用到的select数目也不一样!
回复

使用道具 举报

16

主题

147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7139
金钱
7139
注册时间
2015-1-23
在线时间
105 小时
发表于 2015-9-1 15:46:15 | 显示全部楼层
#include "stm32f10x.h"
#include "UART1.h"


/* rivate typedef -----------------------------------------------------------*/
typedef enum {FAILED = 0, ASSED = !FAILED} TestStatus;

/* rivate define ------------------------------------------------------------*/
/* Define the STM32F10x FLASH age Size depending on the used device */
#if defined (STM32F10X_HD) || defined (STM32F10X_HD_VL) || (STM32F10X_CL) || defined (STM32F10X_XL)
  #define FLASH_PAGE_SIZE    ((uint16_t)0x800)
  #define FLASH_PAGES_TO_BE_PROTECTED (FLASH_WRProt_Pages12to13 | FLASH_WRProt_Pages14to15)  
#else
  #define FLASH_PAGE_SIZE    ((uint16_t)0x400)
  #define FLASH_PAGES_TO_BE_PROTECTED (FLASH_WRProt_Pages24to27 | FLASH_WRProt_Pages28to31)  
#endif

#define BANK1_WRITE_START_ADDR  ((uint32_t)0x0800F800)
#define BANK1_WRITE_END_ADDR    ((uint32_t)0x08010000)       //2K大小
 
/* Uncomment this line to program the Falsh pages */
//#define FLASH_PAGE_PROGRAM
/* Uncomment this line to Enable Write rotection */
//#define WRITE_PROTECTION_ENABLE
/* Uncomment this line to Disable Write rotection */
//#define WRITE_PROTECTION_DISABLE

/* rivate macro -------------------------------------------------------------*/
/* rivate variables ---------------------------------------------------------*/  
uint32_t EraseCounter = 0x0, Address = 0x0;
uint16_t Data = 0x1753;
uint32_t WRPR_Value = 0xFFFFFFFF, rotectedPages = 0x0;
uint32_t NbrOfPage;
volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;
volatile TestStatus MemoryProgramStatus = ASSED;

// u32 MIRAN_wdf_flash_buf[FLASH_BUF]={0x12345678,0x12345678,0x12345678};
u32 MIRAN_wdf_flash_buf[FLASH_BUF]={0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}; //MIRAN_wdf_flash_buf存储空间每四个字节代表的意义定义  参照wdf_read.txt    1024/4=256      1k大小


/******************************************************** 
函数名称:MIRAN_wdf_flash_2_e2prom 
功能描述: 把地址BANK1_WRITE_START_ADDR到 BANK1_WRITE_END_ADDR上存储MIRAN_wdf_flash_buf数据
参数说明:
返回说明: 
设 计 人:王东方 
设计时间:2015-6-9
********************************************************/
void MIRAN_wdf_flash_2_e2prom(void)
{

u16 i=0;
  /* Unlock the Flash Program Erase controller */  
  FLASH_Unlock();

//  /* Configure the Latency cycle: Set 2 Latency cycles */
//  FLASH_SetLatency(FLASH_Latency_2); //wdf

//  /* Enable the Half Cycle Flash access */ 
//  FLASH_HalfCycleAccessCmd(FLASH_HalfCycleAccess_Enable);  //wdf

  /* Define the number of page to be erased */
  NbrOfPage = (BANK1_WRITE_END_ADDR - BANK1_WRITE_START_ADDR) / FLASH_PAGE_SIZE;

  /* Clear All pending flags */
  FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);

  /* Erase the FLASH pages */
  for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
  {
    FLASHStatus = FLASH_ErasePage(BANK1_WRITE_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter));
  }
  
  /* Program Flash Bank1 */
  Address = BANK1_WRITE_START_ADDR;

//  while((Address < BANK1_WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE))
//  {
//    FLASHStatus = FLASH_ProgramWord(Address, Data);
//    Address = Address + 4;
//  }
  
   while((Address < BANK1_WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE))
  {
    FLASHStatus = FLASH_ProgramWord(Address, MIRAN_wdf_flash_buf);   //写入数据
    Address = Address + 4;
i++;
if(i>FLASH_BUF-1) //防止数组越界
{
i=FLASH_BUF-1;
}
  }

  FLASH_Lock();
  
  /* Check the correctness of written data */
  Address = BANK1_WRITE_START_ADDR;

  while((Address < BANK1_WRITE_END_ADDR) && (MemoryProgramStatus != FAILED))
  {
    if((*(__IO uint32_t*) Address) != Data)
    {
      MemoryProgramStatus = FAILED;
    }
    Address += 4;
  }


}
回复

使用道具 举报

15

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2015-3-20
在线时间
5 小时
 楼主| 发表于 2015-9-1 16:02:56 | 显示全部楼层
回复【2楼】东方赤那:
---------------------------------
。。。。
回复

使用道具 举报

16

主题

147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7139
金钱
7139
注册时间
2015-1-23
在线时间
105 小时
发表于 2015-9-1 16:17:26 | 显示全部楼层
回复【3楼】runfan:
---------------------------------
用这个函数就可以对FLASH进行写操作
回复

使用道具 举报

15

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2015-3-20
在线时间
5 小时
 楼主| 发表于 2015-9-1 16:23:43 | 显示全部楼层
回复【4楼】东方赤那:
---------------------------------
这是103的啊
回复

使用道具 举报

15

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2015-3-20
在线时间
5 小时
 楼主| 发表于 2015-9-2 10:12:02 | 显示全部楼层
回复【6楼】zc123:
---------------------------------
多谢多谢,这个数据手册能发我一份吗
回复

使用道具 举报

16

主题

147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7139
金钱
7139
注册时间
2015-1-23
在线时间
105 小时
发表于 2015-9-2 16:25:22 | 显示全部楼层
回复【6楼】zc123:
---------------------------------
你只需要改变 起始地址 和 终止地址就可以了
回复

使用道具 举报

16

主题

147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7139
金钱
7139
注册时间
2015-1-23
在线时间
105 小时
发表于 2015-9-2 16:26:40 | 显示全部楼层
参照这个文档

PM0042 STM32F10xxx闪存编程.PDF

316.71 KB, 下载次数: 143

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 02:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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