STM32F1C8T6Flash读取音频和DAC播放

2023-05-16

文章目录

  • 一、Flash简介
    • 1、Flash原理
    • 2、STM32F1中的Flash
  • 二、Flash地址空间的数据读取
    • 1、题目要求
    • 2、CUbeMX工程建立
    • 3、Keil工程修改
    • 4、STlink调试说明
    • 5、调试运行
  • 三、基于片内Flash的提示音播放程序
    • 1、使用DAC输出周期2khz的正弦波
    • 2、使用DAC输出数字音频歌曲数据转换为模拟音频波形输出
  • 四、总结
  • 五、参考资料

一、Flash简介

1、Flash原理

Flash全名叫做Flash Memory,从名字就能看出,是种数据存储设备,存储设备有很多类,Flash属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device)。关于什么是非易失性/易失性,从名字中就可以看出,非易失性就是不容易丢失,数据存储在这类设备中,即使断电了,也不会丢失,这类设备,除了Flash,还有其他比较常见的入硬盘,ROM等,与此相对的,易失性就是断电了,数据就丢失了,比如大家常用的内存,不论是以前的SDRAM,DDR SDRAM,还是现在的DDR2,DDR3等,都是断电后,数据就没了。

典型的Flash内存单元的物理结构:
在这里插入图片描述

2、STM32F1中的Flash

不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了 1024K 字节。市面上 STM32F1 开发板使用的芯片是 STM32F103系列,其 FLASH 容量一般为 512K 字节,属于大容量芯片。

STM32F1 的闪存(Flash)模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。下面我们就来介绍下这些组成部分:

①主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。从上图可以看出主存储器的起始地址就是0X08000000, BOOT0、BOOT1 都接 GND 的时候,就是从 0X08000000 开始运行代码的。

②信息块。该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3, BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能,这里我们不做介绍,大家可以百度了解。

③闪存存储器接口寄存器。该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。

在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。

二、Flash地址空间的数据读取

1、题目要求

Flash地址空间的数据读取。stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的正确性和读写速率。

2、CUbeMX工程建立

配置定时器:
在这里插入图片描述
管脚设置:
在这里插入图片描述
如图将PC13设置为GPIO OUT

系统时钟树:
请添加图片描述
RCC:
请添加图片描述
NVIC:
请添加图片描述
设置堆栈大小后输出工程:
在这里插入图片描述

3、Keil工程修改

首先在生成的工程中加入flash.c和flash.h文件。
链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn
记得将.c文件保存在Src中,将.h文件保存在Inc中。
在工程中右键添加:
在这里插入图片描述
在main.c中添加头文件:

#include "flash.h"

在这里插入图片描述

/* USER CODE BEGIN 0 */
uint8_t FlashWBuff[255];
uint8_t FlashRBuff[255];	
/* USER CODE END 0 */

在这里插入图片描述

  /* 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 */

在这里插入图片描述
编译调试:
在这里插入图片描述
看到没有错误。

4、STlink调试说明

接线

ST-LINKSTM32
SWCLK/TCKSWCLK/TCK
SWDIO/TMSSWDIO/TMS
GNDGND
VCCVCC

回到Keil下,在魔法棒Option选项卡进行设置
首先是选择调试器,如果使用的是 ST-Link,在 Debug 选项卡中,请选择ST-Link Debugger
在这里插入图片描述
安装好ST-Link驱动
选择好ST-Link Debugger后点击Setting进行设置:
在这里插入图片描述
看到如图中出现红框内的信息说明连接成功。

点击如图中的下载烧录即可。

5、调试运行

点击debug进入调试
在视图中选择内存窗口选择内存1,即memory窗口:
在这里插入图片描述
同样的在观测窗口点击观测1,然后添加两个变量FlashWBuff 和 FlashRBuff:
在这里插入图片描述
点击全速运行再关闭,看到芯片的PC13口由灭变亮。
在这里插入图片描述
看到FlashWBuff 和 FlashRBuff变量中分别写入了数据。
在这里插入图片描述
在这里插入图片描述

