OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3462|回复: 1

dac+dma输出波形

[复制链接]

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-7-28
在线时间
6 小时
发表于 2016-7-28 15:20:22 | 显示全部楼层 |阅读模式
3金钱
谁有时间给帮忙看一下哪有问题啊?用的芯片是STM32F407ZG#include "sys.h"
#include "delay.h"  
#include "usart.h"
#include "arm_math.h"
#include "stm32f4xx.h"                  // Device header
#include "led.h"
#include "lcd.h"
#include "timer.h"
#include "adc.h"
#include "dac.h"
#include "math.h"
#include "dma.h"
#define SEND_BUF_SIZE 100
u16 SendBuff[SEND_BUF_SIZE];        //发送数据缓冲区

u32 timeout;
int main(void)
{     
  arm_cfft_radix4_instance_f32 scfft;
        u8 n=0;
        float fs=43750;
        float time,f=0,R=0;
        u16 dacval=1000; //PA4
        u16 i=0,u=0,x=0,t=0;
        float PA0=0,PA1=0;
       
        Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
        delay_init(168);                        //延时初始化  
        uart_init(84,115200);                //初始化串口波特率为115200
        LED_Init();                                        //初始化LED
        Dac_Init();        //初始化DAC
        for(i=0;i<100;i++)
                 {
                        SendBuff[i]=i+dacval;
                 }
  TIM4_Int_Init(5000-1,8400-1);
        MYDMA_Config(DMA1_Stream5,7,(u32)&DAC->DHR12R1,(u32)SendBuff,SEND_BUF_SIZE);//DMA1,STEAM5,CH7,外设DAC1,存储器为SendBuff,长度为:SEND_BUF_SIZE                    
        MYDMA_Enable(DMA1_Stream5,SEND_BUF_SIZE);//开始DMA传输         
                 

        while(1)
        {

       LED0=!LED0;
       }
    }

#include "dac.h"

//DAC通道1输出初始化
void Dac_Init(void)
{          
        RCC->APB1ENR|=1<<29;           //使能DAC时钟          
        RCC->AHB1ENR|=1<<0;          //使能PORTA时钟          
        GPIO_Set(GPIOA,PIN4,GPIO_MODE_AIN,0,0,GPIO_PUPD_PD);//PA4,模拟输入,下拉
       
  GPIO_Set(GPIOA,PIN5,GPIO_MODE_AIN,0,0,GPIO_PUPD_PD);//PA5,模拟输入,下拉       

        DAC->CR|=1<<0;        //使能DAC1
        DAC->CR|=1<<1;        //DAC1输出缓存不使能 BOFF1=1
        DAC->CR|=1<<2;        //不使用触发功能 TEN1=0
        DAC->CR|=5<<3;        //DAC TIM4 TRGO,不过要TEN1=1才行
        DAC->CR|=0<<6;        //不使用波形发生
        DAC->CR|=0<<8;        //屏蔽、幅值设置
        DAC->CR|=1<<12;        //DAC1 DMA使能   
        DAC->DHR12R1=0;                       
}


void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u8 chx,u32 par,u32 mar,u16 ndtr)
{
       
        DMA_TypeDef *DMAx;
        u8 streamx;
        u32 PAR;
        if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
        {
                DMAx=DMA2;
                RCC->AHB1ENR|=1<<22;//DMA2时钟使能
        }else
        {
                DMAx=DMA1;
                RCC->AHB1ENR|=1<<21;//DMA1时钟使能
        }
        while(DMA_Streamx->CR&0X01);//等待DMA可配置
        streamx=(((u32)DMA_Streamx-(u32)DMAx)-0X10)/0X18;                //得到stream数据流号
        if(streamx>=6)DMAx->HIFCR|=0X3D<<(6*(streamx-6)+16);        //清空之前该stream上的所有中断标志
        else if(streamx>=4)DMAx->HIFCR|=0X3D<<6*(streamx-4);    //清空之前该stream上的所有中断标志
        else if(streamx>=2)DMAx->LIFCR|=0X3D<<(6*(streamx-2)+16);//清空之前该stream上的所有中断标志
        else DMAx->LIFCR|=0X3D<<6*streamx;                                                //清空之前该stream上的所有中断标志
       
        PAR=par;
        DMA_Streamx->AR=PAR;                //DMA外设地址
        DMA_Streamx->M0AR=mar;                //DMA 存储器0地址
        DMA_Streamx->NDTR=ndtr;                //DMA 数据项数目
        DMA_Streamx->CR=0;                        //先全部复位CR寄存器值
       
       
        DMA_Streamx->CR|=1<<6;                //存储器到外设模式
        DMA_Streamx->CR|=0<<8;                //循环模式
        DMA_Streamx->CR|=0<<9;                //外设非增量模式
        DMA_Streamx->CR|=1<<10;                //存储器增量模式
        DMA_Streamx->CR|=1<<11;                //外设数据长度:16位
        DMA_Streamx->CR|=1<<13;                //存储器数据长度:16位
        DMA_Streamx->CR|=2<<16;                //高等优先级
        DMA_Streamx->CR|=0<<21;                //外设突发单次传输
        DMA_Streamx->CR|=0<<23;                //存储器突发单次传输
        DMA_Streamx->CR|=(u32)chx<<25;//通道选择
        //DMA_Streamx->FCR=0X21;        //FIFO控制寄存器
       
       
}
//开启一次DMA传输
//DMA_StreamxMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
//ndtr:数据传输量  
void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{
        DMA_Streamx->CR&=~(1<<0);         //关闭DMA传输
        while(DMA_Streamx->CR&0X1);        //确保DMA可以被设置  
        DMA_Streamx->NDTR=ndtr;                //DMA 存储器0地址
        DMA_Streamx->CR|=1<<0;                //开启DMA传输
       
}          



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-7-29 20:45:43 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 17:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表