LV02-02-STM32内部FLASH读写
摘要:
这篇笔记主要是 STM32 的内部FLASH读写相关笔记。若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用平台
Windows | windows11 |
Keil uVision5 | uVision V5.29.0.0 |
JLINK驱动 | Windows版本 V688 |
正点原子战舰V3开发板 | STM32F103ZET6 |
点击查看本文更新记录
创建笔记。
点击查看本文参考资料
参考方向 | 参考原文 |
ST官方文档 | Reference manual |
ST官方文档 | STM32F10xxx Flash memory microcontrollers |
正点原子STM32开发指南 | STM32F1开发指南-库函数版本_V3.3 |
野火STM32开发指南 | STM32库开发实战指南——基于野火霸道开发板 文档 (embedfire.com) |
上一篇笔记已经了解了STM32的内部FLASH,这一部分就是对FLASH的读写实现。其实主要是几个函数的实现说明,对于FLASH的操作,需要注意的是每次写入或者读取都是半字,在32位机器下,就是2字节。
一、相关宏定义
1.自定义宏
1 |
|
- STM32_FLASH_SIZE:表示所选的STM32的FLASH容量的大小,我们选用的是STM32F103ZET6,所以这里定义成512KB。
- STM32_FLASH_SIZE :FLASH 页的大小,FLASH小于256KB的,每一页是1KB,大于或者等于256KB的FLASH每一页是2KB。
- STMFLASH_BUF :FLASH 中数据缓存区,这个数组是u16类型,也就是unsigned short int类型的,每个元素是2个字节,所以只需要1024个元素就可以存储2048个字节的数据,所以后边的元素个数需要除以2。这个数组有两个用处,一是存放读取的整个扇区的数据,而是缓存我们要写入的数据,其实它的存在也保护了部分数据,因为我们擦除FLASH的时候会擦除整个页,所以即便我们写入的数据不会占满整页,但是这一整页还是会被擦除,提前读取整页数据其实也保护了部分数据。
二、函数实现
1.读半字
1 | u16 STMFLASH_ReadHalfWord(u32 faddr) |
【函数说明】该函数用于从指定地址读取半字数据(32位机器下半字为16位,也就是2个字节)。
【函数参数】
- faddr: u32类型,就是uint32_t类型,再继续追踪会发现其实就是 unsigned int 类型,表示要读取的FLASH地址。
【返回值】u16类型,就是uint16_t类型,继续追踪的话就是unsigned short int类型,表示读取到的数据。
【使用格式】none
【注意】none
2.读指定长度
1 | void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead) |
【函数说明】该函数用于从指定地址读取指定长度的数据到指定的空间,该函数内部调用库函数中的 STMFLASH_ReadHalfWord() 函数完成一次读取,每次读取16位数据,也就是2个字节。
【函数参数】
- ReadAddr: u32类型,其实就是 unsigned int 类型,表示要读取的FLASH地址。
- pBuffer :u16类型,其实就是 unsigned short int 类型,它是一个指针变量,指向读出数据将要存放空间的首地址。
- NumToRead :u16类型,其实就是 unsigned short int 类型,表示我们要读取的多少数据,每次读取2字节,一共将会读取 2倍的NumToRead 个字节数据。也就是说,这个参数乘以2就可以得到我们读取的总的字节数啦。
【返回值】none
【使用格式】none
【注意】每次读取都是读2个字节,地址也要注意递增2字节。
3.不检查写入
1 | void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite) |
【函数说明】该函数用于向指定地址写入指定长度的数据,该函数内部调用库函数中的 FLASH_ProgramHalfWord() 函数完成一次写入,每次写入16位数据(半字),也就是2个字节,但是该函数不会检查要写入的区域数据是否是已经擦除过的,一般用于写入整个扇区数据。
【函数参数】
- ReadAddr: u32类型,其实就是 unsigned int 类型,表示要写入的FLASH地址。
- pBuffer :u16类型,其实就是 unsigned short int 类型,它是一个指针变量,指向写入数据现在存放空间的首地址。
- NumToWrite :u16类型,其实就是 unsigned short int 类型,表示我们要写入多少数据,每次写入2字节,一共将会写入 2倍的NumToWrite 个字节数据。也就是说,这个参数乘以2就可以得到我们写入的总的字节数啦。
【返回值】none
【使用格式】none
【注意】每次写入都是写2个字节,地址也要注意递增2字节。
4.写入指定长度
1 | void STMFLASH_Write(u32 WriteAddr, u16 *pBuffer, u16 NumToWrite) |
【函数说明】该函数用于向指定地址写入指定长度的数据,函数内部进行了是否需要擦除的判断以及是否需要跨页的判断。
【函数参数】
- ReadAddr: u32类型,其实就是 unsigned int 类型,表示要写入的FLASH地址。
- pBuffer :u16类型,其实就是 unsigned short int 类型,它是一个指针变量,指向写入数据现在存放空间的首地址。
- NumToWrite :u16类型,其实就是 unsigned short int 类型,表示我们要写入多少数据,每次写入2字节,一共将会写入 2倍的NumToWrite 个字节数据。也就是说,这个参数乘以2就可以得到我们写入的总的字节数啦。
【返回值】none
【使用格式】none
【注意】none
三、读写测试
1.相关定义
1 | //要写入到STM32 FLASH的字符串数组 |
2.主函数
这里只写了重要相关语句:
1 |
|