目录
3.2.4 修改flash.h中的flash结束地址为 0X0801BA00
一、知识点
stm32内部框架图
stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同。
RAM起始地址是0x2000 0000,结束地址是0x2000 0000加上芯片的RAM大小。不同的芯片RAM也不同。
Flash中的内容一般用来存储代码和一些定义为const的数据,断电不丢失,
RAM可以理解为内存,用来存储代码运行时的数据,变量等等。掉电数据丢失。
STM32将外设等都映射为地址的形式,对地址的操作就是对外设的操作。
stm32的外设地址从0x4000 0000开始,可以看到在库文件中,是通过基于0x4000 0000地址的偏移量来操作寄存器以及外设的。
二、SD卡读写
2.1 要求
将64K数据分250次,每次256字节,写入SD卡,测试速度
具体操作可以查看上篇博客:用STM32F103 完成对SD卡的数据读取(FAT文件模式)_Laul Ken-Yi的博客-CSDN博客
2.2 实验过程截图
总共用了14分钟,写了64K字节。
2.3 查看hello.txt
可以看到写入了250行数据,总计64K字节
2.4 从SD卡读出
利用FATS从SD卡读出数据,并且串口输出。
2.4.1 修改代码
将写入函数修改为读出函数名
定义读出函数,指针标志s,且定义字节类型格式br和一个存储读取的数组READBUFF。
① 修改f_open函数的第三个打开状态为FA_READ模式。②文件指针移至相应位置,否则无输出。③指针加地址④使用FATS的read函数,第一个参数是指针,第二个是存储数组,第三个是数组大小,第四个是强制转换br为UINT格式。⑤输出
2.4.2 输出结果
可以看到依次输出,我用了a,b,c,d,e来区分不同。
三、写入flash
3.1 实验源码
链接:https://pan.baidu.com/s/1jJ6_YlAI9W81w7h6c7FVBw
提取码:qwer
cubeMX设置
3.1.1 配置定时器
3.1.2 使PC13GPIO模式,判断程序是否运行成功
3.1.3 使GPIO引脚使能
3.1.4 时钟配置
3.1.5 设置堆栈大小
3.2 修改代码
3.2.1 修改数组大小
首先修改存储的Flash读取数组和写入数组分别为8位的8k个字节大小。
uint8_t FlashWBuff [8000];
uint8_t FlashRBuff [8000];
3.2.2 修改数据内容
将数组中写入要存储的数据为8K个字节。
3.2.3 将i变量改成uint16_t位
3.2.4 修改flash.h中的flash结束地址为 0X0801BA00
此地址是由0x0800c000+0xFA00(64K)=0X0801BA00
3.3 st-link设置
对应口进行相连即可
ST-LINK | STM32 |
---|---|
SWCLK/TCK | SWCLK/TCK |
SWDIO/TMS | SWDIO/TMS |
GND | GND |
VCC | VCC |
设置debug为st-link debugger
点进去后可以看到要检测出SWDIO有信息即可烧录。
3.4 编译烧录
接着全速运行。
3.5 运行结果
PC13灯会亮起来
可以看到它写到了0x0800DF3F,此地址刚好是0X0800C000+0X1F40(8K)的数据。
3.6 修改起始地址重新烧录
修改起始地址为0X0800DF40
进行烧录结果
可以看到最后内存写到了0X0800FE7F
进行反复的更改初始地址,每次增加8K字节的地址,将四次8k一共32k数据写入flash。
结果如下图,可以看到每次的地址都是增加8K个字节的地址。
3.7 验证flash内存
可以看到flash地址重0X0800C00到0X08013CFF总共32k字节都写满了数据。
四、总结
通过对SD卡读写操作,更一步掌握了FATS文件的读取函数的理解,在读SD时一直深陷其中,在老师的点拔下总算是做出来了,对flash的理解,即断电则不会清除FLASH的内容,虽然FLASH是从0X08000000开始写入,这里我们采用从0X0800C000写入,可以看到是能写成功的,所以STM32在设计的时候是有隐藏的内存的。
参考文献:
STM32学习笔记:读写内部Flash(介绍+附代码) - 竹风清 - 博客园
STM32用cube配置FATFS模式下SPI读写SD卡_Drive World的博客-CSDN博客
STM32 进阶教程 13 – FLASH的读写操作_张十三的博客-CSDN博客_stm32f103c8t6flash读写