OpenEdv-开源电子网

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

STM32H743的DAC+DMA无数据输出?请大神看一下!

[复制链接]

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-6-4
在线时间
13 小时
发表于 2019-9-17 19:31:40 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 韩同学叫园园 于 2019-9-18 17:18 编辑

//TIM2  DAC1通道1  DMA1_Stream5;通道7   APB1=100MHZ  
#include "da.h"
#include "para.h"

TIM_HandleTypeDef                           TimHandle;         //配置定时器
TIM_HandleTypeDef                                         TIM2_Handler;      //定时器句柄
TIM_MasterConfigTypeDef             master_timer2_config;

DAC_HandleTypeDef DAC1_Handler; //DAC句柄
DAC_ChannelConfTypeDef DACCH1_Config;//DAC1通道1

static DMA_HandleTypeDef             hdma_dac1;

void DA_DMA_INIT(void)
{
//定时器2  配置---------------------------------------------------------------------------------
    int p;
    HAL_TIM_Base_Start(&TimHandle);//定时器开始
    __HAL_RCC_TIM2_CLK_ENABLE();   //使能TIM2时钟  APB1=100MHZ
        
     //currentFrequency=20000指的是 电流调制频率为20khz     daCount=140指的是 DA的采样点数
        
    p=100000000/(daCount*currentFrequency);        
        TimHandle.Instance = TIM2;
        TimHandle.Init.Period = p-1;    //arr自动重装载值
        TimHandle.Init.Prescaler = 5000-1;   //定时器分频
        TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;//时钟分频因子
    TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数模式
        
        master_timer2_config.MasterOutputTrigger = TIM_TRGO_UPDATE;//选择定时器2触发,更新触发
        HAL_TIMEx_MasterConfigSynchronization(&TimHandle,&master_timer2_config);        

        HAL_TIM_Base_Init(&TimHandle);//初始化定时器2
        HAL_TIM_Base_Start_IT(&TimHandle); //使能定时器2和定时器2更新中断:TIM_IT_UPDATE   
        
        
//        ---------------------------------------------------------------------------------------
//DAC 配置
  HAL_DAC_Init(&DAC1_Handler);                       //初始化DAC
  DAC1_Handler.Instance = DAC1;

  DACCH1_Config.DAC_Trigger = DAC_TRIGGER_T2_TRGO;//定时器2触发,EN=1
  DAC1->CR|=0<<6;                        //WAVE1[1:0]=0,不使用波形发生
  DACCH1_Config.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;//DAC输出缓存关闭
  HAL_DAC_ConfigChannel(&DAC1_Handler, &DACCH1_Config, DAC_CHANNEL_1);//初始化DAC通道1

  HAL_DAC_Start(&DAC1_Handler,DAC_CHANNEL_1);  //开启DAC通道1

  }

//        ---------------------------------------------------------------------------------------
//GPIO和DMA1配置
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{
    GPIO_InitTypeDef GPIO_Initure;
        
    __HAL_RCC_DAC12_CLK_ENABLE();      //使能DAC时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟
    __HAL_RCC_DMA1_CLK_ENABLE();           //开启DMA1时钟

    GPIO_Initure.Pin=GPIO_PIN_4;            //PA4
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
    GPIO_Initure.Pull=GPIO_PULLDOWN;          //下拉
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);

        hdma_dac1.Instance = DMA1_Stream5;
        hdma_dac1.Init.Request  = DMA_REQUEST_DAC1_CH1;
        hdma_dac1.Init.Direction = DMA_MEMORY_TO_PERIPH;//存储器到外设
        hdma_dac1.Init.PeriphInc = DMA_PINC_DISABLE;//外设增量模式
        hdma_dac1.Init.MemInc = DMA_MINC_ENABLE;//存储器增量模式
        hdma_dac1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;//外设数据长度16位
        hdma_dac1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;//存储器数据长度16位
        hdma_dac1.Init.Mode = DMA_CIRCULAR;//使用循环模式
        hdma_dac1.Init.Priority = DMA_PRIORITY_HIGH;//高等优先级
        hdma_dac1.Init.FIFOMode=DMA_FIFOMODE_ENABLE; //fifo使能
        hdma_dac1.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_HALFFULL;//阈值选择FIFO容量的1/2
        hdma_dac1.Init.MemBurst=DMA_MBURST_SINGLE; //存储器突发单次传输
        hdma_dac1.Init.PeriphBurst=DMA_PBURST_SINGLE; //外设突发单次传输
        
    HAL_DMA_DeInit(&hdma_dac1);
        HAL_DMA_Init(&hdma_dac1);
        
        __HAL_LINKDMA(hdac,DMA_Handle1,hdma_dac1);
       
        __HAL_RCC_DMA1_CLK_ENABLE();//使能dma时钟
        HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2 );//分组2
        HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);//设置中断优先级,抢占优先级0,子优先级0,dma中断
        HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);//开启DMA1中断
        

        __HAL_DMA_ENABLE_IT(&hdma_dac1,DMA_IT_TC); //使能中断  
        HAL_DAC_Start_DMA(&DAC1_Handler,DAC_CHANNEL_1,(uint32_t *)&table[daCount],140, DAC_ALIGN_12B_R);//开启DAC的DMA
}

//函数功能: DAC反初始化配置
//void HAL_DAC_MspDeInit(DAC_HandleTypeDef *hdac)
//{
//        __HAL_RCC_DAC12_FORCE_RESET();
//        __HAL_RCC_DAC12_RELEASE_RESET();
//        HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4);
//        HAL_DMA_DeInit(hdac->DMA_Handle1);
//}
//--------------------------------------


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-9-18 01:36:37 | 显示全部楼层
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-6-4
在线时间
13 小时
 楼主| 发表于 2019-9-18 09:14:10 | 显示全部楼层
