IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STM32G4芯片的DAC应用示例 -> 正文阅读

[嵌入式]基于STM32G4芯片的DAC应用示例

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

====================

往期话题阅读链接【点击即可阅读】:

1、STM32G4片内不同空间运行代码的速率比较

2、STM32高精度定时器定时单元间的同步问题

3、STM32 DMAMUX DMA同步事件的应用示例

4、通过STM32外部中断触发DMA传输

5、一个跟Cache有关的通信应用异常话题

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-13 09:25:42  更:2021-09-13 09:27:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 19:35:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码