Flash地址空间的数据读取

一、Flash原理

不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了 1024K 字节。市面上 STM32F1 开发板使用的芯片是 STM32F103系列,其 FLASH 容量一般为 512K 字节,属于大容量芯片

Flash的编程原理都是只能将1写为0,而不能将0写为1,所以在进行Flash编程前,必须将对应的块擦除,即将该块的每一位都变为1,块内所有字节变为0xFF。

STM32F1 的闪存(Flash)模块:主存储器、信息块、闪存存储器接口寄存器

主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。

信息块。该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3, BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。

闪存存储器接口寄存器。该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。

在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。

下图是Flash的一些主要特性:
在这里插入图片描述

二、创建STMcube工程

1、选择芯片

芯片就选择我们所用的STM32F103C8:

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux内核中,可以使用`mtd`子系统提供的接口来读取Flash数据。`mtd`子系统是一个用于管理Flash设备的框架,它提供了一组接口用于访问和管理Flash设备。以下是一些常用的`mtd`子系统接口: - `mtd_read()`:从Flash设备中读取指定长度的数据。 - `mtd_write()`:向Flash设备中写入指定长度的数据。 - `mtd_erase()`:擦除Flash设备中指定范围的数据。 下面是一个使用`mtd_read()`函数读取Flash数据的示例: ```c #include <linux/mtd/mtd.h> int read_flash_data(struct mtd_info *mtd, size_t offset, void *buf, size_t len) { int ret; // 读取Flash数据 ret = mtd_read(mtd, offset, len, &ret, buf); if (ret < 0) { printk(KERN_ERR "Failed to read Flash data\n"); return ret; } return ret; } ``` 在上述示例中,`read_flash_data()`函数用于从指定的MTD设备中读取Flash数据。函数参数`mtd`是一个指向`struct mtd_info`类型的指针,表示要读取数据的MTD设备。参数`offset`表示读取数据的起始地址,参数`buf`表示存储读取数据的缓冲区,参数`len`表示要读取数据长度。 在函数内部,我们调用`mtd_read()`函数从MTD设备中读取Flash数据。如果读取失败,则返回错误码。 如果你想从用户空间读取Flash数据,可以使用`mmap()`函数将Flash设备映射到用户空间,然后通过内存访问来读取Flash数据。具体实现方法可以参考Linux内核中`mtd-utils`工具包中的源代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值