本帖最后由 韩同学叫园园 于 2019-9-18 17:22 编辑

主函数
#include <stm32h7xx.h>
#include "stdio.h"
#include "string.h"
#include "stdbool.h"
#include "math.h"
#include "delay.h"
//#include "sdram.h"
#include "setting.h"
#include "para.h"
#include "sci.h"
#include "gpio.h"
#include "lcd19264.h"
#include "phaseCalculate.h"
#include "da.h"
//信号调制变量-----------------------------------------------------------------------------
uint16_t table[daCount];        //定义DA缓冲区  
uint16_t tableK[adCount];  //定义幅值矫正系数

int g, B, K, M;
double k;

volatile uint8_t DA_DMA_CONVEND;//DA缓冲区溢出状态标志位,表示激光器调制完成一个周期
int mode=0;                     //工作模式 0:连续调制和采样, 1:停止调制和采样、并输出采样数据
int updateTable=0;
int y[SampNmb];                             //调制波形插值点纵坐标       SampNmb=11                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
int x[SampNmb];                             //调制波形插值点横坐标     
int x_Default[SampNmb];
int x_Backup[SampNmb];

//硬件层变量------------------------------------------------------------------------------
volatile int PingPang;          //乒乓操作标识,0:取前半段数据,1:取后半段数据

uint16_t adc0Buffer[adCountX2]={0};  //第一路AD乒乓采样缓冲区
uint16_t adc1Buffer[adCountX2]={0};  //第二路AD乒乓采样缓冲区

#ifdef threeChannel
uint16_t adc2Buffer[adCountX2]={0};  //第三路AD乒乓采样缓冲区
#endif

int unit=0;                    //单位: 0-nm, 1-um, 2-mm
unsigned char buf[50];
int bufLen;
int bufInd;

//函数声明--------------------------------------------------------------------------------
void initPara(void);
void InitTable(int n, int a[], int b[], uint16_t table[]);
void displayInit(void);
void showData(int64_t relativeDis[],int chnCnt);
void keyProcess(void);
void DMA1_Stream5_IRQHandler(void);

int main()
        
{        
               
        Cache_Enable();                                        //打开L1-Cache
        HAL_Init();                                                        //初始化HAL库
        Stm32_Clock_Init(160,5,2,4);                      //设置时钟,400Mhz
        delay_init(400);                                                //延时初始化
        uart_init(115200);                                                //串口初始化
//        SDRAM_Init();                                   //初始化SDRAM

        initPara();                      //DA节点、幅值矫正系数初始化
        InitTable(SampNmb, x, y, table); //初始化DA缓冲区
        DA_DMA_INIT( );//da初始化

      HAL_DAC_Start_DMA(&DAC1_Handler,DAC_CHANNEL_1,(uint32_t *)&table,140, DAC_ALIGN_12B_R);//开启DAC的DMA
        
}//---------------------------------------------------------------------------------------

void initPara()                    //全局变量的初始化,防止全局变量的初值赋值失败
{       
                int i;
                int deltaX=daCount/(SampNmb-1);
                int deltaY=DaMax/(SampNmb-1);
                       
                for(i=0;i<SampNmb;i++)
                {
                        x=i*deltaX;
                        y=i*deltaY;
                }

                x[SampNmb-1]=daCount-1;       //3999;
                y[SampNmb-1]=0;   

                for ( i=0; i<SampNmb; i++)
                {               
                        x_Default=x;
                        x_Backup=x;
                }
               
                g = 1800;                //400*9/2
                K = 150;                         //压缩0.15倍
                k = K*0.001;
                B = 1638;             //0.06*20*4096/3
                mode = 1;
                PingPang = 1;
                updateTable = 0;
               
                //初始化数据处理函数
                resetDistance(0);
                resetDistance(1);
                resetDistance(2);
}
//---------------------------------------------------------------------------------------
void InitTable(int n, int a[], int b[], uint16_t table[])
{
                int i,j;
                int Dx;                        //两采样点之间间隔
    double Dy;                     //两采样点之间幅值差  
    double dy;                     //插入点幅值步长
    int temp;
    for(i=0;i<n;i++)
    {   
                        Dx=a[i+1]-a;            
      Dy=b[i+1]-b;               
      dy=Dy/Dx;                 
      table[a]=(int)(k*(b-g))+B;       //左起点
      for( j=1;j<Dx;j++)
      {   
                                temp=(b+dy*j);
                                table [a+j]=(int)(k*(temp-g))+B;  //插入点量化幅值
      }
    }
    table[a[n-1]]=(int)(k*(b[n-1]-g))+B;     //右端点               
}       
//----------------------------------------------------------------------------------------






回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-6-4
在线时间
13 小时
 楼主| 发表于 2019-9-18 17:14:52 | 显示全部楼层
现在DAC的DHR12RD 和 DOR1寄存器一直没有数值怎么回事?求助原子哥
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-6-4
在线时间
13 小时
 楼主| 发表于 2019-9-19 09:52:19 | 显示全部楼层
有人吗
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2019-4-3
在线时间
40 小时
发表于 2019-10-28 17:23:38 | 显示全部楼层
我之前看过一个帖子,http://bbs.21ic.com/icview-2623674-1-1.html,里面寄存器地址设置前面必须加const,你试试
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-12 12:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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