您的位置:首页 > 其它

stm32内部flash读写

2018-01-18 11:04 453 查看
在stm32中内部flash一般都比较大,光程序很难存满,那么后面的剩余地址就可以用来存储数据(少量数据)。
读写地址不能在程序存储之前,计算好程序大小计算存放地址。
flash.h
#ifndef _FLASH_H
#define _FLASH_H

#include"sys.h"

#define ADDR 0x8010000

//在指定地址写入数组
void FLASH_WriteByte(u32 addr , u8 *p , u16 Byte_Num);

//在指定地址读出数组
void FLASH_ReadByte(u32 addr , u8 *p , u16 Byte_Num);

#endif
flash.c#include "flash.h"

//在指定地址写入数组
void FLASH_WriteByte(u32 addr , u8 *p , u16 Byte_Num)
{

u16 HalfWord; //待写入的半字
Byte_Num = Byte_Num/2; //半字个数
FLASH_Unlock(); //解锁
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); //清除标志
FLASH_ErasePage(addr); //擦除一页 默认是1K
while(Byte_Num --)
{
HalfWord=*(p++);
HalfWord|=*(p++)<<8;
FLASH_ProgramHalfWord(addr, HalfWord); //写入半字
addr += 2;
}
FLASH_Lock(); //上锁

}

//在指定地址读出数组
void FLASH_ReadByte(u32 addr , u8 *p , u16 Byte_Num)
{
while(Byte_Num--)
{
*(p++)=*((uint8_t*)addr++);
}

}
main.cu8 buf_f[5]={0x05,0x02,0x03,0x04,0x05};
u8 buf_ff[5]={0x00,0x00,0x00,0x00,0x00};

int main(void)
{
delay_init(); //延时函数初始化

serial1_init(115200); //串口初始化
Adc_Init(); //adc初始化

IWDG_Init();

FLASH_ReadByte(ADDR,buf_ff,5);
printf("写入之前:%x\r\n",buf_ff[0]);

FLASH_WriteByte(ADDR,buf_f,2);

FLASH_ReadByte(ADDR,buf_ff,2);
printf("写入之后:%x\r\n",buf_ff[0]);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: