DAC输出特定波形
我所做的任务是用stm32F4的DAC输出一段特定频率和形状的波。
简述过程:
DMA将一个存储器(在这里选用的是一个数组)和一个外设(在这里选择的是DAC)连接起来,接着只要使能,就可以完成DAC的输出了。可以将DAC输出的通道连接到示波器或者逻辑分析仪上查看所输出的波形。
下面我将其分为几个步骤。
- 初始化
- 配置DAC
- 配置DMA
- 写入波形形状
初始化
首先查找到能够作为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的输出频率了,而频率该怎么计算,大家可在网上查找或者看我的其他文章。
首先得说明一下,在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