STM32外设使用(九) Flash

注:该帖为自己在使用stm32时的问题总结贴,如有错误欢迎大家指正出来,一起交流学习

 

目录

目录

一、简介

二、在stm32中的结构

三、代码示例

四、碰到过的问题


一、简介

在STM32芯片内部有一个FLASH存储器,它主要用于存储代码,我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部FLASH中,由于FLASH存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部FLASH中加载代码并运行。

 

除了使用外部的工具(如下载器)读写内部FLASH外,STM32芯片在运行的时候,也能对自身的内部FLASH进行读写,因此,若内部FLASH存储了应用程序后还有剩余的空间,我们可以把它像外部SPI-FLASH那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。

由于访问内部FLASH的速度要比外部的SPI-FLASH快得多,所以在紧急状态下常常会使用内部FLASH存储关键记录;为了防止应用程序被抄袭,有的应用会禁止读写内部FLASH中的内容,或者在第一次运行时计算加密信息并记录到某些区域,然后删除自身的部分加密代码,这些应用都涉及到内部FLASH的操作。

二、在stm32中的结构

 

 

三、代码示例

 

void Write_Flash_HalfWord(u32 addr,u16 data)
{ 
  FLASH_Unlock();			       //每次擦除Flash中数据时得先解锁
  FLASH_ErasePage(USER_FLASH_BASE);      //擦除页
  FLASH_ProgramHalfWord(addr,data);//写16位半字
  FLASH_Lock();				       //上锁
}

// 将数组中的数据存取到FLASH中
void Write_Flash_Array(u32 addr, u16* buf, u8 len)
{
    
	u8 j=0;
	FLASH_Unlock();
	FLASH_ErasePage(USER_FLASH_BASE); 
	while(len--)
	{
		FLASH_ProgramHalfWord(addr,buf[j++]);
		addr+=2;
	}
	FLASH_Lock();
}

u16 Read_Flash_HalfWord(u32 addr)
{ 
    u16 data;
    data=(u16)(*(u32*)addr); //读取相应地址中的16位数据
    return data;
}

// 从FLASH地址中的数据读取到数组中
void Read_Flash_Array(u32 addr, u16 *buf, u8 len)
{
	u8 j=0;
	while(len--)
	{
		buf[j++]=(u16)(*(u32*)addr);
		addr+=2;
	}
}

int flash_test (void) 
{
    u8 i=0;
    u16 in_words[LEN]={0x0000, 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888, 0x9999};
    u16 out_words[LEN];
    Write_Flash_Array(USER_FLASH_BASE,in_words, LEN);
    while(1)
    {  
        Read_Flash_Array(USER_FLASH_BASE,out_words, LEN);
        for(i=0; i<LEN; i++)
        {
            Uart3_SendByte((u8)(out_words[i]>>8));
            Uart3_SendByte((u8)out_words[i]);
        }
    }
}

四、碰到过的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值