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

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

3天内不再提示

如何使用STM32G431芯片做DAC应用

茶话MCU 来源:茶话MCU 作者:Miler 2021-09-12 10:08 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

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

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

使用CubeMx进行配置

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

#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的配置像下面这样也是可以的。

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

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的数据保持寄存器赋值,参考配置及实现代码如下:

相关用户代码如下:

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

责任编辑:haq

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

    关注

    463

    文章

    54484

    浏览量

    469863
  • dac
    dac
    +关注

    关注

    44

    文章

    2856

    浏览量

    197679
  • STM32
    +关注

    关注

    2313

    文章

    11196

    浏览量

    374791

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    探索纳祥科技NX8420,一款I2S数字转模拟内置DAC #电路知识 #DAC #国产芯片

    dac
    深圳市纳祥科技有限公司
    发布于 :2026年01月28日 15:02:17

    CW32L012与STM32G431的CORDIC三角函数运算性能对比

    本文对比均为作者实测,结果仅供参考,可附代码供有意者评估~ STM32G431STM32家族中较新的产品。CW32L012也是武汉芯源半导体最新推出的混合信号MCU,让我们深入分析基于各自芯片
    的头像 发表于 12-29 15:55 2837次阅读
    CW32L012与<b class='flag-5'>STM32G431</b>的CORDIC三角函数运算性能对比

    【瑞萨RA6E2】ADC、DAC 电压输入输出

    软件上如下配置: 再配置 Stacks,如下: 导出代码后,使用以下代码使用 DAC 输出指定电压: fsp_err_t err = R_DAC_Open(&
    发表于 11-10 01:29

    EVSPIN32G4-DUAL双电机驱动演示板技术解析

    9mm x 9mm VFQFPN封装,三重高性能半桥栅极驱动器(具有丰富的可编程特性)和一个混合信号STM32G431微控制器中。STDRIVE101是一款三半桥栅极驱动器,采用紧凑型4mm x 4mm VFQPN封装,具有600mA电流能力和嵌入式保护功能。
    的头像 发表于 10-23 10:57 794次阅读
    EVSPIN32<b class='flag-5'>G</b>4-DUAL双电机驱动演示板技术解析

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

    软件上如下配置: 再配置 Stacks,如下: 导出代码后,使用以下代码使用 DAC 输出指定电压: fsp_err_t err = R_DAC_Open(&
    发表于 10-17 00:06

    ‌基于STSPIN32G4的伺服驱动参考设计技术解析

    EVLSERVO1采用系统级封装的STSPIN32G4,三个高性能半桥栅极驱动器(具有可编程特性)、一个STM32G431微控制器,以及生成所需内部电源的高级电源管理都结合在一个封装中。该器件采用9mm x 9mm VFQFPN封装。该设计通过堆叠电源和控制板实现了5
    的头像 发表于 10-16 17:31 1184次阅读
    ‌基于STSPIN32<b class='flag-5'>G</b>4的伺服驱动参考设计技术解析

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

    软件上如下配置: 再配置 Stacks,如下: 导出代码后,使用以下代码使用 DAC 输出指定电压: fsp_err_t err = R_DAC_Open(&g_dac
    发表于 10-14 09:47

    为什么不同芯片型号的串口开启DMA编译结果不同?

    这是STM32F103打开串口DMA的编译结果 这是STM32G431的编译结果: G431会有七个报错,显示的都是IRQn未声明
    发表于 09-23 06:42

    RT Thread Studio新建STM32L431RCTx工程,串口无输出怎么解决?

    又遇到这种鬼问题,采用RT Thread Studio新建了thread通用项目,内核版本为5.0.2,芯片型号为STM32L431RCTx,芯片包为0.1.9,建好工程后,程序可以正常运行,写的闪
    发表于 09-16 07:24

    stm32g431使用pwm设备出现报错怎么解决?

    配置完pwm设备后出现一下报错
    发表于 09-10 06:33

    STM32L431偶发串口乱码的原因?怎么解决?

    项目现场发现有些设备有时下发数据没反应,该设备由STM32L431外接模块来接收网络数据。经过排查,发现乱码发生时,外接设备发出的数据无乱码,STM32L431的对应该外接设备的串口中断服务程序
    发表于 06-19 06:46

    请问STM32G431内部运放1和2输出连接的ADC为什么不是OPAMP?

    请问下大家,STM32G431 芯片UVW三相的电流检测,配置使用内部运放PGA,看到G431-ESCdemo板对应motor workbench配置,为什么UV相的运放输出分别是ADC1 3通道
    发表于 06-10 07:39

    请问STM32G431内部运放1和2输出连接的ADC为什么不是OPAMP?

    请问下大家,STM32G431 芯片UVW三相的电流检测,配置使用内部运放PGA,看到G431-ESCdemo板对应motor workbench配置,为什么UV相的运放输出分别是ADC1 3通道
    发表于 06-06 07:47

    昂科烧录器支持ST意法半导体的主流微控制器STM32G431KBT

    作为芯片烧录行业的领导者,昂科技术近期重磅发布烧录软件的全新版本。随着此次迭代升级,昂科技术还披露了一批新适配的芯片型号。值得关注的是,意法半导体研发的 STM32G431KBT主流微控制器已顺利
    的头像 发表于 05-14 11:33 1842次阅读
    昂科烧录器支持ST意法半导体的主流微控制器<b class='flag-5'>STM32G431</b>KBT

    请问STM32G431内部运放1和2输出连接的ADC为什么不是OPAMP?

    请问下大家,STM32G431 芯片UVW三相的电流检测,配置使用内部运放PGA,看到G431-ESCdemo板对应motor workbench配置,为什么UV相的运放输出分别是ADC1 3通道
    发表于 05-14 08:12