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

2019-07-20 03:34发布


求大佬帮忙看下!!!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;
                }       
                            
        }

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
好烦shine
1楼-- · 2019-07-20 16:53
Timer的TRGO触发记得要开,然后就没问题了。
好烦shine
2楼-- · 2019-07-20 08:00
本帖最后由 好烦shine 于 2019-1-9 22:49 编辑

已经解决了哈
peng1554
3楼-- · 2019-07-20 12:02
 精彩回答 2  元偷偷看……
1208
4楼-- · 2019-07-20 12:54
 精彩回答 2  元偷偷看……
动量距
5楼-- · 2019-07-20 17:43
请楼主指教  HAL库的TRGO触发函数是啥  找了半天没找到  f1标准库的知道是TIM_SelectOutputTrigger
动量距
6楼-- · 2019-07-20 21:45
 精彩回答 2  元偷偷看……

一周热门 更多>