0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

第十五章 DAC (上篇)

W55MH32 ? 来源:W55MH32 ? 作者:W55MH32 ? 2025-05-28 15:07 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

单芯片解决方案,开启全新体验——W55MH32 高性能以太网单片机

W55MH32是WIZnet重磅推出的高性能以太网单片机,它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身,具体来说,一颗W55MH32内置高性能Arm? Cortex-M3核心,其主频最高可达216MHz;配备1024KB FLASH与96KB SRAM,满足存储与数据处理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP协议栈、内置MAC以及PHY,拥有独立的32KB以太网收发缓存,可供8个独立硬件socket使用。如此配置,真正实现了All-in-One解决方案,为开发者提供极大便利。

在封装规格上,W55MH32 提供了两种选择:QFN68和QFN100。

W55MH32Q采用QFN68封装版本,尺寸为8x8mm,它拥有36个GPIO、3个ADC、12通道DMA、17个定时器、2个I2C、3个串口、2个SPI接口(其中1个带I2S接口复用)、1个CAN以及1个USB2.0。在保持与同系列其他版本一致的核心性能基础上,仅减少了部分GPIO以及SDIO接口,其他参数保持一致,性价比优势显著,尤其适合网关模组等对空间布局要求较高的场景。紧凑的尺寸和精简化外设配置,使其能够在有限空间内实现高效的网络连接与数据交互,成为物联网网关、边缘计算节点等紧凑型设备的理想选择。 同系列还有QFN100封装的W55MH32L版本,该版本拥有更丰富的外设资源,适用于需要多接口扩展的复杂工控场景,软件使用方法一致。更多信息和资料请进入http://www.w5500.com/网站或者私信获取。

此外,本W55MH32支持硬件加密算法单元,WIZnet还推出TOE+SSL应用,涵盖TCP SSL、HTTP SSL以及MQTT SSL等,为网络通信安全再添保障。

为助力开发者快速上手与深入开发,基于W55MH32Q这颗芯片,WIZnet精心打造了配套开发板。开发板集成WIZ-Link芯片,借助一根USB C口数据线,就能轻松实现调试、下载以及串口打印日志等功能。开发板将所有外设全部引出,拓展功能也大幅提升,便于开发者全面评估芯片性能。

若您想获取芯片和开发板的更多详细信息,包括产品特性、技术参数以及价格等,欢迎访问官方网页:http://www.w5500.com/,我们期待与您共同探索W55MH32的无限可能。

wKgZO2gbOfaAVPzkACJSygzv-rI600.png

第十五章 DAC (上篇)

1 DAC简介

数字/模拟转换模块(DAC)是 12 位数字输入,电压输出的数字/模拟转换器。DAC 可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用。DAC 工作在 12 位模式时,数据可以设置成左对齐或右对。DAC 模块有 2 个输出通道,每个通道都有单独的转换器。在双 DAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出。DAC 可以通过引脚输入参考电压 VREF+以获得更精确的转换结果。

2 DAC主要特征

?2 个 DAC 转换器:每个转换器对应 1 个输出通道

?8 位或者 12 位单调输出

?12 位模式下数据左对齐或者右对齐

?同步更新功能

?噪声波形生成

?三角波形生成

?双 DAC 通道同时或者分别转换

?每个通道都有 DMA 功能

?外部触发转换

?输入参考电压 VREF+

DAC通道模块框图如下:

wKgZPGg2tLmAVSAVAAKCsGFXf4g888.png

DAC 通道模块框图

名称 型号类型 注释
VREF+ 输入,正模拟参考电压 DAC使用的高端/正极参考电压,2.4V≤VREF+≤VDDA(3.3V)
VDDA 输入,模拟电源 模拟电源
VSSA 输入,模拟电源地 模拟电源的地线
DAC_OUTx 模拟输出信号 DAC通道x的模拟输出

注意: 一旦使能 DACx 通道,相应的 GPIO 引脚(PA4 或者 PA5)就会自动与 DAC 的模拟输出相连(DAC_OUTx)。为了避免寄生的干扰和额外的功耗,引脚 PA4 或者 PA5 在之前应当设置成模拟输入(AIN)。

3 DAC功能描述

