当前位置:编程学堂 > stm32数据存储在flash中(stm32 flash存储数据)

stm32数据存储在flash中(stm32 flash存储数据)

  • 发布:2023-10-05 07:25

stm32数据存储在flash中(stm32 flash存储数据)

如何使用STM32 flash存储数据,断电后数据不丢失

STM32程序一般放在Flash中,数据放在SRAM中!如果停电肯定会丢失。不过STM32可以操作Flash,所以也可以将数据放入Flash中。这样数据就不会丢失

Stm32单片机将数据存储到FLASH闪存中?

写入前请确保该扇区已被擦除。 STM32内部FLASH是按扇区擦除的。不同的模型有不同的扇区大小。对于某些型号,不同扇区的大小也不同。 ,参见数据表。
擦除后再写入,即可锁定。
但一般不建议使用内置FLASH,可以外接FLASH。

如何在flash中存储stm32的数据

PC机通过串口传输文件,然后STM32使用串口接收。接收后写入STM32内部的Flash中?在这种情况下,第一个问题就是向Flash写入数据。一般流程为:Flash解锁->Flash擦除->Flash写入->Flash锁定。这些可以使用库函数来完成(在STM32F10x_flash.c文件中

如何在stm32flash中存储写入数据

在实际项目中,我们可能需要保存一些数据,希望下次启动时这些数据仍然可以使用。这里介绍如何使用STM32内部flash来保存数据。
这里我使用STM32F103C8T6芯片进行介绍。闪存大小为 64K。本例中使用 0x0800 0000~0x800
3000 作为 bootloader,0x0800 3000~0x0800 C000 作为程序存储地址,0x0800 C000~0x0800
FFFF 作为数据存储区域。
程序:
#include "stm32f10x_flash.h"
#define PageSize 1024
u32 data[10] = {1,2,3,4,5,6,7,8,9, 10};
u32 data_temp[10] = {0};
u8 flash_write(u32 StartAddr,u32 *p_data,u32 大小);
int flash_read(u32 StartAddr,u32 *p_data,u32 大小);

stm32中如何将数组保存到flash中?如何读取flash中保存的数组?

;\x0d\x0a GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;\x0d\x0a GPIO_Init(GPIOD, &GPIO_InitStructure); \x0d\x0a\x0d\x0a /* D4->D7 NAND 引脚配置 */ \x0d\x0a GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;\x0d\x0a GPIO_Init(GPIOE, &GPIO_InitStructure);\x0d\x0a \x0d\x0a/* CS NAND 引脚配置 */ \x0d\x0a GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; \x0d\x0a GPIO_Init(GPIOG, &GPIO_InitStructure);\x0d\x0a\x0d\x0a /* NWAIT NAND 引脚配置 */\x0d\x0a GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; \x0d\x0a GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\x0d\x0a GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;\x0d\x0a GPIO_Init(GPIOD, &GPIO_InitStructure); \x0d\x0a\x0d\x0a /*-- FSMC 配置 ------------------------------------ ------------------*/\x0d\x0a p.FSMC_SetupTime = 0x1;\x0d\x0a p.FSMC_WaitSetupTime = 0x3;\x0d\x0a p.FSMC_HoldSetupTime = 0x2; \x0d\x0a p.FSMC_HiZSetupTime = 0x1;\x0d\x0a\x0d\x0a FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank3_NAND;\x0d\x0a FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable;\x0d\x0a FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_Memory DataWidth_8b;\x0d\x0a FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable;\x0d \x0a FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_512Bytes;\x0d\x0a FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0x00;\x0d\x0a FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x00;\x0d\x0a FSMC_NANDInitStructure。 FSMC_CommonSpaceTimingStruct = &p;\x0d\x0a FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;\x0d \x0a\x0d\x0a FSMC_NANDInit(&FSMC_NANDInitStructure);\x0d\x0a\x0d\x0a /* FSMC NAND Bank Cmd Test */\x0d\x0a FSMC_NANDCmd(FSMC_Bank3_NAND, ENABLE);\x0d\x0a}\x0d\x0a 定义一个写函数\x0d\x0auint32_t FSMC_NAND_WriteSmallPage(uint8_t *pBuffer, NAND_ADDRESS 地址, uint32_t NumPageToWrite)\x0d\x0a{\x0d\x0a uint32_t index = 0x00,numPageWritten = 0x00,addressStatus = nand_valid_address; \ x0d \ x0d \ x0a uint32_t status = nand_ready,size = 0x00; \ x0d \ x0a uint8_t page = 0x37; \ x0d; \ x0d; \ x0d_ while while at(x0d depstruse ways whoous!nompagiite! && (status == NAND_READY))\x0d\x0a {\x0d\x0a /* 页写入命令和地址 */\x0d\x0a *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM;\x0d\x0a\x0d\x0a *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00; \x0d\x0a *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0X00; \x0d\x0a *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS); \x0d\x0a *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS); \x0d\x0a\x0d\x0a /* 计算大小 */\x0d\x0a size = Page + (Page * numpagewriting);\x0d\x0a\x0d\x0a /* 写入数据 */\x0d\x0a for(;索引 < 大小; 索引++)\x0d\x0a {\x0d\x0a *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA) = pBuffer[索引];\x0d\x0a }\x0d\x0a \x0d\x0a *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM_TRUE;\x0d\x0a\x0d\x0a /* 读取忙引脚*/\x0d\x0a// while( GPIO_ReadInputDataBit( GPIOG, GPIO_Pin_6) == 0 );\x0d\x0a// while( GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) == 0 );\x0d\x0a \x0d\x0a /* 检查状态是否成功操作 */\x0d\x0a status = FSMC_NAND_GetStatus();\x0d\x0a \x0d\x0a if(status == NAND_READY)\x0d\x0a {\x0d\x0a numpagewriting++;\x0d\x0a\x0d\x0a NumPageToWrite--;\x0d\x0a\x0d\ x0a /* 计算下一个小页地址 */\x0d\x0a addressstatus = FSMC_NAND_AddressIncrement(&Address); \x0d\x0a } \x0d\x0a }\x0d\x0a \x0d\x0a return (status | addressstatus);\x0d\x0a }\x0d\x0a定义一个数组TxBuffer,然后将数组写入flash\x0d\x0aFSMC_NAND_WriteSmallPage( TxBuffer, WriteAddr, 1);\x0d\x0a读取过程相反,定义读取函数\x0d\x0auint32_t FSMC_NAND_ReadSmallPage(uint8_t *pBuffer , NAND_ADDRESS Address, uint32_t NumPageToRead)\x0d\x0a{\x0d\x0a uint32_t 索引 = 0x00,numpageread = 0x00,地址状态 = NAND_VALID_ADDRESS;\x0d\x0a uint32_t 状态 = NAND_READY,大小 = 0x00;\x0d\x0a uint8_t 页 = 0x37;\x0d\x0a while((NumPageToRead ! = 0x0) && (addressstatus == NAND_VALID_ADDRESS))\x0d\x0a { \x0d\x0a /* 页读命令和页地址 */\x0d\x0a *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_READ_1; \x0d\x0a \x0d\x0a *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00; \x0d\x0a *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0X00; \x0d\x0a *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS); \x0d\x0a *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS); \x0d\x0a \x0d\x0a *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_READ_TRUE; \x0d\x0a \x0d\x0a /* 读忙脚 */\x0d\x0a// while( GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_6) == 0 );\x0d\x0a// while( GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6)== 0 );\x0d\x0a \x0d\x0a /* 计算大小 */\x0d\x0a size = Page + (Page * numpageread);\x0d\x0a \x0d\x0a /* 将数据放入缓冲区 */ \x0d\x0a for(;索引 < 大小;索引++)\x0d\x0a {\x0d\x0a pBuffer[索引]= *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);\x0d\x0a }\x0d\x0a\x0d\ x0a numpageread++;\x0d\x0a \x0d\x0a NumPageToRead--;\x0d\x0a\x0d\x0a /* 计算页地址 */ \x0d\x0a addressstatus = FSMC_NAND_AddressIncrement(&Address);\x0d\x0a }\ x0d\x0a \x0d\x0a 状态 = FSMC_NAND_GetStatus();\x0d\x0a \x0d\x0a 返回 (状态 | 地址状态);\x0d\x0a}

以上就是小编对stm32数据存放在flash中(stm32 flash存储数据)及相关问题的解答。 stm32数据存储在flash中的问题(stm32 flash stores data)希望对你有用!

相关文章