OpenEdv-开源电子网

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

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

[复制链接]

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2018-10-2
在线时间
26 小时
发表于 2019-5-24 10:39:43 | 显示全部楼层 |阅读模式
10金钱
波形发生器.ZIP (1.86 MB, 下载次数: 58)

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

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-5-24 12:17:30 | 显示全部楼层
你用什么触发DAC传输DMA
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2018-10-2
在线时间
26 小时
 楼主| 发表于 2019-5-24 18:36:44 | 显示全部楼层
////////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]);
                */
        }
       
}


回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2018-10-2
在线时间
26 小时
 楼主| 发表于 2019-5-24 18:37:24 | 显示全部楼层
贴出了代码  大佬们帮我看一看
回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2018-10-2
在线时间
26 小时
 楼主| 发表于 2019-5-25 14:30:15 | 显示全部楼层
1208 发表于 2019-5-24 12:17
你用什么触发DAC传输DMA

大哥还在吗
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-5-25 15:07:27 | 显示全部楼层

你看下有没软件触发了
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2018-10-2
在线时间
26 小时
 楼主| 发表于 2019-5-26 09:43:08 | 显示全部楼层
1208 发表于 2019-5-25 15:07
你看下有没软件触发了

好像定时器触发需要配置,但是不懂怎么配
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-7-2
在线时间
9 小时
发表于 2019-9-10 09:07:03 | 显示全部楼层
楼主怎么解决的?
回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2018-10-2
在线时间
26 小时
 楼主| 发表于 2019-9-20 15:45:24 | 显示全部楼层
flyingisky 发表于 2019-9-10 09:07
楼主怎么解决的?

可已经我的其他帖子里边看,我做过分享
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-16 13:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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