打印
[STM32F1]

DAC+DMA

[复制链接]
402|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
19996|  楼主 | 2021-3-17 10:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DMA, DAC, ni, IO, pi
const u32 Beatwave1[]={4095,4095,4095};
void Dac2_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        DAC_InitTypeDef DAC_InitType;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );          //使能PORTA通道时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );          //使能DAC通道时钟

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                 // 端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //模拟输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_5)        ;//PA.5 输出高
                                       
        DAC_InitType.DAC_Trigger=DAC_Trigger_None;        //不使用触发功能 TEN1=0
        DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
        DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置
        DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;        //DAC1输出缓存关闭 BOFF1=1
  DAC_Init(DAC_Channel_2,&DAC_InitType);         //初始化DAC通道1

        
        
        DAC_Cmd(DAC_Channel_2, ENABLE);  //使能DAC1

        
        
  DAC_SetChannel2Data(DAC_Align_12b_R, 1228);  //12位右对齐数据格式设置DAC值
        
        MYDMA_Config(DMA2_Channel4,(u32)DAC->DHR12R2,(u32)Beatwave1,sizeof(Beatwave1));
        DAC_DMACmd(DAC_Channel_2,ENABLE);
        MYDMA_Enable(DMA2_Channel4);
}

u16 DMA2_MEM_LEN;//保存DMA每次数据传送的长度            
//DMA1的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHxMA通道CHx
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输量
u16 DMA2_MEM_LEN;
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
        DMA_InitTypeDef DMA_InitStructure;
        
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);        //使能DMA传输
        
  DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值

        DMA2_MEM_LEN=cndtr;
        DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设基地址
        DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //数据传输方向,从内存读取发送到外设
        DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA通道的DMA缓存的大小
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //数据宽度为8位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度为8位
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //工作在正常模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //DMA通道 x拥有中优先级
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
        DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
                  
}
//开启一次DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
        DMA_Cmd(DMA_CHx, DISABLE );  //关闭USART1 TX DMA1 所指示的通道      
        DMA_SetCurrDataCounter(DMA_CHx,DMA2_MEM_LEN);//DMA通道的DMA缓存的大小
        DMA_Cmd(DMA_CHx, ENABLE);  //使能USART1 TX DMA1 所指示的通道
}         

上面是DAC和对应DMA的配置,现在感觉DMA没法正常工作起来

有谁知道为什么吗?

比较急,谢谢


使用特权

评论回复
沙发
sonicll| | 2021-3-17 13:33 | 只看该作者
DAC要使用DMA,必须使用外部触发,否则没有信号可以触发DMA传输。
DAC的GPIO脚要配置为模拟

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

139

帖子

0

粉丝