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

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

    关注

    455

    文章

    50780

    浏览量

    423449
  • dac
    dac
    +关注

    关注

    43

    文章

    2292

    浏览量

    191032
  • STM32
    +关注

    关注

    2270

    文章

    10899

    浏览量

    355887

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

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

收藏 人收藏

    评论

    相关推荐

    请问stm32g431rbt怎么显示汉字?

    stm32g431rbt怎么显示汉字
    发表于 07-22 07:27

    使用CubeMX配置生成STM32G431的工程文件,怎么设置?

    看代码里面生成的默认就是双bank模式,如果想修改为单bank模式,应该怎么呢?
    发表于 07-05 08:08

    stm32g431cbu6 DAC DAC_CHANNEL_1无法输出电压的原因?

    一个很简单的问题,我的 DAC DAC_CHANNEL_1无法输出电压。 1.首先我的ioc配置界面如下: 2.初始化代码如下: / USER CODE BEGIN Header
    发表于 05-20 07:27

    STM32G431无法仿真的原因?

    大家好,因为没有示波器,所以只能用MDK看一下G431的IO口波形,但是配置一直不成功,提示找不到该引脚。。。 芯片型号是对的,这个是什么原因
    发表于 04-12 07:46

    STM32G431开发板烧完官方程序后STLINK连不上怎么解决?

    板子是STM32G431RB系列的开发板,昨天用其他IDE烧了程序还好。 今天用CubeMX生成了一个官方提供的例程,烧进去之后就不得行了。 打开设备管理器,还是能看到ST-LINK Debug
    发表于 03-29 09:19

    STM32F302K8U6和STM32G431中内置的运放 建立时间是多长?

    STM32F302K8U6 和STM32G431 中内置的运放 建立时间是多长? 在手册中未找到相关描述
    发表于 03-28 08:36

    STM32G431的ADC数据不准确是什么原因导致的?

    我在一个STM32G431的核心板上的测试工程. 使用 ADC1,TIM1,DMA1 实现的 ADC多通道定时采集工程. ADC进行了校准, 采集了Vrefint通道. 通过 Vrefint通道
    发表于 03-26 08:22

    STM32L431 ADC to DAC时间久了时钟不同步是哪里的问题?

    我在用STM32L431做一个音频相关的项目。 我是用Timer6 设置32Khz ADC 采样,然后把采样点降采样到4Khz后,然后输出到DAC同步输出。DAC用Timer7设置 4Khz
    发表于 03-26 06:32

    配置STM32G431的FDCAN为普通CAN模式,为什么不能接收数据?

    我这边配置STM32G431的FDCAN为普通CAN模式,配置如下,发送数据是成功的,其他板子也可以接收到发送的数据,但是G431却不能接收数据,帮忙看一下是什么问题,谢谢。
    发表于 03-25 08:31

    stm32g431的PG10-NRST可以当普通IO吗?怎么设置?

    stm32g431的PG10-NRST可以当普通IO吗,怎么设置。
    发表于 03-20 08:09

    STM32G431无法输出项目工程的原因?

    系统为 Win 7 64位,安装的Cube MX版本为6.8.0,现在需要用STM32G431开发工程,已经安装好了1.50版本的Package包文件,现在的问题是无法输出项目工程,输出工程的时候
    发表于 03-15 07:52

    STM32CubeMX stm32g431 PLLP无法被设置是怎么回事?

    打扰了,没问题!ADC得设置成异步时钟! 使用了STM32CubeMX(6.9.1)开发stm32g431时,用cube配置始终,PLLP始终无法设置。我已启用了ADC1和ADC2,我想使用PLLP作为ADC12的时钟输入,但是框框是灰色。
    发表于 03-14 06:43

    STM32L431主频80MHZ,DAC输出2V左右,一直开着ADC或者一直开着DAC谁更耗电?

    STM32L431主频80MHZ,DAC输出2V左右。
    发表于 03-11 07:25

    STM32G474的DAC4无输出怎么解决?

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

    STM32G431RB在使用软件生成代码过程中报错怎么解决?

    在使用软件生成代码过程中报错,使用但是STM32G431RB 的开发板
    发表于 03-06 06:15