3.1 使能DAC通道

将 DAC_CR 寄存器的 ENx 位置'1'即可打开对 DAC 通道 x 的供电。经过一段启动时间 tWAKEUP,DAC 通道 x 即被使能。注意: ENx 位只会使能 DAC 通道 x 的模拟部分,即便该位被置'0',DAC 通道 x 的数字部分仍然工作

3.2 使能DAC输出缓存

DAC 集成了 2 个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个DAC 通道输出缓存可以通过设置 DAC_CR 寄存器的 BOFFx 位来使能或者关闭。

3.3 DAC数据格式

根据选择的配置模式,数据按照下文所述写入指定的寄存器:

?单 DAC 通道 x,有 3 种情况:

······8 位数据右对齐:用户须将数据写入寄存器 DAC_DHR8Rx[7:0]位(实际是存入寄存器DHRx[11:4]位)

······12位数据左对齐:用户须将数据写入寄DAC_DHR12Lx[15:4]位(实际是存入寄存器DHRx[11:0]位)

······12 位数据右对齐:用户须将数据写入寄存器 DAC_DHR12Rx[11:0]位(实际是存入寄存器DHRx[11:0]位)

根据对 DAC_DHRyyyx 寄存器的操作,经过相应的移位后,写入的数据被转存到 DHRx 寄存器中(DHRx 是内部的数据保存寄存器 x)。随后,DHRx 寄存器的内容或被自动地传送到 DORx 寄存器,或通过软件触发或外部事件触发被传送到 DORx 寄存器。

wKgZPGg2tLmALWLAAAB_JFfnnX8644.png

单 DAC 通道模式的数据寄存器

?双 DAC 通道,有 3 种情况:

······8 位数据右对齐:用户须将 DAC 通道 1 数据写入寄存器 DAC_DHR8RD[7:0]位(实际是存入寄存器 DHR1[11:4]位),将 DAC 通道 2 数据写入寄存器DAC_DHR8RD[15:8]位(实际是存入寄存器 DHR2[11:4]位)

·······12 位数据左对齐:用户须将 DAC 通道 1 数据写入寄存器 DAC_DHR12LD[15:4]位(实际是存入寄存器 DHR1[11:0]位),将 DAC 通道 2 数据写入寄存器 DAC_DHR12LD[31:20]位(实际是存入寄存器 DHR2[11:0]位)

·······12 位数据右对齐:用户须将 DAC 通道 1 数据写入寄存器 DAC_DHR12RD[11:0]位(实际是存入寄存器 DHR1[11:0]位),将 DAC 通道 2 数据写入寄存器 DAC_DHR12RD[27:16]位(实际是存入寄存器 DHR2[11:0]位)

根据对 DAC_DHRyyyD 寄存器的操作,经过相应的移位后,写入的数据被转存到 DHR1 和 DHR2 寄存器中(DHR1 和 DHR2 是内部的数据保存寄存器 x)。随后,DHR1 和 DHR2 的内容或被自动地传送到 DORx 寄存器,或通过软件触发或外部事件触发被传送到 DORx 寄存器。

wKgZO2g2tLmAPU5xAABwpOAf1mc362.png

双 DAC 通道模式的数据寄存器

3.4 DAC转换

不能直接对寄存器 DAC_DORx 写入数据,任何输出到 DAC 通道 x 的数据都必须写入 DAC_DHRx 寄存器(数据实际写入DAC_DHR8Rx、DAC_DHR12Lx、DAC_DHR12Rx、DAC_DHR8RD、DAC_DHR12LD、或者 DAC_DHR12RD 寄存器)。

如果没有选中硬件触发(寄存器 DAC_CR1 的 TENx 位置'0'),存入寄存器 DAC_DHRx 的数据会在一个 APB1 时钟周期后自动传至寄存器 DAC_DORx。如果选中硬件触发(寄存器 DAC_CR1 的 TENx 位置'1'),数据传输在触发发生以后 3 个 APB1 时钟周期后完成。一旦数据从 DAC_DHRx 寄存器装入 DAC_DORx 寄存器,在经过时间 tSETTLING 之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。

wKgZPGg2tLmAESOrAADSgnkVvDY153.png

