一、什么是Flash?
Flash 是存储芯片的一种,通过特定的程序可以修改里面的数据。Flash 存储器又称闪存,它结合了ROM 和RAM 的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据(NVRAM 的优势), U 盘和MP3里用的就是这种存储器。在过去的20年里,嵌入式系统一直使用ROM(EPROM)作为它们的存储设备,然而近年来Flash 全面代替了ROM(EPROM)在嵌入式系统中的地位,用作存储Bootloader 以及操作系统或者程序代码或者直接当硬盘使用(U 盘)。
Flash的编程原理都是将1写为0,但不能将0写为1,所以在进行Flash编程前,必须将对应的块擦除,即将该块的每一位都变为1,块内所有字节变为0xFF。
STM32的闪存(Flash)模块主要包括:主存储器、信息块和闪存存储器接口寄存器。
①主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K字节。注意,小容量和中容量产品则每页只有 1K 字节。
②信息块。该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3,BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。
③闪存存储器接口寄存器。该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。
二、怎么进行Flash的读取?
Flash地址空间的数据读取。stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的正确性和读写速率。
三、Flash实验
本次实验主要是要通过读取片内Flash的提示音播放波形声音。
1.创建CUBEMX工程
配置定时器 打开外部时钟 配置时钟 将PC13设置为output 设置堆栈大小为4k,生成文件
2.在keil5中打开文件
将flash.c和flash.h添加到工程中 添加flash.c的时候选第二行 在main.c中分别添加如下代码(定义一下)
uint8_t FlashWBuff [255]; uint8_t FlashRBuff [255]; uint8_t i; uint8_t FlashTest[] = “Hello This is Flash Test DEMO”;
将将程序下载到STM32里。 点击进入Debug模式。 点击View->memory windows,选择 memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容 点击View->Watch windows,选择Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口 全速运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样,而定义好的句子写到了地址0x0800c000中了。
二、基于片内Flash的提示音播放程序
1.生成正弦波
可以用专业的音频处理软件AU等做,我这里为了方便直接用格式工厂转化一下。并输出 用UltraEdit打开刚才保存的wav文件
2.将DAC导入程序
打开下载好的DAC输出正弦波的程序,在bsp_dac.c中用上述内容替换框选内容,就可以输出不同的波形。 随后将程序下载到STM32里。 接入同学的喇叭后,正弦波会发出嘟嘟嘟的声音。表明实验还算成功了。 由于没有示波器,最后波形不予展示。
参考资料
https://blog.csdn.net/qq_46467126/article/details/122098829?spm=1001.2014.3001.5501
|