在memory窗口中输入FLASH地址0x0800C000,右键点击选择Ascii进行观察:
在这里插入图片描述
看到我们在main中的数据成功写入了该地址。

三、基于片内Flash的提示音播放程序

1、使用DAC输出周期2khz的正弦波

软件需要:Adobe Audition CS6
首先用Adobe Audition CS6产生正弦波进行测试,如果播放成功那么音乐是同样的原理就都可以成功。

首先新建音频文件:
在这里插入图片描述
在效果中点击生成基本音色:
在这里插入图片描述
然后选择正弦波,设置频率振幅等参数:
在这里插入图片描述
然后在文件中导出文件:
请添加图片描述
选择导出文件名,选择导出位置,然后这里默认是与导出类型与新建的类型和频率相同,我们也可以在这里更改:
在这里插入图片描述
用UltraEdit文本编辑器打开音频文件。
在这里插入图片描述
ctrl+A全选,右键点击十六进制复制选定视图,然后新建一个文件,将复制的内容粘贴进去。
在这里插入图片描述
ctrl+A全选后右键选择范围。
在这里插入图片描述
在这里插入图片描述
这样就选中了我们需要 的内容。
上面选中的内容复制粘贴到notepad++中。
在这里插入图片描述

在编辑中选择列块编辑。
在这里插入图片描述
输入0x
在这里插入图片描述
这里借用DAC生成正弦波的例程代码
链接:https://pan.baidu.com/s/18zsQG5mZXbjafPuAJEUkMg
提取码:706i
将红框内的数字替换:
在这里插入图片描述
之后,编译下载,看能否观察到预期的正弦波。

2、使用DAC输出数字音频歌曲数据转换为模拟音频波形输出

1.使用Audition截取一段喜欢的音乐
①选择文件->打开,找到对应的音乐
②选中一段,然后右键,选择存储选区,接着更改采用类型
在这里插入图片描述
在这里插入图片描述
编辑好代码后,烧录,借助音频模块听听看能否还原

四、总结

本次实验验证使用了Flash存储读取数据,理解了Flash的原理。

五、参考资料

https://www.cnblogs.com/yuanqiangfei/p/9400435.html

https://blog.csdn.net/lushoumin/article/details/87694389

https://blog.csdn.net/qq_43279579/article/details/111990896

https://blog.csdn.net/zhanglifu3601881/article/details/96632971

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F1C8T6Flash读取音频和DAC播放 的相关文章

