Flash

Flash

stm32cubemx 如何配置 FLASH读写

回复

新手交流orisunli 发起了问题 • 1 人关注 • 0 个回复 • 182 次浏览 • 2019-07-17 17:26 • 来自相关话题

stm32cubemx教程之简单测试片内FLASH的烧写

软件教程admin 发表了文章 • 8 个评论 • 18800 次浏览 • 2014-11-04 17:25 • 来自相关话题

基于官方的flash例子来做的
针对flash的擦除和写入软件stm32cubemx不需要设置任何外设,因为没用到,
额,我用了一个led作为擦除后写入在读取比较的指示
所以,软件商设置好RCC和GPIO口的led灯配置,生成代码
因为,stm32cube用的最新的库函数,里面已经包含了以前stm32f1系列针对flash的操作
根本不需要自己编写任何函数.嗯,方便了不少
falsh是按照SECTOR来擦除的,这方面有很多的资料
所以打开main.c后
在用户代码输入0处写入以下代码


/[i] USER CODE BEGIN 0 [/i]/
#define DATA_32 ((uint32_t)0x12345678)

uint32_t startAddress = 0, endAddress = 0;
uint32_t data32 = 0 , MemoryProgramStatus = 0;

static FLASH_EraseInitTypeDef EraseInitStruct;
/[i] USER CODE END 0 [/i]/


以上,定义了几个变量,分别是起始地址和终止地址,这两个是我准备写入的范围
接着是data32就是32位的数据变量,等会要用来存储读出的32位数据

static FLASH_EraseInitTypeDef EraseInitStruct;

// 这个意思是flash要擦除的块的一个结构体变量,额,这个库里面定义的,我们只需要修改值就行
在main函数中用户代码输入2处写入以下代码


/[i] USER CODE BEGIN 2 [/i]/
HAL_FLASH_Unlock(); //解锁,删除和写入必须先解锁,规定的
EraseInitStruct.TypeErase = TYPEERASE_SECTORS;
EraseInitStruct .VoltageRange =VOLTAGE_RANGE_3 ;
EraseInitStruct.Sector = FLASH_SECTOR_2 ;
EraseInitStruct.NbSectors = 2;
//以上,定义删除类型是SECTORS就是块,提供的电压是3.3v的所以选VOLTAGE_RANGE_3
//从FLASH_SECTOR_2业就是第二块开始删除,删除的数量是2个
HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError);
//清除函数,如果出错则错误码存储到SectorError这个里面
startAddress = 0x08008000;
endAddress = 0x0800C000;
//设置了准备写入数据的起始地址和结束地址
while (startAddress < endAddress)
{
if (HAL_FLASH_Program(TYPEPROGRAM_WORD, startAddress, DATA_32) == HAL_OK)
{
startAddress = startAddress + 4;
}

}
//以上,如果起始地址开始累加写入,一直写入到endAddress这个地址结束,写入的是0x12345678这个数
HAL_FLASH_Lock();
//锁定,读取的话,无需解锁
startAddress = 0x08008000;
MemoryProgramStatus = 0x0;

while (startAddress < endAddress)
{
data32 = [url=__IO uint32_t[/i]]i[/url]startAddress;

if (data32 != DATA_32)
{
MemoryProgramStatus++;
}

startAddress = startAddress + 4;
}
//以上,逐个读取32位数据和前面写入的数据0x12345678对比,若不同则MemoryProgramStatus这个变量自加1
/[i]Check if there is an issue to program data[/i]/
if (MemoryProgramStatus == 0)
{
/[i] No error detected. Switch on LED4[/i]/
HAL_GPIO_WritePin (GPIOF,GPIO_PIN_6,GPIO_PIN_SET);
}
else
{
/[i] Error detected. Switch on LED5[/i]/
// Error_Handler();
}

//以上,若MemoryProgramStatus这个变量一直是0没加过,说明没有任何错误,数据写入正确,led点亮
/[i] USER CODE END 2 [/i]/

