1.内部FLASH简介
之前的文章中介绍过STM32F1利用SPI与外部FLASH(W25QXX芯片)通讯的例程,本例程将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。
不同型号的STM32,其FLASH容量也有所不同,最小的只有16K字节,最大的则达到了1024K字节。此处我们使用的是STM32F103ZET6,其FLASH容量为512K字节,属于大容量产品,大容量产品的闪存模块组织图如下图示
STM32F1的闪存模块由:主存储器、信息块和闪存存储器接口寄存器3部分组成
*主存储器:用来存放代码和数据常量,起始地址是0x08000000,BOOT0和BOOT1都接GND时,就是从该起始地址运行代码的
*信息块:分为2个小部分,启动程序代码是用来存储ST自带的启动程序,用于串口下载代码,BOOT0接3.3V,BOOT1接GND时,运行的就是这部分代码;选择字节则一般用于配置写保护、读保护等功能
*闪存存储器接口寄存器:用于控制闪存读写等,是整个闪存模块的控制机构
对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理:编程与擦除的高电压由内部产生。在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行,即在进行写或擦除操作时,不能进行代码或数据的读取操作。
下面介绍闪存的读取、编程和擦除:
⏩ 闪存的读取
内置闪存模块可以在通用地址空间直接寻址,任何32位数据的读操作都能访问闪存模块的内容并得到相应的数据。
例如,要从地址addr,读取一个半字,可通过如下语句读取:
data = *(__IO uint16_t*)addr
将addr强制转换为vu16指针,然后取该指针所指向的地址的值,即得到了addr地址的值
⏩ 闪存的编程
STM32的闪存编程是由FPEC(闪存编程和擦除控制器)模块处理的,这个模块包含7个32位寄存器,它们分别是:
- FPEC键寄存器(FLASH_KEYR)
- 选择字节键寄存器(FLASH_OPTKEYR)
- 闪存控制寄存器(FLASH_CR)
- 闪存状态寄存器(FLASH_SR)
- 闪存地址寄存器(FLASH_AR)
- 选择字节寄存器(FLASH_OBR)
- 写保护寄存器(FLASH_WRPR)
其中FPEC键寄存器共有3中键值:
PDPRT=0x000000A5; KEY1=0x45670123; KEY2=0xCDEF89AB
STM32复位后,FPEC模块是被保护的,不能写入FLASH_CR寄存器;通过写入特定的序列到FLASH_KEYR寄存器可以打开FPEC模块(即写入KEY1和KEY2),只有在写保护被解除后,才能操作相关寄存器。
闪存编程过程如下图所示:
⏩ 闪存的擦除
闪存编程的时候,要先判断其写入地址的FLASH是被擦除了的(也就是其值必须是0xFFFF),否则无法写入。闪存擦除分为页擦除和整片擦除。
闪存页擦除过程如下图示:
官方固件HAL库FLASH操作的几个常见函数:
2.硬件设计
D1指示灯用来提示系统运行状态,K_UP按键用来控制FLASH的数据写入,K_DOWN按键用来控制FLASH的数据读取,数据的写入与读取信息通过串口1打印出来
*指示灯D1
*USART1串口
*STM32F1内部FLASH
*K_UP和K_DOWN按键
3.软件设计
3.1 STM32CubeMX设置
➡️ RCC设置外接HSE,时钟设置为72M
➡️ PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
➡️ USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位
➡️ PA0设置为GPIO输入模式、下拉模式;PE3设置为GPIO输入模式、上拉模式
➡️输入工程名,选择路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码
3.2 MDK-ARM软件编程
➡️ 创建按键驱动文件key.c 和相关头文件key.h,驱动代码参考按键输入例程
➡️ 创建FLASH驱动文件stmflash.c 和相关头文件stmflash.h,这里仅介绍几个重要的函数,工程源文件下载方式见文末介绍
//读取指定地址的半字
uint16_t STMFLASH_ReadHalfWord(uint32_t faddr){
return *(__IO uint16_t*)faddr;
}
//不检查的写入
void STMFLASH_Write_NoCheck(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite){
uint16_t i;
for(i=0;i WriteAddr+=2;//一个地址对应8bits,写入半字,所以地址加2 } } //FLASH写函数比较复杂,详细代码请下载源文件查阅 void STMFLASH_Write(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite) void STMFLASH_Read(uint32_t ReadAddr,uint16_t *pBuffer,uint16_t NumToRead){ uint16_t i; for(i=0;i ReadAddr+=2;//偏移2个字节 } } ➡️ 在main.c文件下编写STM32 flash测试代码 /* USER CODE BEGIN PV */ const uint8_t Text_Buf[] = {"STM32F103ZET6 FLASH TEST"}; #define TEXTSIZE sizeof(Text_Buf) //设置FLASH保存地址(要大于FLASH起始地址) #define FLASH_SAVE_ADDR 0x08070000 /* USER CODE END PV */ int main(void){ /* USER CODE BEGIN 1 */ uint8_t key; uint8_t Read_Buf[TEXTSIZE]; /* USER CODE END 1 */ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ printf("STM32 Flash Test...rn"); /* USER CODE END 2 */ while (1){ key = KEY_Scan(0); if(key == KEY_UP_PRES){ STMFLASH_Write(FLASH_SAVE_ADDR,(uint16_t *)Text_Buf,TEXTSIZE); printf("FLASH Write : %srn",Text_Buf); } if(key == KEY_DOWN_PRES){ STMFLASH_Read(FLASH_SAVE_ADDR,(uint16_t *)Read_Buf,TEXTSIZE); printf("FLASH Read : %srn",Read_Buf); } HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); HAL_Delay(200); } } 4.下载验证 编译无误下载到开发板后,可以看到D1指示灯不断闪烁,当按下K_UP按键后数据写入到FLASH内,当按下K_DOWN按键后将写入的数据读取出来,同时串口打印出相应信息
上一篇:STM32内部Flash读写操作接口
下一篇:STM32对内部Flash的保护措施
推荐阅读
史海拾趣
GSI Technology公司成立于1995年3月,总部位于加利福尼亚州的圣何塞(硅谷),自创立之初便专注于提供领先的电信和网络解决方案。公司采用先进的CMOS工艺技术,如0.25、0.15和0.13微米等,致力于开发低功耗、全功能、高性能的SRAM产品。通过不断的技术创新和产品优化,GSI Technology逐渐在高性能存储器市场占据了一席之地,为后续的快速发展奠定了坚实的基础。
为了保持技术的领先地位,AMP高度重视研发团队的建设和人才培养。公司投入大量资源用于引进和培养高端人才,为研发团队提供了一流的工作环境和研发设备。这些人才为AMP的技术创新和产品升级提供了强有力的支持。
Apex Microtechnology凭借其卓越的产品质量和服务水平,赢得了客户的广泛认可。其中,公司连续两年获得雷神公司的5星供应商卓越奖,这一奖项是雷神公司综合防御系统业务部对供应商在质量和性能方面的最高认可。Apex Microtechnology的获奖不仅体现了其在电子行业中的领先地位,也为其未来的发展奠定了坚实的基础。
这些故事展示了Apex Microtechnology在电子行业中的发展历程和成就,体现了其在功率模拟技术领域的专业实力和不断创新的精神。作为电子行业的佼佼者,Apex Microtechnology将继续致力于为客户提供更优质的产品和服务,推动电子行业的持续发展。
在竞争激烈的电子组装市场中,一家名为“精准电子组装”的公司凭借其精准的市场定位脱颖而出。公司深入研究行业趋势和客户需求,准确把握市场脉搏,专注于为高端客户提供定制化的电子组装服务。通过不断挖掘客户需求、提升服务水平,精准电子组装在高端市场上占据了一席之地,实现了快速发展。
20世纪50年代初,BALLUFF公司与德国Heller机床制造公司建立了合作关系。根据Heller公司的要求,BALLUFF制造了新型机床电控装置所需的凸轮开关。这一合作的成功不仅让BALLUFF获得了Heller公司的信任,更让其在机床制造领域获得了重要突破。随后,Heller公司进一步委托BALLUFF开发相关产品,这使得BALLUFF在电子机械式极限开关领域取得了重要进展,为其日后的传感器业务发展开辟了新道路。
随着市场的不断发展和竞争的加剧,Component General Inc公司意识到只有不断创新才能在行业中立足。因此,公司加大了对研发的投入,积极引进先进的技术和设备。经过多年的努力,公司成功地推出了一系列具有创新性的产品,如衰减器、同轴端子等,这些产品不仅提高了公司的市场竞争力,也为客户提供了更优质的解决方案。
摘要:文章介绍了一种基于TI公司的TMS320VC5402来构造指纹识别系统的方法。详细论述了系统的各个组成部分以及指纹识别算法的实现流程,结合VC5402的指令集和自身结构特点,讨论了如何高效的设计应用程序的方法。文章对如何将DSP的主机接口(HPI)改 ...… 查看全部问答∨ |
|
记得很早以前看过一个概念产品-翻译笔,用一支笔沿着文字滑动,可以将这些文字翻译成另一种语言。当年的概念产品已经成为现实,已经有公司在销售了。如果有人想做类似的产品,这个五线谱识别装置应该是很好的预研试验。因为相对于文字来讲,五线 ...… 查看全部问答∨ |
|
今天终于收到了之前提到的测风仪,东西很精致。 要感谢向农姐,还有dallas的工程师!谢谢你们给我这个认识新设备的机会! 先来个照片给大家看看 [ 本帖最后由 sjl2001 于 2009-12-21 10:08 编辑 ]… 查看全部问答∨ |
|
说到 Free Software 的 OS,当属 Linux,BSD 相对来讲是冷门多了.但BSD的风评可不会比Linux 差呀?那么是什么原因造成 Linux 比 BSD 更受欢迎呢? Linux 是出现约在 BSD 官司缠身、以及 Internet 开始风行之际.Linux 的开发者及爱好者正好能透过 Inter ...… 查看全部问答∨ |
|
请教大家一个问题 关于UC/OS-II 的比如 我的一个任务 TASKA 它需要每次进来的时候 计数一次 当计数到达1分钟的时候 需要置位标识位Flag1s=1我把这个意思用下边的简单程序表示 void TaskA (void *pData){   ...… 查看全部问答∨ |