找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 651|回复: 1
收起左侧

STM32F4 HAL波形发生器怎么没有波形输出?敬请指教

[复制链接]
ID:82098 发表于 2024-1-24 13:30 | 显示全部楼层 |阅读模式
//初始化DAC
void DAC_DAC1_Init(void)//初始化DAC
{
    /*配置GPIO*/
    {
        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);
    }
    /*DAC通道1配置*/
    {
        DAC_ChannelConfTypeDef DACCH1_Config;
        hdac1.Instance=DAC;
        HAL_DAC_Init(&hdac1);                 //初始化DAC
        DACCH1_Config.DAC_Trigger=DAC_TRIGGER_T6_TRGO;             //定时器2的更新触发
        DACCH1_Config.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE;//DAC1输出缓冲关闭
        HAL_DAC_ConfigChannel(&hdac1,&DACCH1_Config,DAC_CHANNEL_1);//DAC通道1配置
        HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);  //开启DAC通道1

    }
}
//-----
//TIM6配置
//通用定时器6中断初始化
//arr:自动重装值
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器6!

void DAC_TIM6_Init(u32 Freq)//TIM6初始化
{
    /*TIM6配置*/
    u32 usPeriod;
    u16 usPrescaler;
    u32 uiTIMxCLK;
    uiTIMxCLK = SystemCoreClock / 2;//84MHZ
    if (Freq < 100)
    {
        usPrescaler = 10000 - 1;                       /*分频比 = 10000*/
        usPeriod =  (uiTIMxCLK / 10000) / Freq  - 1;/*自动重装的值*/
    }
    else if (Freq < 3000)
    {
        usPrescaler = 100 - 1;                       /*分频比 = 100*/
        usPeriod =  (uiTIMxCLK / 100) / Freq  - 1;/*自动重装的值*/
    }
    else    /*大于4K的频率,无需分频*/
    {
        usPrescaler = 0;                   /*分频比 = 1*/
        usPeriod = uiTIMxCLK / Freq - 1;/*自动重装的值*/
    }
    __HAL_RCC_TIM6_CLK_ENABLE();                     //使能TIM6时钟
    htim6.Instance=TIM6;                             //通用定时器6
    htim6.Init.Prescaler=usPrescaler;//arr;          //分频系数
    htim6.Init.CounterMode=TIM_COUNTERMODE_UP;       //向上计数器
    htim6.Init.Period=usPeriod;//psc;                //自动装载值
    htim6.Init.ClockDivision=0;//TIM_CLOCKDIVISION_DIV1; //时钟分频因子
    HAL_TIM_Base_DeInit(&htim6);                     //时基复位
    HAL_TIM_Base_Init(&htim6);                       //定时器6初始化
    TIM6->CR2 &= ~(0x0070);                          //清除定时器6MMS位
    TIM6->CR2 |= 0x0020;                             //选择定时器更新事件作为触发输出
    __HAL_TIM_ENABLE(&htim6);                        //开启定时器6
}
//DMA配置
//DMAx的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//void DAC_DMA_Init(void)
/*
***********************************
*   函 数 名: DAC_DMA1_Init
*   功能说明: 配置PA4 为DAC_OUT1, 启用DMA2
*   形    参: BufAddr : DMA数据缓冲区地址
*             Count   : 缓冲区样本个数
*            Freq  : DAC样本更新频率
*   返 回 值: 无
***********************************
*/
void DAC_DMA1_Init(u32 BufAddr, u32 Count, u32 Freq)
{
    __HAL_TIM_DISABLE(&htim6);//失能定时器
    DAC_TIM6_Init(Freq);//TIM6初始化
    /*DAC通道1配置*/
    {
        DAC_ChannelConfTypeDef DACCH1_Config;
        hdac1.Instance=DAC;
        HAL_DAC_Init(&hdac1);                 //初始化DAC
        DACCH1_Config.DAC_Trigger=DAC_TRIGGER_T6_TRGO;             //定时器2的更新触发
        DACCH1_Config.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE;//DAC1输出缓冲关闭
        HAL_DAC_ConfigChannel(&hdac1,&DACCH1_Config,DAC_CHANNEL_1);//DAC通道1配置
        HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);  //开启DAC通道1
    }
    __HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
    //Tx DMA配置
    {
        hdma_dac1.Instance=DMA1_Stream5;                            //数据流选择
        hdma_dac1.Init.Channel=DMA_CHANNEL_7;                                //通道选择
        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_PDATAALIGN_HALFWORD;       //存储器数据长度:16位
        hdma_dac1.Init.Mode=DMA_CIRCULAR;                            //循环模式
        hdma_dac1.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
        hdma_dac1.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
        hdma_dac1.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
        hdma_dac1.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
        hdma_dac1.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输
        HAL_DMA_DeInit(&hdma_dac1);
        HAL_DMA_Init(&hdma_dac1);
        DMA1_Stream5->CR|=1;    //使能DMA
        __HAL_LINKDMA(&hdac1,DMA_Handle1,hdma_dac1);    //将DMA与DAC1联系起来
        //启动DAC和DMA
        HAL_DAC_Start_DMA(&hdac1,DAC_CHANNEL_1,(uint32_t*)g_Wave1, 210,DAC_ALIGN_12B_R);
    }
    __HAL_TIM_ENABLE(&htim6);                        //开启定时器6
}

dac.zip

2.06 KB, 下载次数: 0

回复

使用道具 举报

ID:1110495 发表于 2024-2-1 11:24 | 显示全部楼层
先给dac一个恒定的输出,看电压输出是否正常。排除dac输出没问题后,看看定时器中断是否正常进入,记得在msp函数里配置中断。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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