TEN=0 触发失能时转换的时间框图

3.5 DAC输出电压

数字输入经过 DAC 被线性地转换为模拟电压输出,其范围为 0 到 VREF+。

任一 DAC 通道引脚上的输出电压满足下面的关系:

?DAC 输出=VREFx(DOR/4095)。

3.6 选择DAC触发

如果 TENx 位被置 1,DAC 转换可以由某外部事件触发(定时器计数器、外部中断线)。配置控制TSELx[2:0]可以选择 8 个触发事件之一触发 DAC 转换。

触发源 类型 TSELx[2:0]
定时器 6TRGO 事件 来自片上定时器的内部信号 000
定时器 8TRGO 事件 001
定时器 7TRGO 事件 010
定时器 5TRGO 事件 011
定时器 2TRGO 事件 100

每次 DAC 接口侦测到来自选中的定时器 TRGO 输出,或者外部中断线 9 的上升沿,最近存放在寄存器 DAC_DHRx 中的数据会被传送到寄存器 DAC_DORx 中。在 3 个 APB1 时钟周期后,寄存器DAC_DORx 更新为新值。

如果选择软件触发,一旦 SWTRIG 位置'1',转换即开始。在数据从 DAC_DHRx 寄存器传送到DAC_DORx 寄存器后,SWTRIG 位由硬件自动清'0'。

注意: 1.不能在 ENx 为'1'时改变 TSELx[2:0]位。2.如果选择软件触发,数据从寄存器 DAC_DHRx 传送到寄存器 DAC_DORx 只需要一个 APB1 时钟周期。

3.7 DMA请求

任一 DAC 通道都具有 DMA 功能。2 个 DMA 通道可分别用于 2 个 DAC 通道的 DMA 请求。如果DMAENx 位置'1',一旦有外部触发(而不是软件触发)发生,则产生一个 DMA 请求,然后DAC_DHRx 寄存器的数据被传送到 DAC_DORx 寄存器。

在双 DAC 模式下,如果 2 个通道的 DMAENx 位都为'1',则会产生 2 个 DMA 请求。如果实际只需要一个 DMA 传输,则应只选择其中一个 DMAENx 位置'1'。这样,程序可以在只使用一个 DMA 请求,一个DMA 通道的情况下,处理工作在双 DAC 模式的 2 个 DAC 通道。DAC 的 DMA 请求不会累计,因此如果第 2 个外部触发发生在响应第 1 个外部触发之前,则不能处理第 2 个 DMA 请求,也不会报告错误。

3.8 噪声生成

可以利用线性反馈移位寄存器(Linear Feedback Shift Register LFSR)产生幅度变化的伪噪声。设置WAVE[1:0]位为'01'选择DAC噪声生成功能。寄存器LFSR的预装入值为0xAAA。按照特定算法,在每次触发事件后 3 个 APB1 时钟周期之后更新该寄存器的值。

DACLFSR 寄存器算法

设置 DAC_CR 寄存器的 MAMPx[3:0]位可以屏蔽部分或者全部 LFSR 的数据,这样的得到的 LSFR 值与 DAC_DHRx 的数值相加,去掉溢出位之后即被写入 DAC_DORx 寄存器。

如果寄存器 LFSR 值为 0x000,则会注入'1'(防锁定机制)。将 WAVEx[1:0]位置'0'可以复位 LFSR 波形的生成算法。

wKgZPGg2tLmAN4S2AAGEQZTDqPY885.png

带 LFSR 波形生成的 DAC 转换(使能软件触发)

3.9 三角波生成

可以在 DC 或者缓慢变化的信号上加上一个小幅度的三角波。设置 WAVEx[1:0]位为'10'选择 DAC 的三角波生成功能。设置 DAC_CR 寄存器的 MAMPx[3:0]位来选择三角波的幅度。内部的三角波计数器每次触发事件之后 3 个 APB1 时钟周期后累加 1。计数器的值与 DAC_DHRx 寄存器的数值相加并丢弃溢出位后写入 DAC_DORx 寄存器。在传入 DAC_DORx 寄存器的数值小于 MAMP[3:0]位定义的最大幅度时,三角波计数器逐步累加。一旦达到设置的最大幅度,则计数器开始递减,达到 0 后再开始累加,周而复始。

