STM32 使用DAC和DMA输出任意波形

绿叶何时落水

电赛代码备份,展示不做解释。

简单思路,利用的是DMA2的DAC1的专用通道来将数组里的波形数据放到DAC1的寄存器里。

定时器的TIM_SelectOutputTrigger来控制DAC的输出频率(DAC_InitType.DAC_Trigger = DAC_Trigger_T2_TRGO; )

1.DAC1的初始化

void Dac2_Init()
{
		GPIO_InitTypeDef GPIO_InitStructure;
    DAC_InitTypeDef DAC_InitType;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); 

    DAC_DeInit(); 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_SetBits(GPIOA, GPIO_Pin_4);

    DAC_StructInit(&DAC_InitType); 
    DAC_InitType.DAC_Trigger = DAC_Trigger_T2_TRGO; 
    DAC_InitType.DAC_WaveGeneration = DAC_WaveGeneration_None; 
    DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; 
    DAC_InitType.DAC_OutputBuffer = DAC_OutputBuffer_Disable; 
    DAC_Init(DAC_Channel_1, &DAC_InitType); 
    DAC_Cmd(DAC_Channel_1, ENABLE); 
    DAC_DMACmd(DAC_Channel_1, ENABLE); 
}

2.定时器2的初始化

void TIM_Config()
{
    u16 arr = 5; 
    u16 psc = 35; 
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 

    TIM_DeInit(TIM2); 
		TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); 
    TIM_TimeBaseStructure.TIM_Period = arr;
    TIM_TimeBaseStructure.TIM_Prescaler = psc;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update); 
}

3.DMA2的初始化

void MYDMA_Config(u32 cpar, u32 cmar, u16 cndtr) 
{
    DMA_InitTypeDef DMA_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); 

    DMA_DeInit(DMA2_Channel3); 

    DMA_StructInit(&DMA_InitStructure);
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; 
    DMA_InitStructure.DMA_BufferSize = cndtr; 
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; 
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; 
    DMA_InitStructure.DMA_Priority = DMA_Priority_High; 
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; 
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; 
    DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; 
    DMA_InitStructure.DMA_MemoryBaseAddr = cmar; 

    DMA_Init(DMA2_Channel3, &DMA_InitStructure);
    DMA_Cmd(DMA2_Channel3, ENABLE); 
}

主函数及一些相关变量的定义

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
void Dac2_Init(void);
void Dac_Init(void);
void DACW (u16 data);
void TIM3_IRQHandler(void);
void MYDMA_Config(u32 cpar, u32 cmar, u16 cndtr);
void Key(void);
void out_sin(void);
void TIM_Config(void);
void reset_all(void);
int i = 0, key = 0, A = 0, Hz = 999;
unsigned short p = 0;
int istrue = 0;
unsigned short SIN[100] = {120, 127, 135, 142, 149, 157, 164, 171, 177, 184, 190, 196, 202, 207, 212, 217, 221, 225, 228, 
									231, 234, 236, 237, 239, 239, 239, 239, 239, 237, 236, 234, 231, 228, 225, 221, 217, 212, 207, 202, 196, 190, 184, 
									177, 171, 164, 157, 149, 142, 135, 127, 120, 112, 104, 97, 90, 82, 75, 68, 62, 55, 49, 43, 37, 32, 27, 22, 18, 14,
									11, 8, 5, 3, 2, 0, 0, 0, 0, 0, 2, 3, 5, 8, 11, 14, 18, 22, 27, 32, 37, 43, 49, 55, 62, 68, 75, 82, 90, 97, 104, 112};
unsigned short Wave[100] = {0, 2, 5, 7, 10, 12, 15, 17, 20, 22, 25, 28, 30, 33, 35, 38, 40, 43, 45, 48, 51, 53, 56, 58, 61, 63, 66, 68, 71, 73, 76, 79, 
									81, 84, 86, 89, 91, 94, 96, 99, 102, 104, 107, 109, 112, 114, 117, 119, 122, 124, 127, 130, 132, 135, 137, 140, 142, 145, 147, 
									150, 153, 155, 158, 160, 163, 165, 168, 170, 173, 175, 178, 181, 183, 186, 188, 191, 193, 196, 198, 201, 204, 206, 209, 211, 
									214, 216, 219, 221, 224, 226, 229, 232, 234, 237, 239, 242, 244, 247, 249, 252};
unsigned short Square[100] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
										0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255,
										255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
										255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2000};
unsigned short Wave2[100] = {255, 252, 249, 247, 244, 242, 239, 237, 234, 232, 229, 226, 224, 221, 219, 216, 214, 211, 209, 206, 204, 201,
										198, 196, 193, 191, 188, 186, 183, 181, 178, 175, 173, 170, 168, 165, 163, 160, 158, 155, 153, 150, 147, 145, 
										142, 140, 137, 135, 132, 130, 127, 124, 122, 119, 117, 114, 112, 109, 107, 104, 102, 99, 96, 94, 91, 89, 86, 
										84, 81, 79, 76, 73, 71, 68, 66, 63, 61, 58, 56, 53, 51, 48, 45, 43, 40, 38, 35, 33, 30, 28, 25, 22, 20, 17, 15,
										12, 10, 7, 5, 2};
unsigned short I[100] = {2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040};										
int main(void)
{
	int i = 0;
	for(i = 0; i < 100; i++) {
		SIN[i] = SIN[i]*10;
	}
		
		DAC_Cmd(DAC_Channel_1, DISABLE);
    DAC_DMACmd(DAC_Channel_1, DISABLE);
    DMA_Cmd(DMA2_Channel3, DISABLE);
    TIM_Cmd(TIM2, DISABLE);
    TIM_Config();
    Dac2_Init();
    MYDMA_Config( (u32) & (DAC->DHR12R1), (u32)SIN, 100);
    TIM_Cmd(TIM2, ENABLE);
	
	while(1)
	{
	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红叶落水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值