当然你也可以输入刚才写入的地址看看里面的数据是否是你要的.
以keil为例,在线调试状态下,在右下角的memery地址里面输入0x08008000,看看里面的数据,嗯,是对的 查看全部
基于官方的flash例子来做的
针对flash的擦除和写入软件stm32cubemx不需要设置任何外设,因为没用到,
额,我用了一个led作为擦除后写入在读取比较的指示
所以,软件商设置好RCC和GPIO口的led灯配置,生成代码
因为,stm32cube用的最新的库函数,里面已经包含了以前stm32f1系列针对flash的操作
根本不需要自己编写任何函数.嗯,方便了不少
falsh是按照SECTOR来擦除的,这方面有很多的资料
所以打开main.c后
在用户代码输入0处写入以下代码


/[i] USER CODE BEGIN 0 [/i]/
#define DATA_32 ((uint32_t)0x12345678)

uint32_t startAddress = 0, endAddress = 0;
uint32_t data32 = 0 , MemoryProgramStatus = 0;

static FLASH_EraseInitTypeDef EraseInitStruct;
/[i] USER CODE END 0 [/i]/


以上,定义了几个变量,分别是起始地址和终止地址,这两个是我准备写入的范围
接着是data32就是32位的数据变量,等会要用来存储读出的32位数据

static FLASH_EraseInitTypeDef EraseInitStruct; 


// 这个意思是flash要擦除的块的一个结构体变量,额,这个库里面定义的,我们只需要修改值就行
在main函数中用户代码输入2处写入以下代码


 /[i] USER CODE BEGIN 2 [/i]/
HAL_FLASH_Unlock(); //解锁,删除和写入必须先解锁,规定的
EraseInitStruct.TypeErase = TYPEERASE_SECTORS;
EraseInitStruct .VoltageRange =VOLTAGE_RANGE_3 ;
EraseInitStruct.Sector = FLASH_SECTOR_2 ;
EraseInitStruct.NbSectors = 2;
//以上,定义删除类型是SECTORS就是块,提供的电压是3.3v的所以选VOLTAGE_RANGE_3
//从FLASH_SECTOR_2业就是第二块开始删除,删除的数量是2个
HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError);
//清除函数,如果出错则错误码存储到SectorError这个里面
startAddress = 0x08008000;
endAddress = 0x0800C000;
//设置了准备写入数据的起始地址和结束地址
while (startAddress < endAddress)
{
if (HAL_FLASH_Program(TYPEPROGRAM_WORD, startAddress, DATA_32) == HAL_OK)
{
startAddress = startAddress + 4;
}

}
//以上,如果起始地址开始累加写入,一直写入到endAddress这个地址结束,写入的是0x12345678这个数
HAL_FLASH_Lock();
//锁定,读取的话,无需解锁
startAddress = 0x08008000;
MemoryProgramStatus = 0x0;

while (startAddress < endAddress)
{
data32 = [url=__IO uint32_t[/i]]i[/url]startAddress;

if (data32 != DATA_32)
{
MemoryProgramStatus++;
}

startAddress = startAddress + 4;
}
//以上,逐个读取32位数据和前面写入的数据0x12345678对比,若不同则MemoryProgramStatus这个变量自加1
/[i]Check if there is an issue to program data[/i]/
if (MemoryProgramStatus == 0)
{
/[i] No error detected. Switch on LED4[/i]/
HAL_GPIO_WritePin (GPIOF,GPIO_PIN_6,GPIO_PIN_SET);
}
else
{
/[i] Error detected. Switch on LED5[/i]/
// Error_Handler();
}

//以上,若MemoryProgramStatus这个变量一直是0没加过,说明没有任何错误,数据写入正确,led点亮
/[i] USER CODE END 2 [/i]/


当然你也可以输入刚才写入的地址看看里面的数据是否是你要的.
以keil为例,在线调试状态下,在右下角的memery地址里面输入0x08008000,看看里面的数据,嗯,是对的

