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

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

3天内不再提示

基于STM32G4芯片的DAC应用示例分享

茶话MCU 来源:茶话MCU 作者:茶话MCU 2021-11-26 11:39 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

有人使用STM32G431芯片做DAC应用,具体来说就是通过DMA将数据从指定内存传送给DAC数据寄存器,并由定时器触发DAC转换。他发现总是没法实现该功能。这里简单介绍下相关实现过程,并做些提醒。这里要演示的基本功能就是让DAM将内存数据周期性传输给DAC数据寄存器,最后输出一路正弦波。

结合STM32G4芯片的特性,这里可以有两种实现方式。

第一种,DMA的请求来自于DAC1的转换事件。第二种,DMA的请求来自于定时器事件,下面用到的是定时器的更新事件。这里就两种实现方式的配置及相关用户代码简单介绍下,以供参考。

我们先看第一种方式,即DMA请求来自DAC转换事件,定时器3触发DAC的转换。

使用CubeMx进行配置,主要配置如下:

c633dbda-4ddc-11ec-9eda-dac502259ad0.png

c6869bf4-4ddc-11ec-9eda-dac502259ad0.png

c6f152b4-4ddc-11ec-9eda-dac502259ad0.png

完成配置后生成初始代码,再添加下面代码即可验证测试:

#define Tpai (2*3.14159)

uint32_t PData[200],Dac_data;

uint16_t i;

for (i=0;i《200;i++)

{

PData[i]=

(uint32_t ) (2000*(sin((Tpai/200)*i))+2000);

} //prepare data for DAC

HAL_DAC_Start_DMA(&hdac1,DAC_CHANNEL_1,(uint32_t*)&PData[0], 200,DAC_ALIGN_12B_R);

__HAL_TIM_ENABLE(&htim3);

上面配置的DMA传输方向是从内存到外设,目的和源的访问宽度都是32位WORD. 当然也可以是内存访问宽度为16位的半字,外设访问宽度为32位字。即DMA的配置像下面这样也是可以的。

c73c377a-4ddc-11ec-9eda-dac502259ad0.png

其它配置不动,代码稍微改动和整理下即可。参见下面代码:

Uint16_t PData[200],Dac_data;

#define Tpai (2*3.14159)

uint16_t i;

for (i=0;i《200;i++)

{

PData[i]=

(uint16_t )(2000*(sin((Tpai/200)*i))+2000);

} //prepare data for DAC

SET_BIT(hdac1.Instance-》CR,DAC_CR_DMAEN1);

HAL_DAC_Start(&hdac1,DAC_CHANNEL_1 );

HAL_Delay(2);

HAL_DMA_Start_IT(&hdma_dac1_ch1,(uint32_t)&PData[0],(uint32_t)&DAC1-》DHR12R1, 200);

__HAL_TIM_ENABLE(&htim3);

第一种方式就介绍到这里,再来看看第二种实现方式,即TIMER更新事件作为DMA请求源,同时作为DAC转换触发源。

基于CubeMx配置,主要调整下DMA配置,其它配置基本不动。

主要是DMA请求事件变了,其它配置跟第一种模式基本一样。

配置完成后生成初始化代码,再添加下面用户代码:

#define Tpai (2*3.14159)

uint16_t PData[200], Dac_data;

uint16_t i;

for (i=0;i《200;i++)

{

PData[i]=

(uint16_t )(2000*(sin((Tpai/200)*i))+2000);

}

HAL_DAC_Start(&hdac1,DAC_CHANNEL_1 );

HAL_Delay(3);

HAL_DMA_Start(&hdma_tim3_up,(uint32_t)&PData[0],(uint32_t)&DAC1-》DHR12R1, 200);

__HAL_TIM_ENABLE_DMA(&htim3, TIM_DMA_UPDATE);

__HAL_TIM_ENABLE(&htim3);

这里要提醒一点,G4系列的DAC1的数据保持寄存器可以一次放2个通道的数据,在使用DMA传输时,即使只用到1个通道,DMA对它的访问也要遵循WORD对齐,不然你可能会遇到麻烦。

如果说,我们不使用DMA做数据传输,只是手动给DAC喂数据,那如何实现上述效果呢?这时我们可以使用软件触发DAC的传输,手动给DAC的数据保持寄存器赋值,参考配置及实现代码如下:

c7e2f83a-4ddc-11ec-9eda-dac502259ad0.png

相关用户代码如下:

#define Tpai (2*3.14159)

uint16_t PData[200],Dac_data;

uint16_t i;

for (i=0;i《200;i++)

{

PData[i]=

(uint16_t)(2000*(sin((Tpai/200)*i))+2000);

}

HAL_DAC_Start(&hdac1,DAC_CHANNEL_1 );

HAL_Delay(3);

while(1)

{

for(i=0;i《200;i++)

{

DAC1-》DHR12R1= PData[i];

SET_BIT(hdac1.Instance-》SWTRIGR,DAC_SWTRIGR_SWTRIG1);

HAL_Delay(5);

Dac_data = DAC1-》DOR1;//for debug

}

}

总之,不论使用哪种方式,都可以实现我们所期望的结果,即输出如下正弦波。

好,关于STM32G4的DAC应用就简单介绍到这里,STM32G4系列的模拟外设丰富而强大,此处算是抛砖引玉。这里做些分享也是为了让其他有需要的人少走弯路,加速开发进程。【文中代码都很简短、直观,就没做注释说明了。还有个客观原因就是在微信公众号里排版也很费劲,字符不太好对齐。若有需要交流的可以后台留言。】