将 WAVEx[1:0]位置'0'可以复位三角波的生成。

wKgZO2g2tLmAa3yyAADVSI1IJ4I507.png

DAC 三角波生成

wKgZPGg3sjKAB-cZAAEUobgNocA709.png

带三角生成的 DAC 转换(使能软件触发)

注意: 1.为了产生三角波,必须使能 DAC 触发,即设 DAC_CR 寄存器的 TENx 位为'1'。

MAMP[3:0]位必须在使能 DAC 之前设置,否则其值不能修改。

4 双DAC通道转换

在需要 2 个 DAC 同时工作的情况下,为了更有效地利用总线带宽,DAC 集成了 3 个供双 DAC 模式使用的寄存器:DHR8RD、DHR12RD 和 DHR12LD,只需要访问一个寄存器即可完成同时驱动 2 个DAC 通道的操作。

对于双 DAC 通道转换和这些专用寄存器,共有 11 种转换模式可用。这些转换模式在只使用一个DAC 通道的情况下,仍然可通过独立的 DHRx 寄存器操作。

4.1 不使用波形发生器的独立触发

按照下列顺序设置 DAC 工作在此转换模式:

?分别设置 2 个 DAC 通道的触发使能位 TEN1 和 TEN2 为'1';

?通过设置 TSEL1[2:0]和 TSEL2[2:0]位为不同值,分别配置 2 个 DAC 通道的不同触发源;

?将双 DAC 通道转换数据装入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。

当发生 DAC 通道 1 触发事件时,(延迟 3 个 APB1 时钟周期后)寄存器 DHR1 的值传入寄存器DAC_DOR1。

当发生 DAC 通道 2 触发事件时,(延迟 3 个 APB1 时钟周期后)寄存器 DHR2 的值传入寄存器DAC_DOR2。

4.2 使用相同LFSR的独立触发

按照下列顺序设置 DAC 工作在此转换模式:

?分别设置 2 个 DAC 通道的触发使能位 TEN1 和 TEN2 为'1';

?通过设置 TSEL1[2:0]和 TSEL2[2:0]位为不同值,分别配置 2 个 DAC 通道的不同触发源;

?设置 2 个 DAC 通道的 WAVEx[1:0]位为”01”,并设置 MAMPx[3:0]为相同的 LFSR 屏蔽值;

?将双 DAC 通道转换数据装入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。

当发生 DAC 通道 1 触发事件时,具有相同屏蔽的 LFSR1 计数器值与 DHR1 寄存器数值相加,(延迟3 个 APB1 时钟周期后)结果传入寄存器 DAC_DOR1,然后更新 LFSR1 计数器。当发生 DAC 通道 2 触发事件时,具有相同屏蔽的 LFSR2 计数器值与 DHR2 寄存器数值相加,(延迟3 个 APB1 时钟周期后)结果传入寄存器 DAC_DOR2,然后更新 LFSR2 计数器。

4.3 使用不同LFSR的独立触发

按照下列顺序设置 DAC 工作在此转换模式:

?分别设置 2 个 DAC 通道的触发使能位 TEN1 和 TEN2 为'1';

?通过设置 TSEL1[2:0]和 TSEL2[2:0]位为不同值,分别配置 2 个 DAC 通道的不同触发源;

?设置 2 个 DAC 通道的 WAVEx[1:0]位为”01”,并设 MAMPx[3:0]为不同的 LFSR 屏蔽值;

?将双 DAC 通道转换数据装入所需的 DHR 寄存器(DHR12RD、DHR12LD 或者 DHR8RD)。

当发生 DAC 通道 1 触发事件时,按照 MAMP1[3:0]所设屏蔽的 LFSR1 计数器值与 DHR1 寄存器数值相加,(延迟 3 个 APB1 时钟周期后)结果传入寄存器 DAC_DOR1,然后更新 LFSR1 计数器。当发生 DAC 通道 2 触发事件时,按照 MAMP2[3:0]所设屏蔽的 LFSR2 计数器值与 DHR2 寄存器数值相加,(延迟 3 个 APB1 时钟周期后)结果传入寄存器 DAC_DOR2,然后更新 LFSR2 计数器。