无标题.png


stm32cubemx 如何配置 FLASH读写

回复

新手交流orisunli 发起了问题 • 1 人关注 • 0 个回复 • 182 次浏览 • 2019-07-17 17:26 • 来自相关话题

stm32cubemx教程之简单测试片内FLASH的烧写

软件教程admin 发表了文章 • 8 个评论 • 18800 次浏览 • 2014-11-04 17:25 • 来自相关话题

基于官方的flash例子来做的
针对flash的擦除和写入软件stm32cubemx不需要设置任何外设,因为没用到,
额,我用了一个led作为擦除后写入在读取比较的指示
所以,软件商设置好RCC和GPIO口的led灯配置,生成代码
因为,stm32cube用的最新的库函数,里面已经包含了以前stm32f1系列针对flash的操作
根本不需要自己编写任何函数.嗯,方便了不少
falsh是按照SECTOR来擦除的,这方面有很多的资料
所以打开main.c后
在用户代码输入0处写入以下代码


/[i] USER CODE BEGIN 0 [/i]/
#define DATA_32 ((uint32_t)0x12345678)

uint32_t startAddress = 0, endAddress = 0;
uint32_t data32 = 0 , MemoryProgramStatus = 0;

static FLASH_EraseInitTypeDef EraseInitStruct;
/[i] USER CODE END 0 [/i]/


以上,定义了几个变量,分别是起始地址和终止地址,这两个是我准备写入的范围
接着是data32就是32位的数据变量,等会要用来存储读出的32位数据

static FLASH_EraseInitTypeDef EraseInitStruct;

// 这个意思是flash要擦除的块的一个结构体变量,额,这个库里面定义的,我们只需要修改值就行
在main函数中用户代码输入2处写入以下代码


/[i] USER CODE BEGIN 2 [/i]/
HAL_FLASH_Unlock(); //解锁,删除和写入必须先解锁,规定的
EraseInitStruct.TypeErase = TYPEERASE_SECTORS;
EraseInitStruct .VoltageRange =VOLTAGE_RANGE_3 ;
EraseInitStruct.Sector = FLASH_SECTOR_2 ;
EraseInitStruct.NbSectors = 2;
//以上,定义删除类型是SECTORS就是块,提供的电压是3.3v的所以选VOLTAGE_RANGE_3
//从FLASH_SECTOR_2业就是第二块开始删除,删除的数量是2个
HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError);
//清除函数,如果出错则错误码存储到SectorError这个里面
startAddress = 0x08008000;
endAddress = 0x0800C000;
//设置了准备写入数据的起始地址和结束地址
while (startAddress < endAddress)
{
if (HAL_FLASH_Program(TYPEPROGRAM_WORD, startAddress, DATA_32) == HAL_OK)
{
startAddress = startAddress + 4;
}

}
//以上,如果起始地址开始累加写入,一直写入到endAddress这个地址结束,写入的是0x12345678这个数
HAL_FLASH_Lock();
//锁定,读取的话,无需解锁
startAddress = 0x08008000;
MemoryProgramStatus = 0x0;

while (startAddress < endAddress)
{
data32 = [url=__IO uint32_t[/i]]i[/url]startAddress;

if (data32 != DATA_32)
{
MemoryProgramStatus++;
}

startAddress = startAddress + 4;
}
//以上,逐个读取32位数据和前面写入的数据0x12345678对比,若不同则MemoryProgramStatus这个变量自加1
/[i]Check if there is an issue to program data[/i]/
if (MemoryProgramStatus == 0)
{
/[i] No error detected. Switch on LED4[/i]/
HAL_GPIO_WritePin (GPIOF,GPIO_PIN_6,GPIO_PIN_SET);
}
else
{
/[i] Error detected. Switch on LED5[/i]/
// Error_Handler();
}

//以上,若MemoryProgramStatus这个变量一直是0没加过,说明没有任何错误,数据写入正确,led点亮
/[i] USER CODE END 2 [/i]/

