HAL库的F407怎么配置DAC+DMA?

2019-07-20 01:42发布

波形发生器.ZIP (1.86 MB, 下载次数: 2) 2019-5-24 10:39 上传 点击文件名下载附件



找了好多资料,发现好多关于DMA和DAC的资料都是标准库的,奈何我用的是HAL库,对于一些配置感觉该配置的都配了,可就是没电压出来,但是我把DMA去掉单独用DAC处正弦波是没问题的,我的初衷就是先不用定时器去控制你单独用DMA传输我想要的数据到DAC,但是一直不成功???HELP!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
lyqNB
2019-07-20 04:10
////////dac
#include "dac.h"
#include "dma.h"

DAC_HandleTypeDef DAC1_Handler;//DAC句柄

//初始化DAC
void DAC1_Init(void)
{
    DAC_ChannelConfTypeDef DACCH1_Config;
   
    DAC1_Handler.Instance=DAC;
                DAC1_Handler.DMA_Handle1=&DAC1_DMA_Handler;
               
    HAL_DAC_Init(&DAC1_Handler);                 //初始化DAC
   
    DACCH1_Config.DAC_Trigger=DAC_TRIGGER_NONE;             //不使用触发功能
    DACCH1_Config.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE;//DAC1输出缓冲关闭
       
    HAL_DAC_ConfigChannel(&DAC1_Handler,&DACCH1_Config,DAC_CHANNEL_1);//DAC通道1配置
   
    HAL_DAC_Start(&DAC1_Handler,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_NOPULL;          //不带上下拉
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}

//设置通道1输出电压
//vol:0~3300,代表0~3.3V
void DAC1_Set_Vol(u16 vol)
{
        double temp=vol;
        temp/=1000;
        temp=temp*4096/3.3;
    HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,temp);//12位右对齐数据格式设置DAC值
}

//////timer
#include "timer.h"
#include "led.h"
#include "dac.h"
#include "waveform.h"


TIM_HandleTypeDef TIM2_Handler;

u16 i=0;

//通用定时器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);
}
/*
void HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef * sMasterConfig)
{
        MasterOutputTrigger
}
*/

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

/////dma
#include "dma.h"
#include "usart.h"       
#include "dac.h"

DMA_HandleTypeDef  DAC1_DMA_Handler;      //DMA句柄

//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_LINKDMA(&DAC1_Handler,DMA_Handle1,DAC1_DMA_Handler);    //将DMA与DAC1联系起来(发送DMA)
   
    //Tx DMA配置
    DAC1_DMA_Handler.Instance=DMA_Streamx;                            //数据流选择
    DAC1_DMA_Handler.Init.Channel=chx;                                //通道选择
               
    DAC1_DMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存储器到外设
    DAC1_DMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
    DAC1_DMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
    DAC1_DMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外设数据长度:8位
    DAC1_DMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存储器数据长度:8位
    DAC1_DMA_Handler.Init.Mode=DMA_CIRCULAR;                            //外设普通模式
    DAC1_DMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
    DAC1_DMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              //关闭FIFO模式
    DAC1_DMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      //随便设的,因为已经被关掉了
    DAC1_DMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
    DAC1_DMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输
               
   
    HAL_DMA_DeInit(&DAC1_DMA_Handler);   
    HAL_DMA_Init(&DAC1_DMA_Handler);
}


//////数组
u32 Sine12bit[256] = {                                                                                                                                                         //正弦波描点
2048, 2098, 2148, 2198, 2248, 2298, 2348, 2398, 2447, 2496,
2545, 2594, 2642, 2690, 2737, 2785, 2831, 2877, 2923, 2968,
3013, 3057, 3100, 3143, 3185, 3227, 3267, 3307, 3347, 3385,
3423, 3460, 3496, 3531, 3565, 3598, 3631, 3662, 3692, 3722,
3750, 3778, 3804, 3829, 3854, 3877, 3899, 3920, 3940, 3958,
3976, 3992, 4007, 4021, 4034, 4046, 4056, 4065, 4073, 4080,
4086, 4090, 4093, 4095, 4095, 4095, 4093, 4090, 4086, 4080,
4073, 4065, 4056, 4046, 4034, 4021, 4007, 3992, 3976, 3958,
3940, 3920, 3899, 3877, 3854, 3829, 3804, 3778, 3750, 3722,
3692, 3662, 3631, 3598, 3565, 3531, 3496, 3460, 3423, 3385,
3347, 3307, 3267, 3227, 3185, 3143, 3100, 3057, 3013, 2968,
2923, 2877, 2831, 2785, 2737, 2690, 2642, 2594, 2545, 2496,
2447, 2398, 2348, 2298, 2248, 2198, 2148, 2098, 2047, 1997,
1947, 1897, 1847, 1797, 1747, 1697, 1648, 1599, 1550, 1501,
1453, 1405, 1358, 1310, 1264, 1218, 1172, 1127, 1082, 1038,//150
995, 952, 910, 868, 828, 788, 748, 710, 672, 635,
599, 564, 530, 497, 464, 433, 403, 373, 345, 317,
291, 266, 241, 218, 196, 175, 155, 137, 119, 103,//30
88, 74, 61, 49, 39, 30, 22, 15, 9, 5,
2, 0, 0, 0, 2, 5, 9, 15, 22, 30,
39, 49, 61, 74, 88, 103, 119, 137, 155, 175,
196, 218, 241, 266, 291, 317, 345, 373, 403, 433,
464, 497, 530, 564, 599, 635, 672, 710, 748, 788,
828, 868, 910, 952, 995, 1038, 1082, 1127, 1172, 1218,
1264, 1310, 1358, 1405, 1453, 1501, 1550, 1599, 1648, 1697,//70
1747, 1797, 1847, 1897, 1947, 1997 };


////main
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "adc.h"
#include "dac.h"
#include "waveform.h"
#include "timer.h"
#include "dma.h"





u16 x=0;///中间变量

int main(void)
{
    HAL_Init();                           //初始化HAL库   
    Stm32_Clock_Init(336,8,2,7);          //设置时钟,168Mhz
                delay_init(168);                       //初始化延时函数
                uart_init(115200);                     //初始化USART
                LED_Init();                                                //初始化LED       
                KEY_Init();                                                //初始化KEY

                MY_ADC_Init();                  //初始化ADC1
    DAC1_Init();                    //初始化DAC1
               
                TIM2_Init(10,84);
   
         MYDMA_Config(DMA1_Stream5,DMA_CHANNEL_7);
       
   HAL_DAC_Start_DMA(&DAC1_Handler,DAC_CHANNEL_1, Sine12bit, 256, DAC_ALIGN_12B_R);//开始发送
       
       
    while(1)
        {
                /*
                        for(x=0;x<=255;x++)
                        HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,Sine12bit[x]);
                */
        }
       
}


一周热门 更多>