不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了 1024K 字节。市面上 STM32F1 开发板使用的芯片是 STM32F103系列,其 FLASH 容量一般为 512K 字节,属于大容量芯片。
Flash的编程原理都是只能将1写为0,而不能将0写为1,所以在进行Flash编程前,必须将对应的块擦除,即将该块的每一位都变为1,块内所有字节变为0xFF。
STM32F1 的闪存(Flash)模块:主存储器、信息块、闪存存储器接口寄存器:
①主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。
②信息块。该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3, BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。
③闪存存储器接口寄存器。该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。
在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。
我们这里使用的ST-Link,所以需要下载一个ST-Link的一个驱动:
链接:https://pan.baidu.com/s/1Aschd6EiG95Igb_06JiRxQ
提取码:wpj0
flash工程下载链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn
下载好之后我们先进入将路径stm32_Flash\Drivers\CMSIS\Device\ST\STM32F1xx\Include下的system_stm32f1xx_20190722_092746.h文件修改为system_stm32f1xx.h,否则后面编译会报错
修改好后,使用keil打开工程,可以将想要存入Flash中的内容修改为自定义内容:“Hello tiechangfeng631907030422”
然后直接编译:
没有出现错误:
这里我们使用的时ST-Link,所以进行配置:
点击Options->Debug->右边使用硬件ST-Link Debugger:
接着点击S T-Link Debugger右边的Settings
进入到Cortex-M Target Driver Setup的Debug页面,其中的Port选择为SW
依次点击Flash Download->勾选Reset and Run->Add->选择STM32F10x Med-density Flash->Add->确定即可
最后点击OK完成硬件配置
连线如下:
点击左上角的LOAD按钮将程序下载到STM32中
现在就下载完成了
现在点击dubug按钮,进入硬件仿真调试
点击View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800C000,观察将要修改的flash区间区容:
其中点击某一字符右击可选择显示格式
继续View->Watch windows->Watch 1打开一个变量观察窗口:
将变量FlashWBuff 和FlashRBuff加入到Watch 1观察窗口:
另外View->勾选Periodic Windows Update,开启变量自动更新:
接下来点击全速运行或者F5:
同时在Memory 1窗口中可以看到在FLASH地址0x0800C000区成功写入对应内容:
断电后再重新上电进行调试,程序停在main入口处时还可以看到Flash对应区间的内容保持上一次写入内容值:
好了,到这里我们已经了解到了Flash空间里面的东西是不会断点消失的。
DAC为数字/模拟转换模块,顾名思义,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与ADC相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后,再由DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。
STM32具有片上DAC外设,它的分辨率可配置为8位或12位的数字输入信号,具有两个DAC输出通道,这两个通道互不影响,每个通道都可以使用DMA功能,都具有出错检测能力,可外部触发。
整个DAC模块围绕框图下方的 “数字至模拟转换器x” 展开,它的左边分别是参考电源的引脚:VDDA、VSSA及Vref+,其中STM32的DAC规定了它的参考电压Vref+输入范围 为2.4~3.3V。“数字至模拟转换器x” 的输入为 DAC 的数据寄存器 “DORx” 的数字编码,经过它转换得的模拟信号由图中右侧的 “DAC_OUTx” 输出。而数据寄存器 “DORx” 又受“控制逻辑”支配,它可以控制数据寄存器加入一些伪噪声信号或配置产生三角波信号。
图中的左上角为DAC的触发源,DAC根据触发源的信号来进行DAC转换,其作用就相当于DAC转换器的开关,它可以配置的触发源为外部中断源触发、定时器触发或软件控制触发。
STM32的DAC外设有固定的输出通道,分别为PA4和PA5,因此实验时直接使用示波器测量PA4和PA5引脚的输出即可。
软件地址:
链接:https://pan.baidu.com/s/1_AH-glnbeY2nRd-n1gKJxw
提取码:wpj0
使用Adobe Audition输出一个周期2khz的正弦波:
选择文件->新建->音频文件
设置好文件名、采样率为2000Hz,选择声道为单声道,位深度为16:
选择效果->生成基本音色:
将生成基本音色界面进行如下修改,点击确定即可:
点击文件->导出->文件,将其导出为wav文件:
打开软件 WavToC,它可以将一个将WAV文件转化成C语言代码的文件:
链接:https://pan.baidu.com/s/17bf77C6-6I71BHqfMvNXjQ
提取码:wpj0
打开WavToC之后:
点击右下角的打开文件:
打开之前生成的wav文件
带点击生成代码:
另外还可以点击试听,试听一下是不是正确的声音,比如这里的正弦波会发出嘟——的声音
最后点击保存代码即可
可以看到会在保存路径下生成一个.h文件,里面有音频文件生成的数据:
接着打开野火的工程:
链接:https://pan.baidu.com/s/1hlmYsVXr507QVK6EK2q74Q
提取码:wpj0
打开bsp_dac.c文件,将正弦波数据换成音频文件生成的数据,这里可以适当删减一部分,修改为POINT_NUM适合的大小:
修改之后如图:
修改好后进行编译,烧录进硬件中就可以使用示波器观察输出波形了。
①选择文件->打开,找到对应的音乐文件
②选中一段,然后右键,选择存储选区为…
③接着点击更改转换采样类型最后点击确定生成.wav文件
2、打开软件 WavToC,将.wav文件转化成C语言代码的文件
具体步骤跟上例一样,这里不多做阐述
打开.wav文件,点击生成代码便可转换输出数据,保存代码即可
然后就可以使用生成的数据和工程进行波形验证了
做到这里就可以了,只是因为没有示波器。
这次的实验老师给了许多的参考博客,我们只是按部就班的跟着做就好了,其实没有遇到什么问题,唯一一个还是在写入Flash的时候缺少了一个文件,导致了一直报错,后来解决之后就一路顺风顺水的跟着走了,当然也了解到了一些东西,反正还是有所收获吧。
https://blog.csdn.net/qq_54496810/article/details/122239610?spm=1001.2014.3001.5501
https://blog.csdn.net/qq_54496810/article/details/122111191?spm=1001.2014.3001.5501