找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3322|回复: 0
收起左侧

STM32学习-Flash读写

[复制链接]
ID:81272 发表于 2015-5-27 16:24 | 显示全部楼层 |阅读模式
一直是使用野火的例程学习STM32,而他的书里面没有讲到STM32的Flash操作,所以一直以为STM32不能对Flash进行操作。后来想到连STC这等国产8位机都可以进行Flash操作,想必STM32也可以,所以对此进行了一番小研究。

其实STM32的库里面就有专门针对Flash的程序,还有一个专门的文档,且的中文版本,名字叫《PM0042 STM32F10xxx闪存编程》(见附件)。
手头开发板上芯片是STM32F103C8T6,片上Flash为64KB,按ST定义,属于中容量的,下表就是中容量内存组织。


文档中对写Flash有专门的描述,重要的知识点包括但不限于:
1)擦除操作只能是页擦除或全部擦除。
2)写操作只能是每次写入16-bit,即双字节。
3)在擦除之前,要先写两个键值KEY1(0x45670123)和KEY2(0xCDEF89AB)到FLASH_KEYR寄存器,以解除闪存锁。
我们的程序基本流程是,先读取Flash中一个固定地址的数据,然后通过串口打印,再修改此数据,修改后再读回来。
这是写Flash的程序:
void Writeflash(void)
{
        FLASH_Unlock();
        FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
            FLASHStatus = FLASH_ErasePage(StartAddress);

        if(FLASHStatus == FLASH_COMPLETE)
        {
                FLASHStatus = FLASH_ProgramWord(StartAddress, 0x12345678);
                USART1_printf(USART1, "\r\n");
        }
}

FLASH_Unlock()就是完成解除闪存锁的工作,以下是FLASH_Unlock()函数的实现。
void FLASH_Unlock(void)
{
  /* Authorize the FPEC of Bank1 Access */
  FLASH->KEYR = FLASH_KEY1;
  FLASH->KEYR = FLASH_KEY2;

  #ifdef STM32F10X_XL
  /* Authorize the FPEC of Bank2 Access */
  FLASH->KEYR2 = FLASH_KEY1;
  FLASH->KEYR2 = FLASH_KEY2;
  #endif /* STM32F10X_XL */
}
FLASH_ErasePage()函数就是完成擦除整页数据功能,FLASH_ProgramWord()是向Flash固定的地址写入一个32-bit数据。



程序进行相应修改可以做成通过USART对Flash操作,比如,通过串口发送数据,修改Flash中的数据。
对Flash的操作用处很多,比如在CAN网络中可以在Flash中预先设置CAN的地址,也可以通过can通信在线修改地址,再比如在温度测量控制系统中可以在Flash预置传感器的标定值等。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表