4.4 产生相同三角波的独立触发

按照下列顺序设置 DAC 工作在此转换模式:

?分别设置 2 个 DAC 通道的触发使能位 TEN1 和 TEN2 为'1';

?通过设置 TSEL1[2:0]和 TSEL2[2:0]位为不同值,分别配置 2 个 DAC 通道的不同触发源;

?设置 2 个 DAC 通道的 WAVEx[1:0]位为”1x”,并设 MAMPx[3:0]为相同的三角波幅值;

将双 DAC 通道转换数据装入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。

当发生 DAC 通道 1 触发事件时,相同的三角波幅值加上 DHR1 寄存器的值,(延迟 3 个 APB1 时钟周期后)结果传入寄存器 DAC_DOR1,然后更新 DAC 通道 1 三角波计数器。

当发生 DAC 通道 2 触发事件时,相同的三角波幅值加上 DHR2 寄存器的值,(延迟 3 个 APB1 时钟周期后)结果传入寄存器 DAC_DOR2,然后更新 DAC 通道 2 三角波计数器。

4.5 产生不同三角波的独立触发

按照下列顺序设置 DAC 工作在此转换模式:

?分别设置 2 个 DAC 通道的触发使能位 TEN1 和 TEN2 为'1';

?通过设置 TSEL1[2:0]和 TSEL2[2:0]位为不同值,分别配置 2 个 DAC 通道的不同触发源;

?设置 2 个 DAC 通道的 WAVEx[1:0]位为'1x',并设 MAMPx[3:0]为不同的三角波幅值。

?将双 DAC 通道转换数据装入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。

当发生 DAC 通道 1 触发事件时,MAMP1[3:0]所设的三角波幅值加上 DHR1 寄存器数值,(延迟 3 个APB1 时钟周期后)结果传入寄存器 DAC_DOR1,然后更新 DAC 通道 1 三角波计数器。

当发生 DAC 通道 2 触发事件时,MAMP2[3:0]所设的三角波幅值加上 DHR2 寄存器数值,(延迟 3 个APB1 时钟周期后)结果传入寄存器 DAC_DOR2,然后更新 DAC 通道 2 三角波计数器。

4.6 同时软件启动

按照下列过程设置 DAC 工作在此转换模式:

?将双 DAC 通道转换数据装入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。在此配置下,一个 APB1 时钟周期后,DHR1 和 DHR2 寄存器的数值即被分别传入 DAC_DOR1 和DAC_DOR2 寄存器。

4.7 不使用波形发生器的同时触发

按照下列顺序设置 DAC 工作在此转换模式:

?分别设置 2 个 DAC 通道的触发使能位 TEN1 和 TEN2 为'1';

?通过设置 TSEL1[2:0]和 TSEL2[2:0]位为相同值,分别配置 2 个 DAC 通道使用相同触发源;

?将双 DAC 通道转换数据装入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。

当发生触发事件时,(延迟 3 个 APB1 时钟周期后)DHR1 和 DHR2 寄存器的数值分别传入 DAC_DOR1和 DAC_DOR2 寄存器。

4.8 使用相同LFSR的同时触发

按照下列顺序设置 DAC 工作在此转换模式:

?分别设置 2 个 DAC 通道的触发使能位 TEN1 和 TEN2 为'1';

?通过设置 TSEL1[2:0]和 TSEL2[2:0]位为相同值,分别配置 2 个 DAC 通道使用相同触发源;

?设置 2 个 DAC 通道的 WAVEx[1:0]位为”01”,并设 MAMPx[3:0]为相同的 LFSR 屏蔽值;

?将双 DAC 通道转换数据装入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD);

当发生触发事件时,MAMP1[3:0]所设屏蔽的 LFSR1 计数器值与 DHR1 寄存器的数值相加,(延迟 3个 APB1 时钟周期后)结果传入 DAC_DOR1 寄存器,然后更新 LFSR1 计数器。同样,MAMP1[3:0]所设屏蔽的 LFSR2 计数器值与 DHR2 寄存器的数值相加,(延迟 3 个 APB1 时钟周期后)结果传入寄存器 DAC_DOR2,然后更新 LFSR2 计数器。

