普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 2575|回复: 2

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

[复制链接]

1

主题

2

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2021-2-3 21:43:17 | 显示全部楼层 |阅读模式
#include "dac.h"
#define DAC_DHR12RD_Addr        0x40007420/*(u32)&(DAC->DHR12RD)*/
__IO u32 DAC_DoubleChannel_Value[DAC_Len];

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的寄存器会是这个样子呢?只有一个工作,而且用示波器测两个通道都没有波形
求大佬能解决,类目



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

1

主题

2

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2021-2-3 22:31:06 | 显示全部楼层
怎么有人看没人回复啊QAQ
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-5-2 07:25 , Processed in 2.486186 second(s), 34 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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