提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
任务要求
Flash读取
Flash地址空间的数据读取。stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始)①运行一次写入8KB数据,总计复位运行代码8次,将64KB数据写入Flash,并验证写入数据的正确性和读写速率。②此外,继续往后续地址写入数据,检验stm32f103c8t6 实际FlashROM是否超过64KB。
SD卡的数据读取
掌握SD卡协议原理,用STM32F103完成对SD卡的数据读取(fat文件模式)。
一、Flash读取
1.1 Flash简介
FLASH是一种EEPROM(电可擦除可编程只读存储器)的类型,具备带电可擦除可编程的特性。本文主要讨论的是STM32微控制器内部的Flash存储器,它主要用于存储用户程序代码和必要的配置信息。
常见应用:
SD卡
固态硬盘
芯片内存存储单元
存储代码等
特性:
- 非易失性:即使在断电的情况下,数据也能被保留,适合存储程序代码和关键配置信息。
- 快速访问:FLASH具有较快的读取速度,便于快速访问数据。
- 较长寿命:一般的FLASH可以承受约十万次的擦除和写入操作。
- 先擦再写:FLASH的写操作只能将数据位从1变为0,若要将数据位从0变为1,则必须先擦除该位所在的扇区或区块,然后才能重新写入。擦除操作会将对应扇区、区块或全部区块的数据位全部设置为1。
FLASH中的块、扇区、页:
类似于我们在“我的电脑”中看到的硬盘分区,分区的目的是为了方便文件管理。扇区、块等术语起源于硬盘等存储设备,它们将存储器划分为多个区域,以便于编程和管理。
- 页(Page):FLASH存储器中的一种区域划分单元,可以类比为书中的一页,每页包含一定数量的数据。
- 扇区(Sector):也是FLASH存储器中的一种区域划分单元,扇区更为常见,大多数FLASH存储器以扇区作为最小的操作单元。
- 块(Block):比扇区更高一级的划分单元,一个块包含多个扇区。
不同厂商和不同类型的存储器对页、扇区、块的划分方式各不相同,有的扇区可能被划分为1KB,而有的可能为2KB、4KB、8KB等。
芯片手册一般会直接说明其 FLASH 的大小,当然你也可以通过其他方式获取 FLASH 容量的信息:
芯片手册会告诉你芯片的命名规则以及含义,其中可能会有 FLASH 容量的说明,如 STM32F103C8T6 中的 8 指的是 64K 字节的 FLASH ,那么 STM32F103C6xx 则指的是 32K 字节的 FLASH。
1.2 keil中查看
打开 KEIL,打开一个 STM32 项目,可通过魔术棒查看到当前项目使用芯片中主存储器的起始地址以及大小。
如图,可看出我选择 STM32F103C8T6 中主存储器的起始地址为 0x8000000;大小为 0x10000,0x10000 为十六进制,换算成十进制就是 65536 字节,也就是 64K,说明 STM32F103C8T6 的 FLASH 大小为 64K。
可以在此处修改你 FLASH 主存储器的容量了,比如将 0x10000 修改为 0x8000,这样就表示 KEIL 烧录代码时,将不会擦除 0x8000 以后的空间,数据也会得以保存。
也可以修改起始地址为 0x80008000,这样KEIL 烧录代码时,将不会擦除 0x8000 之前的空间。
1.3 HAL工程创建与配置
创建文件
使用STM32CubeMx创建新工程,点击左上角的File文件选择“New Project”
在弹出的界面中,下拉列表输入芯片名称“STM32F103C8T6”,右下角选中后,点击“Start Project”
配置“RCC”
RCC中, HSE选中"Crystal/Ceramic Resonator"项,LSE选择Disable(默认),界面如下:
配置“SYS”
下拉Debug模式 ,选中"Serial Wire"Timebase Source选择“SysTick”,界面如下:
时钟配置
点击Clock Configuration 选择HSE和PLLCLK
我们的开发板配备了一个8MHz的外部晶振,我们将其频率值设定为8。在时钟源选择上,我们选择了LSE作为通道。对于PLLM,我们选择了不进行分频,即设置为/1。在倍频系数N的设置上,我们选择了9倍,以使系统时钟频率达到72MHz,这是通过PLLCLK实现的。系统时钟最终被设定为72MHz。对于APB1,我们选择了分频系数为/2,因此PCLK1的频率为36MHz;而对于APB2,我们选择了不分频,即分频系数为/1,使得PCLK2的频率保持在72MHz。如下图修改:
Project Manager设置
注意文件名不能含有中文
这里栈堆大小设置为2k或者4k
1.4 keil完善代码
工程源码链接
链接:https://pan.baidu.com/share/init?surl=1Tn8TocHT8qithneDyKFIQ
提取码:pmvn
将上述工程里的的flash.c 及flash.h加入到本次工程中(其他的不用管,会报错)
注意如何添加工程文件,方法如下(图是博主之前博客的,添加flash是同样的,仅文件名不同):
在Keil项目中添加文件:
注意Add完成后,一点要点OK,不然和博主一样又要重新添加。
文件添加完成后,还要进行路径添加。
路径添加方法如下:
完善main主函数:
这里是要写入的数据:
其中FlashWriteBuff和FlashReadBuff函数是对flash进行写入和读取操作。
完整函数(在flash.c里面)
完整的主函数代码:
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private includes ---------