随机推荐

  • 动态内存申请(malloc, calloc, new)之分配虚拟内存空间和物理内存空间

    动态内存申请 xff08 malloc calloc new xff09 之分配虚拟内存空间和物理内存空间 1 动态内存申请的底层系统调用 动态内存申请函数根据申请的内存大小选择不同的系统调用 xff0c 小于128K选择brk系统调用分配
  • jsoncpp与rapidjson易用性与性能评测

    文章目录 jsoncpp与rapidjson易用性与性能评测1 概述2 易用性2 1 jsoncpp2 2 rapidjson 3 性能4 总结 jsoncpp与rapidjson易用性与性能评测 1 概述 jsoncpp和rapidjso
  • 二叉树的构建、遍历及c++实现

    文章目录 二叉树遍历二叉树构建c 43 43 实现原码 二叉树遍历 二叉树有四种遍历方式 xff0c 先序遍历 中序遍历 后序遍历和层次遍历 xff0c 其中层次遍历类似于图结构里面的广度优先搜索BFS xff0c 先序遍历类似于深度优先搜
  • NodeJS开发web应用程序之http,express,socket.io介绍

    文章目录 NodeJS开发web应用程序之http xff0c express xff0c socket io介绍1 http2 express3 socket io NodeJS开发web应用程序之http xff0c express x
  • [编译问题解决]error: ‘atomic_int32_t’ in namespace ‘std’ does not name a type

    编译问题解决 error atomic int32 t in namespace std does not name a type https en cppreference com w cpp atomic atomic c 43 43
  • ffmpge转码常用指令介绍(不断更新...)

    帧率 分辨率 码率 文件大小转换 ffmpeg i input mp4 r 30 b a 100k b v 200k s 1920x1080 fs 4000K output mp4 i 输入视频文件 r 输出帧率 b a 输出音频码率 b
  • 解决linux系统下java调用带breakpad异常捕获的c++ sdk必现crash问题

    问题背景 java通过jni去集成c 43 43 sdk时线上发现会有偶现崩溃 xff0c 为了方便定位native c 43 43 的崩溃 xff0c sdk采用了google breakpad崩溃转储方案 xff08 Google跨平台
  • 基于netlink的Linux Network Monitor实现

    一 背景 来源于产品开发需求 xff0c 需要在linux系统下实现网络状类型查询及网络类型变更通知 xff0c 比如从Ethernet变为Wifi xff0c 从Wifi变为Ethernet等 二 设计方案 Linux系统提供了Netli
  • Altium Designer绘制一个stm32最小系统的电路原理图

    文章目录 一 Altium Designer二 新建工程文件三 绘制原理图库1 绘制元器件2 导入元器件库3 绘制模块 一 Altium Designer Altium Designer 是原Protel软件开发商Altium公司推出的一体
  • C++11面向切面编程(AOP)入门指南

    何为AOP 面向切面编程 xff08 AOP xff0c Aspect Oriented Programming xff09 是一种编程范式 xff0c 允许开发者在不修改原有代码的情况下 xff0c 为程序添加额外的功能 什么是面向切面编
  • 车道线识别/Opencv/传统方法

    车道检测 Advanced Lane Finding Project 实现步骤 使用提供的一组棋盘格图片计算相机校正矩阵 camera calibration matrix 和失真系数 distortion coefficients 校正图
  • 2019新买电脑必备软件

    都2019了 xff0c 怎么还要安装这些垃圾软件 xff01 群丫头买了个新电脑 xff0c 为了避免她踩到笔者曾今踩到的坑 xff0c 更舒心的使用电脑 xff0c 为此特写此文 作为一个电脑平凡使用者 xff0c 用过无数的软件 xf
  • Docker与anaconda+jupyter

    Arch docker的安装 pacman 安装docker sudo pacman S docker docker启动 sudo systemctl start docker 设置开机启动docker sudo systemctl ena
  • Opencv目标追踪

    参考 xff1a https www pyimagesearch com 2018 07 30 opencv object tracking 引言 Opencv作为图像处理开源库包含了Object Tracking目标追踪的一些API xf
  • 使用cmake编译,组织C++项目

    文章目录 前言例一例二例三 前言 这篇博客是我对cmake用法的一些经验总结 还很浅显 如果有错误或者更好的方案 欢迎指正 使用方法统一为在build目录中执行 cmake make 我觉得养成外部编译是一个好习惯 例一 目录结构为 lzj
  • Spring Security Oauth2.0认证授权

    基本概念 认证 用户认证就是判断一个用户的身份是否合法的过程 xff0c 用户去访问系统资源时系统要求验证用户的身份信息 xff0c 身份合法方可继续访问 xff0c 不合法则拒绝访问 常见的用户身份认证方式有 用户名密码登录 xff0c
  • C语言实现HTTP的GET和POST请求

    HTTP请求和IP TCP 所谓的HTTP协议是基于IP TCP协议的 xff0c 所以要获取远端的html数据只要创建socket对象就足够了 xff1b HTTP是基于IP TCP加上了网络请求的固定格式 get 请求 include
  • 英伟达GPU安装教程

    英伟达GPU安装教程
  • 四种插头类型:XH、VH、SM、HY

    PH1 25mm HY2 0mm XH2 5 2 54mm xff08 这两个其实是一样的 xff09 VH3 96mm 插头分成三种类型 xff1a XH xff1b VH xff1b SM xff1b HY XH 4Y 是插头 xff1
  • STM32F1C8T6Flash读取音频和DAC播放

    文章目录 一 Flash简介1 Flash原理2 STM32F1中的Flash 二 Flash地址空间的数据读取1 题目要求2 CUbeMX工程建立3 Keil工程修改4 STlink调试说明5 调试运行 三 基于片内Flash的提示音播放