使用DMA使DAC输出特定波形

DAC输出特定波形

我所做的任务是用stm32F4DAC输出一段特定频率和形状的波。

简述过程:

DMA将一个存储器(在这里选用的是一个数组)和一个外设(在这里选择的是DAC)连接起来,接着只要使能,就可以完成DAC的输出了。可以将DAC输出的通道连接到示波器或者逻辑分析仪上查看所输出的波形。
下面我将其分为几个步骤。

  • 初始化
  • 配置DAC
  • 配置DMA
  • 写入波形形状

初始化

  • 配置DAC

首先查找到能够作为DAC的串口(在这里我选择的是PA4),接着分别使能所选择的串口和DAC。
下图是各引脚的复用功能,这里我选择的就是PA4的DAC1-OUT。
在这里插入图片描述
第一步是使能刚刚所选择的引脚

GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitType;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//此处选择模拟输出,模拟输入或者其它都可以。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //这里选择什么也都可以,不必纠结。
GPIO_Init(GPIOA, &GPIO_InitStructure);//完成GPIOA的初始化。

完成了引脚的初始化,接着就是DAC的配置了。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//使能DAC的时钟 
DAC_InitType.DAC_Trigger=DAC_Trigger_T2_TRGO; //选择DAC的触发方式,这里选择的是定时器2,也就意味着对定时器2的配置就完成了DAC输出频率的配置。  
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不产生波形
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽幅值设置  
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1输出缓存关闭
 DAC_Init(DAC_Channel_1,&DAC_InitType);  //初始化DAC通道1,只是普通的输出通道,不用在意为什么选通道一。
 DAC_Cmd(DAC_Channel_1, ENABLE);  //使能DAC通道1,这一步特别重要!!!
  
  DAC_SetChannel1Data(DAC_Align_12b_R, 0);  //12位右对齐数据格式来设置DAC的值

然后记得在main函数里头加上定时器2的初始化使能!

TIM2_Int_Init(100-1,8400-1);//此处定时器2的频率就是DAC的输出频率了,而频率该怎么计算,大家可在网上查找或者看我的其他文章。
  • DMA配置

首先得说明一下,在stm32F4里头,DMA的配置是通过DMA的数据流和通道来配置的,而F1只是配置通道,但大致方法是差不多的。
此处DMA的初始化放在了一个函数里面。

void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{
    
 DMA_InitTypeDef  DMA_InitStructure;
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能
  DMA_DeInit(DMA_Streamx);//对通道和数据流的选择看下面的图

while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){
   }//等待DMA可配置 
  /* 配置 DMA Stream */
  DMA_InitStructure.DMA_Channel = chx;  //对通道和数据流的选择看下面的图
  DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMA所连接到的外设的地址,par我认为应该是Peripher
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值