基于STM32F103C8T6片内Flash的音频播放(DAC通道)

基于STM32F103C8T6片内Flash的音频播放(DAC通道)

  • 一、STM32的DAC通道介绍
    • 1、DAC 简介
    • 2、STM32中的DAC主要特点
    • 3、DAC 功能框图剖析
    • 4、DAC配置
  • 二、实验要求
  • 三、数据准备
    • 1、生成mav文件
    • 2、使用UltraEdit得到相关数据
    • 3、使用notepad++添加相关内容
  • 四、使用DAC输出周期2khz的正弦波
  • 五、使用DAC输出数字音频歌曲数据转换为模拟音频波形输出
  • 六、总结
  • 参考

一、STM32的DAC通道介绍

1、DAC 简介

  • DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与 ADC 相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而 ADC 把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后,再由 DAC 输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。
  • STM32 具有片上 DAC 外设,它的分辨率可配置为 8 位或 12 位的数字输入信号,具有两个 DAC 输出通道,这两个通道互不影响,每个通道都可以使用 DMA 功能,都具有出错检测能力,可外部触发。

2、STM32中的DAC主要特点

  • 拥有2个DAC转换器
  • DAC通道为8位或12位单调输出
  • DAC通道为12位模式下数据的左对齐或者右对齐
  • DAC通道具有同步更新功能
  • DAC通道可以生成噪声波形
  • DAC通道可以生成三角波形
  • 双DAC通道同时或者分别转换
  • 每个DAC通道都有DMA功能

3、DAC 功能框图剖析

在这里插入图片描述

  • ①中表示的是DAC模块模拟部分的供电和DAC模块的参考电压 ,STM32 的 DAC 规定了它的参考电压输入范围为 2.4—3.3V。一般,取值为3.3V。
  • ②中DAC_OUTx表示DAC输出通道,对应引脚是PA4或者PA5。

4、DAC配置

(1)开启相应引脚时钟,设置 PA4 为模拟输入。(DAC1对应PA4,DAC2对应PA5)

STM32F103ZET6 的 DAC 通道 1 在 PA4 上,所以,我们要使能 PORTA 的时钟

### 判断一个字符串是否等于另一个字符串的子串 为了实现这一功能,可以通过多种方式来完成这个任务。一种常见的方式是在Python中使用`in`操作符来检查一个字符串是否是另一字符串的一部分,并且通过比较长度和具体位置的内容来进行最终确认。 对于更复杂的场景,在C++或Java环境中,则可以利用特定的方法如`find()`函数[^2] 或者 `contains()` 方法[^3] 来查找子串的位置并进一步验证两者的相等性。 下面给出具体的例子: #### Python 实现方案 在Python里可以直接用`in`关键字加上额外逻辑处理: ```python def is_substring_equal(main_str, sub_str): if len(sub_str) > len(main_str): return False # Check if substring exists within main string and they are equal at some point. for i in range(len(main_str)-len(sub_str)+1): if main_str[i:i+len(sub_str)] == sub_str: return True return False ``` 此代码段定义了一个名为`is_substring_equal` 的函数,该函数接收两个参数:一个是主字符串 (`main_str`) 和要匹配的目标子串(`sub_str`). 函数会遍历整个主字符串寻找目标子串的存在及其完全一致的情况. #### C++ 实现方案 而在C++, 可以借助标准库提供的成员函数`std::string::find`: ```cpp #include <iostream> #include <string> bool IsSubstringEqual(const std::string& haystack, const std::string& needle){ size_t pos = haystack.find(needle); // If found and lengths match then substrings are considered as equals. if(pos != std::string::npos && (haystack.length() >= needle.length())){ return true; } return false; } ``` 这段代码同样实现了上述目的,其中`find()`方法用来定位子串首次出现的位置,当找到有效位置并且满足长度条件时即认为二者相等。 #### Java 实现方案 最后来看一下Java版本的做法,这里采用的是`String.contains()`配合索引校验的方式来达成相同的效果: ```java public class SubstringCheck { public static boolean checkEquality(String source, String target){ int index = source.indexOf(target); // Verify existence of the substring and equality based on position. if(index >= 0 && !source.isEmpty()){ return source.substring(index).equals(target); } return false; } } ``` 以上三种不同编程语言下的解决方案都展示了如何有效地判断一个较短的字符串是否作为连续部分存在于较长的字符串之中,并且在这两点之间保持绝对的一致性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值