STM32把不同类型数据写入flash的两种方法

由于stm32f1写入的时候只能写入16位的数据,以下列举两种方法写入flash不同数据。
1.利用指针

写操作

typedef uint16_t u16;
typedef int16_t s16;
typedef uint32_t u32;

float a=3.14159;
u32 b;
u16 SaveBuff[2];

b=*(u32 *)&a;//这句话意思是取对a取地址,然后把这个地址强转成u32 *类型,再去取这个地址的u32数据

/*取高16位和低16位*/
SaveBuff[0]=(u16)(b&0x0000ffff);		
SaveBuff[1]=(u16)(b>>16);			

/*连续写入*/
STMFLASH_Write(FLASH_SAVE_ADDR,SaveBuff,sizeof(SaveBuff));

读操作

typedef uint16_t u16;
typedef int16_t s16;
typedef uint32_t u32;

float a;
u32 b;

/*读出float数据*/
a=*(float *)faddr;

/*读出u32数据*/
b=*(u32 *)faddr;

2.利用union
写操作

typedef uint16_t u16;
typedef int16_t s16;
typedef uint32_t u32;

/*定义union类型*/
typedef union {
	u32 uint32val;
	float floatval;
}NUION32;

/*定义union变量*/
UNION32 union32;

float a=3.14159;
u16 SaveBuff[2];
union32.floatval=a;

SaveBuff[0]=(u16)(union32.uint32val&0x0000ffff);		
SaveBuff[1]=(u16)(union32.uint32val>>16);

STMFLASH_Write(FLASH_SAVE_ADDR,SaveBuff,sizeof(SaveBuff));

读操作

typedef uint16_t u16;
typedef int16_t s16;
typedef uint32_t u32;

float a;
u32 b;

/*读出float数据*/
a=*(float *)faddr;

/*读出u32数据*/
b=*(u32 *)faddr;

个人更倾向于union(联合体)方法,简便,不易写错。

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32中,可以使用Flash来保存数据Flash是一种非易失性存储器,可以在断电后保持数据。在STM32中,Flash被分为两个区域:Main Flash Memory和System Memory。Main Flash Memory用于存储程序代码和数据,而System Memory用于存储Bootloader和Option Bytes等系统信息。 要在STM32中使用Flash来保存数据,可以使用HAL库提供的函数。以下是一个简单的示例代码: ```c #define FLASH_USER_START_ADDR ADDR_FLASH_PAGE_62 /* Start @ of user Flash area */ #define FLASH_USER_END_ADDR ADDR_FLASH_PAGE_63 + FLASH_PAGE_SIZE - 1 /* End @ of user Flash area */ uint32_t Address = FLASH_USER_START_ADDR; HAL_StatusTypeDef FlashStatus = HAL_OK; /* Unlock the Flash to enable the flash control register access *************/ HAL_FLASH_Unlock(); /* Clear all FLASH flags */ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR); /* Erase the user Flash area */ FLASH_Erase_Sector(FLASH_SECTOR_62, VOLTAGE_RANGE_3); /* Program the user Flash area word by word */ while (Address < FLASH_USER_END_ADDR) { if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, Data) == HAL_OK) { Address = Address + 4; } else { /* Error occurred while writing data in Flash memory */ break; } } /* Lock the Flash to disable the flash control register access (recommended to protect the FLASH memory against possible unwanted operation) */ HAL_FLASH_Lock(); ``` 在上面的代码中,首先需要定义Flash的起始地址和结束地址。然后使用HAL_FLASH_Unlock()函数来解锁Flash,以便可以对其进行编程。接下来,使用FLASH_Erase_Sector()函数来擦除Flash的指定扇区。最后,使用HAL_FLASH_Program()函数来将数据写入Flash中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值