当然你也可以输入刚才写入的地址看看里面的数据是否是你要的.
以keil为例,在线调试状态下,在右下角的memery地址里面输入0x08008000,看看里面的数据,嗯,是对的 查看全部
基于官方的flash例子来做的
针对flash的擦除和写入软件stm32cubemx不需要设置任何外设,因为没用到,
额,我用了一个led作为擦除后写入在读取比较的指示
所以,软件商设置好RCC和GPIO口的led灯配置,生成代码
因为,stm32cube用的最新的库函数,里面已经包含了以前stm32f1系列针对flash的操作
根本不需要自己编写任何函数.嗯,方便了不少
falsh是按照SECTOR来擦除的,这方面有很多的资料
所以打开main.c后
在用户代码输入0处写入以下代码


/[i] USER CODE BEGIN 0 [/i]/
#define DATA_32 ((uint32_t)0x12345678)

uint32_t startAddress = 0, endAddress = 0;
uint32_t data32 = 0 , MemoryProgramStatus = 0;

static FLASH_EraseInitTypeDef EraseInitStruct;
/[i] USER CODE END 0 [/i]/


以上,定义了几个变量,分别是起始地址和终止地址,这两个是我准备写入的范围
接着是data32就是32位的数据变量,等会要用来存储读出的32位数据

static FLASH_EraseInitTypeDef EraseInitStruct; 


// 这个意思是flash要擦除的块的一个结构体变量,额,这个库里面定义的,我们只需要修改值就行
在main函数中用户代码输入2处写入以下代码


 /[i] USER CODE BEGIN 2 [/i]/
HAL_FLASH_Unlock(); //解锁,删除和写入必须先解锁,规定的
EraseInitStruct.TypeErase = TYPEERASE_SECTORS;
EraseInitStruct .VoltageRange =VOLTAGE_RANGE_3 ;
EraseInitStruct.Sector = FLASH_SECTOR_2 ;
EraseInitStruct.NbSectors = 2;
//以上,定义删除类型是SECTORS就是块,提供的电压是3.3v的所以选VOLTAGE_RANGE_3
//从FLASH_SECTOR_2业就是第二块开始删除,删除的数量是2个
HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError);
//清除函数,如果出错则错误码存储到SectorError这个里面
startAddress = 0x08008000;
endAddress = 0x0800C000;
//设置了准备写入数据的起始地址和结束地址
while (startAddress < endAddress)
{
if (HAL_FLASH_Program(TYPEPROGRAM_WORD, startAddress, DATA_32) == HAL_OK)
{
startAddress = startAddress + 4;
}

}
//以上,如果起始地址开始累加写入,一直写入到endAddress这个地址结束,写入的是0x12345678这个数
HAL_FLASH_Lock();
//锁定,读取的话,无需解锁
startAddress = 0x08008000;
MemoryProgramStatus = 0x0;

while (startAddress < endAddress)
{
data32 = [url=__IO uint32_t[/i]]i[/url]startAddress;

if (data32 != DATA_32)
{
MemoryProgramStatus++;
}

startAddress = startAddress + 4;
}
//以上,逐个读取32位数据和前面写入的数据0x12345678对比,若不同则MemoryProgramStatus这个变量自加1
/[i]Check if there is an issue to program data[/i]/
if (MemoryProgramStatus == 0)
{
/[i] No error detected. Switch on LED4[/i]/
HAL_GPIO_WritePin (GPIOF,GPIO_PIN_6,GPIO_PIN_SET);
}
else
{
/[i] Error detected. Switch on LED5[/i]/
// Error_Handler();
}

//以上,若MemoryProgramStatus这个变量一直是0没加过,说明没有任何错误,数据写入正确,led点亮
/[i] USER CODE END 2 [/i]/


当然你也可以输入刚才写入的地址看看里面的数据是否是你要的.
以keil为例,在线调试状态下,在右下角的memery地址里面输入0x08008000,看看里面的数据,嗯,是对的

无标题.png