4.9 使用不同LFSR的同时触发

按照下列顺序设置 DAC 工作在此转换模式:

?分别设置 2 个 DAC 通道的触发使能位 TEN1 和 TEN2 为'1';

?通过设置 TSEL1[2:0]和 TSEL2[2:0]位为相同值,分别配置 2 个 DAC 通道使用相同触发源;

?设置 2 个 DAC 通道的 WAVEx[1:0]位为'01',并设 MAMPx[3:0]为不同的 LFSR 屏蔽值;

?将双 DAC 通道转换数据装入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。

当发生触发事件时,具有相同屏蔽的 LFSR1 计数器值与 DHR1 寄存器数值相加,(延迟 3 个 APB1时钟周期后)结果传入寄存器 DAC_DOR1,然后更新 LFSR1 计数器。同时,具有相同屏蔽的 LFSR2 计数器值与 DHR2 寄存器数值相加,(延迟 3 个 APB1 时钟周期后)结果传入寄存器 DAC_DOR2,然后更新 LFSR2 计数器。

4.10 使用相同三角波发生器的同时触发

按照下列顺序设置 DAC 工作在此转换模式:

?分别设置 2 个 DAC 通道的触发使能位 TEN1 和 TEN2 为'1':

?通过设置 TSEL1[2:0]和 TSEL2[2:0]位为相同值,分别配置 2 个 DAC 通道使用相同触发源。

?设置 2 个 DAC 通道的 WAVEx[1:0]位为'1x',并设 MAMPx[3:0]为相同的三角波幅值。将双 DAC 通道转换数据装入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。

当发生触发事件时,相同的三角波幅值与 DHR1 寄存器数值相加,(延迟 3 个 APB1 时钟周期后)结果传入寄存器 DAC_DOR1,然后更新 LFSR1 计数器。同时,相同的三角波幅值与 DHR2 寄存器数值相加,(延迟 3 个 APB1 时钟周期后)结果传入寄存器DAC_DOR2,然后更新 LFSR2 计数器。

4.11 使用不同三角波发生器的同时触发

按照下列顺序设置 DAC 工作在此转换模式:

?分别设置 2 个 DAC 通道的触发使能位 TEN1 和 TEN2 为'1':

?通过设置 TSEL1[2:0]和 TSEL2[2:0]位为相同值,分别配置 2 个 DAC 通道使用相同触发源。

?设置 2 个 DAC 通道的 WAVEx[1:0]位为'1x',并设 MAMPx[3:0]为不同的三角波幅值。

?将双 DAC 通道转换数据装入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。

当发生触发事件时,MAMP1[3:0]所设的三角波幅值与 DHR1 寄存器数值相加,(延迟 3 个 APB1 时钟周期后)结果传入寄存器 DAC_DOR1,然后更新 LFSR1 计数器。同时,MAMP2[3:0]所设的三角波幅值与 DHR2 寄存器数值相加,(延迟 3 个 APB1 时钟周期后)结果传入寄存器 DAC_DOR2,然后更新 LFSR2 计数器。

5 例程设计

5.1 DAC_OutAudio例程

1.UART 模块:配置 USART1,波特率为 115200,将printf输出重定向到该串口,用于输出系统时钟信息与测试提示。

// UART初始化函数
void UART_Configuration(uint32_t bound)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    // 使能USART1和GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

    // 配置TX引脚(PA9)为复用推挽输出
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置RX引脚(PA10)为浮空输入
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置串口参数:115200bps,8位数据,1位停止位
    USART_InitStructure.USART_BaudRate = bound;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE);
}

// 重定向printf函数到USART1
int SER_PutChar(int ch)
{
    while (!USART_GetFlagStatus(USART_TEST, USART_FLAG_TC)); // 等待发送完成
    USART_SendData(USART_TEST, (uint8_t)ch);
    return ch;
}

int fputc(int c, FILE *f)
{
    if (c == 'n') SER_PutChar('r'); // 自动添加回车符
    return SER_PutChar(c);
}

2.GPIO 模块:使能 GPIOA 时钟,把引脚 4 和 5 配置成模拟输入模式,为 DAC 输出做准备。

