OpenEdv-开源电子网

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

求大佬帮忙看下!!!STM32F767开发板DAC的DMA模式发送数据

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-1-8
在线时间
2 小时
发表于 2019-1-8 16:24:23 | 显示全部楼层 |阅读模式
1金钱

求大佬帮忙看下!!!STM32F767开发板DAC的DMA模式发送数据,单独DAC能够发送数据出去,走DMA通道后DAC一直没有数据出来,DMA寄存器状态正常,

DMA寄存器状态

DMA寄存器状态

但是DAC的寄存器中的DAC_DHR12R1一直没有数据,引脚也没哟数据出来。求大佬帮忙看下!

代码如下://要实现的功能就是将数组的数据通过DMA搬送到DAC出去
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
#include "usmart.h"
#include "dac.h"
#include "math.h"

#define DAC_SIN_SIZE    100         //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍.100
#define PI 3.1415962
u32 DAC_SIN_BUF[DAC_SIN_SIZE];  //发送数据缓冲区

//产生正弦波函序列,根据DAC_SIN_SIZE生成。
void dac_creat_sin_buf(void)
{
    u8 i;
    float inc=2*PI/DAC_SIN_SIZE;        //计算增量(一个周期DAC_SIN_BUF个点)
    float outdata=0;
    for(i=0;i<DAC_SIN_SIZE;i++)
    {
        outdata=2047*(1+sin(inc*i));    //计算以dots个点为周期的每个点的值,放大2048倍,并偏移到正数区域。
        DAC_SIN_BUF= (uint32_t)outdata;
    }  
}
DAC_HandleTypeDef DAC1_Handler;            //DAC句柄
DMA_HandleTypeDef DAC1TxDMA_Handler;      //DMA句柄
TIM_HandleTypeDef TIM2_Handler;            //定时器句柄

//初始化DAC
void DAC1_Init(void)
{
    DAC_ChannelConfTypeDef DACCH1_Config;
    DAC1_Handler.Instance=DAC;
    //DAC1_Handler.DMA_Handle1=&DAC1TxDMA_Handler;
    HAL_DAC_Init(&DAC1_Handler);                 //初始化DAC  
    DACCH1_Config.DAC_Trigger=DAC_TRIGGER_T2_TRGO;    /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */   
    DACCH1_Config.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE;//DAC1输出缓冲关闭
    HAL_DAC_ConfigChannel(&DAC1_Handler,&DACCH1_Config,DAC_CHANNEL_1);//DAC通道1配置
}

//DAC底层驱动,时钟配置,引脚 配置
//此函数会被HAL_DAC_Init()调用
//hdacAC句柄
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{      
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_DAC_CLK_ENABLE();             //使能DAC时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();                        //开启GPIOA时钟
       
    GPIO_Initure.Pin=GPIO_PIN_4;           //PA4
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
    GPIO_Initure.Pull=GPIO_PULLDOWN;         //不带上下拉
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}

//通用定时器2初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!(定时器3挂在APB1上,时钟为HCLK/2)
void TIM2_Init(u16 arr,u16 psc)
{  
    TIM2_Handler.Instance=TIM2;                          //通用定时器2
    TIM2_Handler.Init.Prescaler=psc;                     //分频
    TIM2_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
    TIM2_Handler.Init.Period=arr;                        //自动装载值
    TIM2_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
    HAL_TIM_Base_Init(&TIM2_Handler);
    HAL_TIM_Base_Start(&TIM2_Handler);      //Time Base Start
    __HAL_TIM_URS_ENABLE(&TIM2_Handler);
}

//定时器底册驱动,开启时钟
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM2)
    {
        __HAL_RCC_TIM2_CLK_ENABLE();            //使能TIM2时钟
    }  
}

//DMAx的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_StreamxMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
//chxMA通道选择,@ref DMA_channel DMA_CHANNEL_0~DMA_CHANNEL_7
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx)
{
        if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
        {
        __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能       
        }else
        {
        __HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
        }
    __HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
    __HAL_LINKDMA(&DAC1_Handler,DMA_Handle1,DAC1TxDMA_Handler);    //将DMA与DAC1联系起来(发送DMA)

    //Tx DMA配置
    DAC1TxDMA_Handler.Instance=DMA_Streamx;                            //数据流选择
    DAC1TxDMA_Handler.Init.Channel=chx;                                //通道选择
    DAC1TxDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存储器到外设
    DAC1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
    DAC1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
    DAC1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;    //外设数据长度:32位
    DAC1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;       //存储器数据长度:32位
    DAC1TxDMA_Handler.Init.Mode=DMA_CIRCULAR;                            //外设流控模式 DMA_NORMAL; DMA_CIRCULAR
    DAC1TxDMA_Handler.Init.Priority=DMA_PRIORITY_HIGH;               //高等优先级  DMA_PRIORITY_MEDIUM 中等优先级
    DAC1TxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    DAC1TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
    DAC1TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
    DAC1TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输

    HAL_DMA_DeInit(&DAC1TxDMA_Handler);   
    HAL_DMA_Init(&DAC1TxDMA_Handler);
}


