目录
一、知识简述
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卡读写
将64K数据分250次,每次256字节,写入SD卡,测试速度
总共用了14分钟,写了64K字节。
查看hello.txt
可以看到写入了250行数据,总计64K字节
从SD卡读出
利用FATS从SD卡读出数据,并且串口输出。
修改代码
将写入函数修改为读出函数名
定义读出函数,指针标志s,且定义字节类型格式br和一个存储读取的数组READBUFF。
① 修改f_open函数的第三个打开状态为FA_READ模式。②文件指针移至相应位置,否则无输出。③指针加地址④使用FATS的read函数,第一个参数是指针,第二个是存储数组,第三个是数组大小,第四个是强制转换br为UINT格式。⑤输出
输出结果
可以看到依次输出,用了a,b,c,d,e来区分不同。
三、写入flash
实验源码
链接:https://pan.baidu.com/s/1jJ6_YlAI9W81w7h6c7FVBw
提取码:qwer
cubeMX设置
配置定时器
使PC13GPIO模式,判断程序是否运行成功
使GPIO引脚使能
时钟配置
修改代码
修改数组大小
首先修改存储的Flash读取数组和写入数组分别为8位的8k个字节大小。
uint8_t FlashWBuff [8000];
uint8_t FlashRBuff [8000];
修改数据内容
将数组中写入要存储的数据为8K个字节。
将i变量改成uint16_t位
修改flash.h中的flash结束地址为 0X0801BA00
此地址是由0x0800c000+0xFA00(64K)=0X0801BA00
st-link设置
ST-LINK | STM32 |
---|---|
SWCLK/TCK | SWCLK/TCK |
SWDIO/TMS | SWDIO/TMS |
GND | GND |
VCC | VCC |
设置debug为st-link debugger
点进去后可以看到要检测出SWDIO有信息即可烧录
编译烧录
接着全速运行。
四、运行结果
PC13灯会亮起来
可以看到它写到了0x0800DF3F,此地址刚好是0X0800C000+0X1F40(8K)的数据。
修改起始地址重新烧录
修改起始地址为0X0800DF40
进行烧录结果
可以看到最后内存写到了0X0800FE7F
进行反复的更改初始地址,每次增加8K字节的地址,将四次8k一共32k数据写入flash。
结果如下图,可以看到每次的地址都是增加8K个字节的地址。
验证flash内存
可以看到flash地址重0X0800C00到0X08013CFF总共32k字节都写满了数据。
五、总结
通过对SD卡读写操作,对其有了进一步的了解,flash的断电后会保存其中内容,下一次可以继续写入。