stm32内部flash读写

在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.c

u8 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]);





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值