//主程序
int main(void)
{
    u16 i;
    u16 adcx;
    float temp;
    u8 t=0;         
    u16 dacval=0;
    u8 key;       
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();                                        //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
    delay_init(216);                //延时初始化
    uart_init(115200);                        //串口初始化
    LED_Init();                     //初始化LED
    KEY_Init();                     //初始化按键
    SDRAM_Init();                   //初始化SDRAM
    LCD_Init();                     //LCD初始化
    //SCB_DisableDCache();

    TIM2_Init(5000-1,10800-1);      //定时器2初始化,定时器时钟为108M,分频系数为10800-1,
                                    //所以定时器2的频率为108M/10800=10K,自动重装载为5000-1,那么定时器周期就是500ms
    DAC1_Init();                    //初始化DAC1   
    MYDMA_Config(DMA1_Stream5,DMA_CHANNEL_7);//初始化DMA

    HAL_DAC_Start_DMA(&DAC1_Handler,DAC_CHANNEL_1, DAC_SIN_BUF, DAC_SIN_SIZE, DAC_ALIGN_12B_R)//开始发送

    while(1)
        {
                i++;
                delay_ms(10);
                if(i==20)
                {
                        LED0_Toggle;//提示系统正在运行       
                        i=0;
                }       
                            
        }

}

最佳答案

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

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-1-8
在线时间
2 小时
 楼主| 发表于 2019-1-8 16:24:24 | 显示全部楼层
本帖最后由 好烦shine 于 2019-1-9 22:49 编辑

已经解决了哈
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10566
金钱
10566
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-1-8 17:27:24 | 显示全部楼层
帮顶~~
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-1-11 20:14:39 | 显示全部楼层

楼主如何解决的,分享下问题点
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-1-8
在线时间
2 小时
 楼主| 发表于 2019-1-21 15:25:27 | 显示全部楼层
Timer的TRGO触发记得要开,然后就没问题了。
回复

使用道具 举报

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2019-1-18
在线时间
26 小时
发表于 2019-2-27 15:21:22 来自手机 | 显示全部楼层
请楼主指教  HAL库的TRGO触发函数是啥  找了半天没找到  f1标准库的知道是TIM_SelectOutputTrigger
回复

使用道具 举报

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2019-1-18
在线时间
26 小时
发表于 2019-3-1 10:15:29 来自手机 | 显示全部楼层
终于找到了  HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef, TIM_MasterConfigTypeDef) 设置第二个参数结构体中的MasterOutputTrigger=TIM_TRGO_UPDATE就可以  
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2019-8-5
在线时间
8 小时
发表于 2019-8-5 17:27:56 | 显示全部楼层
感谢分享!!
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2019-8-31
在线时间
24 小时
发表于 2020-10-12 10:58:07 | 显示全部楼层
楼主你好,关于stm32f767开发板的DMA发送数据产生正弦波,您的程序可以给我参考一下么,我按照您的方法,把Timer的TRGO打开了,还是没波形输出。下面是我打开TRGO的程序代码
//通用定时器2初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!(定时器3挂在APB1上,时钟为HCLK/2)
void TIM2_Init(u16 arr,u16 psc)
{  
    TIM_ClockConfigTypeDef sClockSourceConfig;
                TIM_MasterConfigTypeDef sMasterConfig;
                TIM2_Handler.Instance=TIM2;                          //通用定时器2
    TIM2_Handler.Init.Prescaler=psc;                     //分频
    TIM2_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
    TIM2_Handler.Init.Period=arr;                        //自动装载值
    TIM2_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
    HAL_TIM_Base_Init(&TIM2_Handler);
//                if (HAL_TIM_Base_Init(&TIM2_Handler) != HAL_OK)
//  {
//    _Error_Handler(__FILE__, __LINE__);
//  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
//  if (HAL_TIM_ConfigClockSource(&TIM2_Handler, &sClockSourceConfig) != HAL_OK)
//  {
//    //_Error_Handler(__FILE__, __LINE__);
//  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
//  if (HAL_TIMEx_MasterConfigSynchronization(&TIM2_Handler, &sMasterConfig) != HAL_OK)
//  {
//    //_Error_Handler(__FILE__, __LINE__);
//  }
    HAL_TIM_Base_Start(&TIM2_Handler);      //Time Base Start
    __HAL_TIM_URS_ENABLE(&TIM2_Handler);

}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-29 23:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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