编辑:jq

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

    关注

    44

    文章

    2684

    浏览量

    196399
  • STM32
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371146
  • 定时器
    +关注

    关注

    23

    文章

    3360

    浏览量

    121741

原文标题:基于STM32G4芯片的DAC应用示例

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    DAC539E4W 智能数模转换器(DAC)技术总结

    DAC539E4W是10位智能数模转换器(DAC),具有四通道可编程比较器输入和四通道通用输出。查找表将比较器输入映射到 GPO。该DAC539E4W还支持可编程延迟,以允许输入转换稳定。这些设备
    的头像 发表于 10-28 09:54 429次阅读
    <b class='flag-5'>DAC539E4</b>W 智能数模转换器(<b class='flag-5'>DAC</b>)技术总结

    【RA4M2-SENSOR】ADC、DAC 电压输入输出

    【设置 DAC 模拟电压输出】 瑞萨 RA4M2 支持 12 位 DAC 输出,代码里可以设置输出模拟电压。DAC0 对应 P014 引脚,首先在 FPS Smart Configur
    发表于 10-17 00:06

    ‌基于STM32G474的数字电源控制板设计解析与应用指南

    STMicroelectronics STEVAL-DPSG474Q数字电源控制盘基于STM32G4系列的STM32G474QE微控制器。STEVAL-DPSG474Q可控制需要高引脚数的转换器的功率级(PFC、DCDC、DCAC),也可实现双级转换控制 (PFC+DCD
    的头像 发表于 10-15 13:59 762次阅读
    ‌基于<b class='flag-5'>STM32G</b>474的数字电源控制板设计解析与应用指南

    【RA4E2开发板评测】ADC、DAC 电压输入输出

    【设置 DAC 模拟电压输出】 瑞萨 RA4E2 支持 12 位 DAC 输出,代码里可以设置输出模拟电压。DAC0 对应 P014 引脚,首先在 FPS Smart Configur
    发表于 10-14 09:47

    【RA4M2-SENSOR】+DAC波形输出测试

    RA4M2-SENSOR内置有12 位 DAC,在硬件的支持下,要实现相应的功能,就需要以RASC进行引脚的配置,并生成KEIL工程代码,其步骤为: 添加一个DAC入栈,见图1所示。 图1 添加
    发表于 10-07 16:54

    DAC539E4W 10位智能DAC技术解析与应用指南

    Texas Instruments DAC539E4W 10位智能数模转换器 (DAC) 具有四路可编程比较器输入和四路通用输出。查找表将比较器输入映射到GPO。DAC539E4W还支持可编程延迟
    的头像 发表于 08-08 14:25 993次阅读
    <b class='flag-5'>DAC539E4</b>W 10位智能<b class='flag-5'>DAC</b>技术解析与应用指南

    STM32F3系列、STM32F4系列、STM32L4系列和STM32L4+系列Cortex-M4编程手册

    电子发烧友网站提供《STM32F3系列、STM32F4系列、STM32L4系列和STM32L4+系列Cortex-M4编程手册.pdf》资料
    发表于 06-06 17:06 9次下载

    大公开!用Air780EPM重构水质COD监测,替代STM32+4G模组的技术路径

    本方案采用Air780EPM单芯片替代STM32+4G模组,集成COD传感器驱动、数据加密与4G通信功能。 水质COD(化学需氧量)监控是评估水体有机污染程度的核心手段,涉及多种技术、设备及数据处理
    的头像 发表于 05-16 15:34 449次阅读
    大公开!用Air780EPM重构水质COD监测,替代<b class='flag-5'>STM32+4G</b>模组的技术路径

    使用Hal库的SPI读取磁边传感器导致STM32G4无法运行怎么解决?

    使用 HAL库 STM32G431 + SPI ,读取磁边传感器系统运行一会直接卡死,使用调试功能最后发现卡死在if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE
    发表于 03-14 08:24

    STM32G4串口无法发送正确的信息是怎么回事?

    STM32G4串口无法发送正确的信息
    发表于 03-14 07:14

    stm32g474 hrtim中怎么使用dual channel DAC trigger?

    stm32g474 hrtim 中怎么使用 dual channel DAC trigger
    发表于 03-12 07:33

    STM32G4 CAN为什么无法检测到bus-off状态?

    我将STM32G473的板子配置了CAN,并周期发送了报文,使用USBCANFD-200U进行了接收。 1、起先在CAN盒子的接口处直接对总线CAN-H和CAN-L进行短接,发现无法进入
    发表于 03-11 07:46

    STM32和MCP2515通信,STM32这端还需要接CAN PHY吗?

    最近在做CAN通信的相关项目,STM32G4负责接收,对端是一个MCP2510+TJA1040的组合, 想问下应该如何接?STM32这端还需要接CAN PHY吗?
    发表于 03-10 06:18

    STM32G474的DAC4无输出怎么解决?

    STM32G474 的DAC4采用定时器4触发dma,OUT1连接到比较器5,测试下来 DAC4没输出,是配置哪里有问题吗 定时器4的配置:
    发表于 03-07 06:06

    掌握4G模组PWM|技术精要

    今天要讲的是4G模组PWM的技术精要,以常用的合宙Air724UG为例做出示例分享给大家。
    的头像 发表于 12-14 09:40 1719次阅读
    掌握<b class='flag-5'>4G</b>模组PWM|技术精要