TZBzi666 发表于 2021-2-3 21:43:17

求助,STM32 DAC双通道不工作不知如何解决

#include "dac.h"
#define DAC_DHR12RD_Addr      0x40007420/*(u32)&(DAC->DHR12RD)*/
__IO u32 DAC_DoubleChannel_Value;

void DACx_Init(uint16_t ARR,uint16_t PSC)
{
    GPIO_InitTypeDef            GPIO_InitStructure;
    DAC_InitTypeDef             DAC_InitStructure;
    TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
    DMA_InitTypeDef             DMA_InitStructure;
    /*-----------------------------------------------------------*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    /*-----------------------------------------------------------*/
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
    //为了避免寄生干扰和额外的功耗,采用模拟输入的方式
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    /*-----------------------------------------------------------*/
    TIM_TimeBaseStructure.TIM_Period = ARR;               
    //arr:自动重装值。
    TIM_TimeBaseStructure.TIM_Prescaler = PSC;            
    //psc:时钟预分频数
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;         
    //选择默认不分频   
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    //向上计数模式
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
    //初始化TIM4
    TIM_SelectOutputTrigger(TIM4,TIM_TRGOSource_Update);
    //选择为TIM4事件更新
    TIM_Cmd(TIM4,ENABLE);
    //使能定时器4
    /*-----------------------------------------------------------*/
    DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Addr;                                       
    // DAC数据寄存器地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DAC_DoubleChannel_Value;                                                
    // 内存地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                                    
    //从内存发送数据到外设
    DMA_InitStructure.DMA_BufferSize = DAC_Len;                                                            
    // 一个周期内的点数,即DMA传输数量
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;      
    //外设地址不变
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                           
    //内存地址自增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Word;   
    // 传输宽度32 bit 一个字
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                          
    //DMA 传输模式-循环模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                 
    //DMA 优先级-高
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                                
    //关闭内存到内存模式
    DMA_Init(DMA2_Channel4, &DMA_InitStructure);                                                
    //DMA初始化函数
    DMA_Cmd(DMA2_Channel4,ENABLE);
    /*-----------------------------------------------------------*/
    DAC_InitStructure.DAC_Trigger=DAC_Trigger_T4_TRGO;                                                
    // DAC触发方式tim4   
    DAC_InitStructure.DAC_WaveGeneration=DAC_WaveGeneration_None;                           
    // 不采用波形发生模式
    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;                        
    //输出缓冲不使能,若使能则小于0.5V的波形无法输出
    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;      
    //选择不产生噪声
    DAC_Init(DAC_Channel_1, &DAC_InitStructure);                                          
    // DAC通道1初始化
    DAC_Init(DAC_Channel_2, &DAC_InitStructure);                                          
    // DAC通道2初始化
    DAC_Cmd(DAC_Channel_1,ENABLE);
    //使能DAC通道1
    DAC_Cmd(DAC_Channel_2,ENABLE);
    //使能DAC通道2
//    DAC_DMACmd(DAC_Channel_1,ENABLE);
//    //打开DAC通道1的DMA使能
    DAC_DMACmd(DAC_Channel_2,ENABLE);
    //打开DAC通道2的DMA使能
    /*-----------------------------------------------------------*/
}
#ifndef _dac_h_
#define _dac_h_
/************************************/
#include "stm32f10x.h"
#include "system.h"
#include "systick.h"
#include "usart.h"
/************************************/
extern __IO u32 DAC_DoubleChannel_Value[];
#define DAC_Len                  10
#define WAVE_SINE                0
#define WAVE_RAMP                1
#define WAVE_SQUARE             2
#define WAVE_TRIANGLE            3
/************************************/
void DACx_Init(uint16_t ARR,uint16_t PSC);
void DAC_OutputU16Signal(u16 temp[],u8 Wave_Mode,u16 len,u16 vpp);
void DAC_OutputU32Signal(void);
/************************************/
#endif

#include "stm32f10x.h"
#include "systick.h"
#include "system.h"
#include "usart.h"
#include "led.h"
#include "dac.h"
u16 vpp_max=3300;
/************************************/
/************************************/
int main(void)
{
    SysTick_Init(72);                                                                  
    //延时初始化
    USARTx_Init(115200);                                                            
    //串口初始化
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      
    //中断优先级分组
    LED_Init();
    DACx_Init(36-1,1-1);
    DAC_OutputU32Signal();
    LED1=1;
    LED2=1;
    while(1)
    {
    }
}
程序如上,理论上来说,我将u32的数据通过DMA传输到DHR12RD这个寄存器,即可以在三个周期内将u32数据存入DOR1和DOR2,从而产生双通道的波形。
但是我通过调试发现:

为什么DAC的寄存器会是这个样子呢?只有一个工作,而且用示波器测两个通道都没有波形
求大佬能解决,类目



TZBzi666 发表于 2021-2-3 22:31:06

怎么有人看没人回复啊QAQ
页: [1]
查看完整版本: 求助,STM32 DAC双通道不工作不知如何解决