3.DAC 模块:使能 DAC 时钟,对 DAC 通道 1 和通道 2 进行初始化,设置初始输出值,将触发源设为定时器 2 的触发输出,同时使能 DMA 请求。

4.定时器模块:使能定时器 2 时钟,配置其参数以产生 8kHz 的更新事件,将更新事件选为触发输出。

5.DMA 模块:使能 DMA2 时钟,配置通道 4 和通道 3,将Sine12bit数组的数据循环传输到 DAC2 和 DAC1 的数据寄存器。

void DMA_Configuration(void)
{
    DMA_InitTypeDef DMA_InitStructure;

    // 使能DMA2时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

    // 配置DMA2通道4(DAC2)
    DMA_InitStructure.DMA_PeripheralBaseAddr = DAC2_DHR12RD_ADDRESS; // DAC2数据寄存器地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;      // 数据源:正弦波数组
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                // 内存到外设
    DMA_InitStructure.DMA_BufferSize = DATA_LEN;                      // 传输长度
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;           // 内存地址递增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 16位数据
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                   // 循环模式
    DMA_Init(DMA2_Channel4, &DMA_InitStructure);
    DMA_Cmd(DMA2_Channel4, ENABLE);

    // 配置DMA2通道3(DAC1,参数与通道4相同)
    DMA_InitStructure.DMA_PeripheralBaseAddr = DAC1_DHR12RD_ADDRESS;
    DMA_Init(DMA2_Channel3, &DMA_InitStructure);
    DMA_Cmd(DMA2_Channel3, ENABLE);
}

数据转换模块:把 8 位数据转换为 12 位数据,存于Sine12bit数组。

6 下载验证

6.2 DAC_OutAudio例程

初始输出

在 DAC 配置过程中,代码会先将 DAC 通道 1 和通道 2 的输出设置为一个初始值(代码中设置为 3102)。因此,在程序启动的瞬间,DAC 的两个通道会输出对应于该初始值的电压信号。

在完成所有配置后,DMA 会将Sine12bit数组中的数据循环传输到 DAC 的数据寄存器,同时定时器 TIM2 会以 8kHz 的频率产生触发信号,触发 DAC 进行数模转换。因此,DAC 的两个通道会持续输出软件生成的正弦波信号。

?频率:由于定时器 TIM2 的周期设置为 8999,预分频器设置为 0,所以定时器的更新频率为 8kHz,这意味着 DAC 输出的正弦波信号的频率也为 8kHz。

?幅度:正弦波的幅度取决于Sine12bit数组中的数据,该数组中的数据是通过uint8_uint16函数将data数组中的 8 位数据转换为 12 位数据得到的。

WIZnet 是一家无晶圆厂半导体公司,成立于 1998 年。产品包括互联网处理器 iMCU?,它采用 TOE(TCP/IP 卸载引擎)技术,基于独特的专利全硬连线 TCP/IP。iMCU? 面向各种应用中的嵌入式互联网设备。

WIZnet 在全球拥有 70 多家分销商,在香港、韩国、美国设有办事处,提供技术支持和产品营销。

