一、读取Flash
1.1 Flash简介
- Flash全名叫做
Flash Memory
,它在嵌入式系统中的功能可以和硬盘在PC中
的功能相比。它们都是用来存储程序和数据
的,而且可以在掉电的情况下继续保存数据使其不会丢失
。 - Flash memory(闪速存储器)作为一种安全、快速的存储体,具有
体积小,容量大,成本低,掉电数据不丢失
等一系列优点,已成为嵌入式系统中数据和程序最主要的载体。 - STM32F103的中容量内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域,它们的地址分布及大小如下:
- 主存储器:一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、 2M FLASH 都是指这个区域的大小。与其它 FLASH 一样,在写入数据前,要先按扇区擦除.
- 系统存储区:系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、 USB 以及 CAN 等 ISP
烧录功能。- OTP 区域:OTP(One Time Program),指的是只能写入一次的存储区域,容量为 512 字节,写入后数据就无法再更改, OTP 常用于存储应用程序的加密密钥。
- 选项字节:选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能,这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改
- 对内部Flash的写入过程:
解锁 (固定的KEY值)
(1) 往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY1 = 0x45670123
(2) 再往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY2 = 0xCDEF89AB数据操作位数
最大操作位数会影响擦除和写入的速度,其中 64 位宽度的操作除了配置寄存器位外,还需要在 Vpp 引脚外加一个 8-9V 的电压源,且其供电间不得超过一小时,否则 FLASH可能损坏,所以 64 位宽度的操作一般是在量产时对 FLASH 写入应用程序时才使用,大部分应用场合都是用 32 位的宽度。擦除扇区
在写入新的数据前,需要先擦除存储区域, STM32 提供了扇区擦除指令和整个FLASH 擦除(批量擦除)的指令,批量擦除指令仅针对主存储区。
扇区擦除的过程如下:
(1) 检查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以确认当前未执行任何
Flash 操作;
(2) 在 FLASH_CR 寄存器中,将“激活扇区擦除寄存器位 SER ”置 1,并设置“扇
区编号寄存器位 SNB”,选择要擦除的扇区;
(3) 将 FLASH_CR 寄存器中的“开始擦除寄存器位 STRT ”置 1,开始擦除;
(4) 等待 BSY 位被清零时,表示擦除完成。写入数据
擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还还需要配置一系列的寄存器,步骤如下:
(1) 检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何其它的内部 Flash 操作;
(2) 将 FLASH_CR 寄存器中的 “激活编程寄存器位 PG” 置 1;
(3) 针对所需存储器地址(主存储器块或 OTP 区域内)执行数据写入操作;
(4) 等待 BSY 位被清零时,表示写入完成。
1.2 工程实例
- 配置时钟
- 其余配置与之前cubeMX配置差不多
- 注意一定要更改一下堆栈大小
- 打开工程
工程源码链接
链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn - 添加代码
- 主函数如下:
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t i;
uint8_t FlashTest[] = "Hello this is isyuuun!";
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
FlashWriteBuff( DEVICE_INFO_ADDRESS, FlashTest,sizeof(FlashTest) ); // 写入数据到Flash
for(i=0;i<255;i++)
FlashWBuff[i] = i;
FlashWriteBuff( DEVICE_INFO_ADDRESS + sizeof(FlashTest), FlashWBuff,255 ); // 写入数据到Flash
FlashReadBuff( DEVICE_INFO_ADDRESS + sizeof(FlashTest),FlashRBuff,255 ); // 从Flash中读取数
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
- 硬件调试
ST-LINK | STM32 |
---|---|
SWCLK/TCK | SWCLK/TCK |
SWDIO/TMS | SWDIO/TMS |
GND | GND |
VCC | VCC |
ST-link驱动安装连接:https://pan.baidu.com/s/1cmreV0
检测驱动
,在设备管理器中查看
- 在Keil MDK中配置STlink
- 软件调试
添加两个定义的缓存区,uint8_t FlashWBuff [255];
uint8_t FlashRBuff [255];
全速运行后结果如下:
二、DAC播放音频
2.1 DAC简介
- Digital-to-Analog Converter的缩写,
数模转换器
。又称D/A转换器,简称DAC,是指将离散的数字信号
转换为连续变量的模拟信号
的器件。
大容量的STM32F103具有内部DAC模块,典型的数字模拟转换器将表示一定比例电压值的数字信号转换为模拟信号。
2.2 DAC工程实例(截取音频)
基于片内Flash的提示音播放程序。
1)实验数据准备:用Adobe audition或goldwave等音频编辑软件录制“您好欢迎光临!”的几秒钟的声音(8khz采样、8bit量化编码的单声道wav格式),确保音频数据尽量小(最大不超64KB)。然后编程将其分批次写入stm32f103c8t6芯片内部flash区域。
2)数字音频还原播放任务:编程读取此段音频,分别通过stm32f103c8t6自带的DAC通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果;
源码工程:https://pan.baidu.com/s/1gEATonRXK7km3yf-Mu0eEQ
提取码:1234
- 音频准备
生成后,使用WavToC软件打开,将wav转为c
保存代码后,我们打开复制其值
打开工程文件,更改代码
将刚刚复制的值放在Sine12bit数组中,更改数组大小。
- 写入芯片,即可通过DAC通道观察波形
2.3 DAC工程实例(录音频)
录音频与截取音频差不多的过程,只是使用Au软件开始方面不同。
三、总结
STM32自带的功能就有很多,本例中flash和DAC模块等,要学习的路还很长。
参考文章:
https://blog.csdn.net/weixin_42653531/article/details/90745042
https://blog.csdn.net/zhanglifu3601881/article/details/96632971
https://blog.csdn.net/as480133937/article/details/102309242
版权声明:本文为CSDN博主「isyuuun」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/isyuuun/article/details/122265862
一、读取Flash
1.1 Flash简介
- Flash全名叫做
Flash Memory
,它在嵌入式系统中的功能可以和硬盘在PC中
的功能相比。它们都是用来存储程序和数据
的,而且可以在掉电的情况下继续保存数据使其不会丢失
。 - Flash memory(闪速存储器)作为一种安全、快速的存储体,具有
体积小,容量大,成本低,掉电数据不丢失
等一系列优点,已成为嵌入式系统中数据和程序最主要的载体。 - STM32F103的中容量内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域,它们的地址分布及大小如下:
- 主存储器:一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、 2M FLASH 都是指这个区域的大小。与其它 FLASH 一样,在写入数据前,要先按扇区擦除.
- 系统存储区:系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、 USB 以及 CAN 等 ISP
烧录功能。- OTP 区域:OTP(One Time Program),指的是只能写入一次的存储区域,容量为 512 字节,写入后数据就无法再更改, OTP 常用于存储应用程序的加密密钥。
- 选项字节:选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能,这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改
- 对内部Flash的写入过程:
解锁 (固定的KEY值)
(1) 往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY1 = 0x45670123
(2) 再往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY2 = 0xCDEF89AB数据操作位数
最大操作位数会影响擦除和写入的速度,其中 64 位宽度的操作除了配置寄存器位外,还需要在 Vpp 引脚外加一个 8-9V 的电压源,且其供电间不得超过一小时,否则 FLASH可能损坏,所以 64 位宽度的操作一般是在量产时对 FLASH 写入应用程序时才使用,大部分应用场合都是用 32 位的宽度。擦除扇区
在写入新的数据前,需要先擦除存储区域, STM32 提供了扇区擦除指令和整个FLASH 擦除(批量擦除)的指令,批量擦除指令仅针对主存储区。
扇区擦除的过程如下:
(1) 检查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以确认当前未执行任何
Flash 操作;
(2) 在 FLASH_CR 寄存器中,将“激活扇区擦除寄存器位 SER ”置 1,并设置“扇
区编号寄存器位 SNB”,选择要擦除的扇区;
(3) 将 FLASH_CR 寄存器中的“开始擦除寄存器位 STRT ”置 1,开始擦除;
(4) 等待 BSY 位被清零时,表示擦除完成。写入数据
擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还还需要配置一系列的寄存器,步骤如下:
(1) 检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何其它的内部 Flash 操作;
(2) 将 FLASH_CR 寄存器中的 “激活编程寄存器位 PG” 置 1;
(3) 针对所需存储器地址(主存储器块或 OTP 区域内)执行数据写入操作;
(4) 等待 BSY 位被清零时,表示写入完成。
1.2 工程实例
- 配置时钟
- 其余配置与之前cubeMX配置差不多
- 注意一定要更改一下堆栈大小
- 打开工程
工程源码链接
链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn - 添加代码
- 主函数如下:
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t i;
uint8_t FlashTest[] = "Hello this is isyuuun!";
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
FlashWriteBuff( DEVICE_INFO_ADDRESS, FlashTest,sizeof(FlashTest) ); // 写入数据到Flash
for(i=0;i<255;i++)
FlashWBuff[i] = i;
FlashWriteBuff( DEVICE_INFO_ADDRESS + sizeof(FlashTest), FlashWBuff,255 ); // 写入数据到Flash
FlashReadBuff( DEVICE_INFO_ADDRESS + sizeof(FlashTest),FlashRBuff,255 ); // 从Flash中读取数
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
- 硬件调试
ST-LINK | STM32 |
---|---|
SWCLK/TCK | SWCLK/TCK |
SWDIO/TMS | SWDIO/TMS |
GND | GND |
VCC | VCC |
ST-link驱动安装连接:https://pan.baidu.com/s/1cmreV0
检测驱动
,在设备管理器中查看
- 在Keil MDK中配置STlink
- 软件调试
添加两个定义的缓存区,uint8_t FlashWBuff [255];
uint8_t FlashRBuff [255];
全速运行后结果如下:
二、DAC播放音频
2.1 DAC简介
- Digital-to-Analog Converter的缩写,
数模转换器
。又称D/A转换器,简称DAC,是指将离散的数字信号
转换为连续变量的模拟信号
的器件。
大容量的STM32F103具有内部DAC模块,典型的数字模拟转换器将表示一定比例电压值的数字信号转换为模拟信号。
2.2 DAC工程实例(截取音频)
基于片内Flash的提示音播放程序。
1)实验数据准备:用Adobe audition或goldwave等音频编辑软件录制“您好欢迎光临!”的几秒钟的声音(8khz采样、8bit量化编码的单声道wav格式),确保音频数据尽量小(最大不超64KB)。然后编程将其分批次写入stm32f103c8t6芯片内部flash区域。
2)数字音频还原播放任务:编程读取此段音频,分别通过stm32f103c8t6自带的DAC通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果;
源码工程:https://pan.baidu.com/s/1gEATonRXK7km3yf-Mu0eEQ
提取码:1234
- 音频准备
生成后,使用WavToC软件打开,将wav转为c
保存代码后,我们打开复制其值
打开工程文件,更改代码
将刚刚复制的值放在Sine12bit数组中,更改数组大小。
- 写入芯片,即可通过DAC通道观察波形
2.3 DAC工程实例(录音频)
录音频与截取音频差不多的过程,只是使用Au软件开始方面不同。
三、总结
STM32自带的功能就有很多,本例中flash和DAC模块等,要学习的路还很长。
参考文章:
https://blog.csdn.net/weixin_42653531/article/details/90745042
https://blog.csdn.net/zhanglifu3601881/article/details/96632971
https://blog.csdn.net/as480133937/article/details/102309242
版权声明:本文为CSDN博主「isyuuun」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/isyuuun/article/details/122265862
暂无评论