香港办事处管理的区域包括:澳大利亚、印度、土耳其、亚洲(韩国和日本除外)。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6068

    文章

    45032

    浏览量

    651963
  • dac
    dac
    +关注

    关注

    44

    文章

    2415

    浏览量

    194158
  • dma
    dma
    +关注

    关注

    3

    文章

    576

    浏览量

    103463
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    第十五章 DMA

    本章介绍DMA(直接存储器存取),其可在不占用CPU的情况下搬数据,支持多种传输方向,含控制器、通道等配置及相关实验代码。
    的头像 发表于 06-14 16:32 ?695次阅读
    <b class='flag-5'>第十五章</b> DMA

    第十五章 DAC (下篇)

    本篇文章为第十五章DAC(下篇),介绍三个例程:DAC_OutDMASineWave用DMA输出正弦波,DAC_OutNoiseWave输出噪声波,
    的头像 发表于 05-28 15:39 ?583次阅读
    <b class='flag-5'>第十五章</b> <b class='flag-5'>DAC</b> (下篇)

    《DNK210使用指南 -CanMV版 V1.0》第十五章 按键中断实验

    第十五章 按键中断实验 本章实验将介绍如何使用CanMV让Kendryte K210通过中断的方式获取板载按键的状态。通过本章的学习,读者将学习到在CanMV下Kendryte K210的GPIO
    发表于 10-12 09:20

    至芯科技之altera 系列FPGA教程 第十五篇 安装驱动

    至芯科技之altera 系列FPGA教程 第十五篇 安装驱动
    发表于 08-11 03:34

    视频详解:上海尤老师verilog入门到实战第十五

    本帖最后由 春哥哥 于 2016-10-10 17:48 编辑 上海尤老师verilog入门到实战第十五课——无线通信中的升采样过程中的频谱搬迁过程;百度云网盘链接后缀:/s/1i5kCpXb,加群讨论252520964,307510678
    发表于 10-10 10:42

    基于RFID和MySQL实现小区门禁系统

    第十五章 用RFID+MySQL实现小区门禁系统(RFID522+ESP8266-12N+1602LCD)(Arduino边做边学:从点亮Led到物联网)
    发表于 06-24 08:26

    「正点原子Linux连载」第十五章按键输入试验

    1)实验平台:正点原子Linux开发板2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》关注官方微信号公众号,获取更多资料:正点原子第十五章按键输入试验 前面几章试验都是讲解
    发表于 12-21 12:11

    第十五届智能车入门浅谈 精选资料分享

    @TOC第十五届智能车入门浅谈写博客原因这次第十五届全国智能车大赛已经结束了,对于我而言,确实是我大学中一个不可多得的经历,我希望我的这段经历可以保存下来通过博客的形式,同时可以对于其他人有帮助
    发表于 07-28 06:02

    第十五讲 组合逻辑电路的分析方法和设计方法

    第十五讲 组合逻辑电路的分析方法和设计方法 6.1概述组合逻辑电路:定义构成电路特点6.2.1组合逻辑电路的分析方法
    发表于 03-30 16:21 ?4989次阅读
    <b class='flag-5'>第十五</b>讲 组合逻辑电路的分析方法和设计方法

    模拟电路网络课件 第十五节:单级放大电路的瞬态响应

    模拟电路网络课件 第十五节:单级放大电路的瞬态响应 3.8 单级放大电路的瞬态响应
    发表于 09-17 10:18 ?919次阅读
    模拟电路网络课件 <b class='flag-5'>第十五</b>节:单级放大电路的瞬态响应

    第十五届全国大学生机器人大赛ROBOCON比赛规则

    第十五届全国大学生机器人大赛ROBOCON比赛规则,参加机器人的看看
    发表于 06-08 15:30 ?0次下载

    第十五届智能车入门浅谈

    @TOC第十五届智能车入门浅谈写博客原因这次第十五届全国智能车大赛已经结束了,对于我而言,确实是我大学中一个不可多得的经历,我希望我的这段经历可以保存下来通过博客的形式,同时可以对于其他人有帮助
    发表于 11-26 12:36 ?16次下载
    <b class='flag-5'>第十五</b>届智能车入门浅谈

    【正点原子FPGA连载】第十五章 窗口门狗(WWDG)实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    【正点原子FPGA连载】第十五章 窗口门狗(WWDG)实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
    发表于 12-05 11:21 ?12次下载
    【正点原子FPGA连载】<b class='flag-5'>第十五章</b> 窗口门狗(WWDG)实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    深度参与,共话未来 —— 吹田电气亮相第十五届亚洲电源技术发展论坛

    在这个金秋时节,吹田电气带着对电源技术的无限热爱与追求,我们启程前往第十五届亚洲电源技术发展论坛的盛会。在这场汇聚了行业精英、学者与前沿技术的盛会中,我们不仅仅见证了电源技术的最新进展,更与众多同行
    的头像 发表于 12-09 16:58 ?783次阅读
    深度参与,共话未来 —— 吹田电气亮相<b class='flag-5'>第十五</b>届亚洲电源技术发展论坛

    锐驰智光亮相第十五届交博会

    2025年4月23日,第十五届中国国际道路交通安全博览会(以下简称“交博会”)在武汉国际博览中心盛大启幕。
    的头像 发表于 04-24 17:12 ?506次阅读