打印

GD32F470 DAC+DMA+TIMER

[复制链接]
1377|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
t714664420|  楼主 | 2023-3-1 10:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己写的程序想要实现timer控制dac输出正弦波 ,用到dma。出现了问题,无法输出波形,输出结果为杂波,有没有大神帮忙看一下,万分感谢!
static void sin_dac_gpio_config(void)
{
        /* enable the clock of peripherals */
       
         rcu_periph_clock_enable(SIN_DAC_CLK);       
        rcu_periph_clock_enable(SIN_DAC_CLK);
        rcu_periph_clock_enable(RCU_CRC);
       
        /* once enabled the DAC, the corresponding GPIO pin is connected to the DAC converter automatically */
         gpio_output_options_set(SIN_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SIN_PIN);//推挽输出
   gpio_mode_set(SIN_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, SIN_PIN);
       
}

/*DAC通道输出配置,定时器6触发,不开启输出缓存*/
static void sin_adc_channel_config(void)
{
        dac_deinit();
        dac_trigger_disable(SIN_DAC);
        dac_wave_mode_config(SIN_DAC, DAC_WAVE_DISABLE);
        dac_output_buffer_disable(SIN_DAC);
        dac_trigger_source_config(SIN_DAC,DAC_TRIGGER_T6_TRGO);
        dac_interrupt_disable(SIN_DAC);
        dac_dma_enable(SIN_DAC);
        dac_trigger_enable(SIN_DAC);
        dac_enable(SIN_DAC);
       
       

      
       
       
}
//DMA配置
static void sin_dma_config(void)
{
        dma_single_data_parameter_struct dma_init_struct;
        /* enable DMA CLK */
        rcu_periph_clock_enable(SIN_DMA_CLK);
        /* deinitialize DMA channel3(USART0 tx) */
        dma_deinit(SIN_DMA, SIN_DMA_CHANNEL);
       
       
        dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
//        dma_init_struct.memory_addr = ;
//         dma_init_struct.memory0_addr = (uint32_t)Sine;       
        dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
        dma_init_struct.periph_memory_width = DMA_MEMORY_WIDTH_16BIT;
//        dma_init_struct.number = POINT_NUM2;
//        dma_init_struct.periph_addr = ((uint32_t)(&DAC0_R12DH));;
        dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
        dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;

dma_single_data_mode_init(SIN_DMA, SIN_DMA_CHANNEL, dma_init_struct);
       
       
       
       


}


void sin_dma_function_config(void)
{       
        //DMAx的通道y的存储器基地址配置
        dma_memory_address_config(SIN_DMA,SIN_DMA_CHANNEL,DMA_MEMORY_1,(uint32_t)Sine);  //(uint32_t)Sine
        //配置DMAx通道y还有多少数据要传输
        dma_transfer_number_config(SIN_DMA,SIN_DMA_CHANNEL,ARRAYNUM(Sine));
        //DMAx的通道y的外设基地址配置
        dma_periph_address_config(SIN_DMA,SIN_DMA_CHANNEL,DAC0_R12DH_DAC0_DOADDRESS);
       
        //DMA循环模式开启
        dma_circulation_enable(SIN_DMA, SIN_DMA_CHANNEL);
        //DMA的通道使能
        dma_channel_enable(SIN_DMA, SIN_DMA_CHANNEL);
       
       

}

/*TIMx触发配置*/
void sin_timx_trigger_function_config(void)
{
        timer_parameter_struct timer_initpara;

        rcu_periph_clock_enable(SIN_TIM_CLK);
        timer_deinit(SIN_TIM);

        /* TIMER0 configuration */
        timer_initpara.prescaler         = 999;//预分频
        timer_initpara.counterdirection  = TIMER_COUNTER_UP;//向上计数
        timer_initpara.period            = 49;//定时周期
        timer_init(SIN_TIM,&timer_initpara);
       


        //定时器主输出触发源选择
        timer_master_output_trigger_source_select(SIN_TIM,TIMER_TRI_OUT_SRC_UPDATE);
        timer_update_event_enable(SIN_TIM);
       
       
       
       
       
       
}

/*操作函数*/
void sin_app(void)
{
       
        sin_dma_config();
        sin_dma_function_config();
        sin_dac_gpio_config();
        sin_adc_channel_config();
        sin_timx_trigger_function_config();
        timer_enable(SIN_TIM);

       
}

使用特权

评论回复
沙发
t714664420|  楼主 | 2023-3-1 10:23 | 只看该作者
/*DAC引脚配置*/
static void sin_dac_gpio_config(void)
{
        /* enable the clock of peripherals */
       
         rcu_periph_clock_enable(SIN_DAC_CLK);       
        rcu_periph_clock_enable(SIN_DAC_CLK);
        rcu_periph_clock_enable(RCU_CRC);
       
        /* once enabled the DAC, the corresponding GPIO pin is connected to the DAC converter automatically */
         gpio_output_options_set(SIN_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SIN_PIN);//推挽输出
   gpio_mode_set(SIN_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, SIN_PIN);
       
}

/*DAC通道输出配置,定时器6触发,不开启输出缓存*/
static void sin_adc_channel_config(void)
{
        dac_deinit();
        dac_trigger_disable(SIN_DAC);
        dac_wave_mode_config(SIN_DAC, DAC_WAVE_DISABLE);
        dac_output_buffer_disable(SIN_DAC);
        dac_trigger_source_config(SIN_DAC,DAC_TRIGGER_T6_TRGO);
        //dac_interrupt_disable(SIN_DAC);
        dac_dma_enable(SIN_DAC);
        dac_trigger_enable(SIN_DAC);
        dac_enable(SIN_DAC);
       
       

      
       
       
}
//DMA配置
static void sin_dma_config(void)
{
        dma_single_data_parameter_struct dma_init_struct;
        /* enable DMA CLK */
        rcu_periph_clock_enable(SIN_DMA_CLK);
        /* deinitialize DMA channel3(USART0 tx) */
        dma_deinit(SIN_DMA, SIN_DMA_CHANNEL);
       
       
        dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
//        dma_init_struct.memory_addr = ;
//         dma_init_struct.memory0_addr = (uint32_t)Sine;       
        dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
        dma_init_struct.periph_memory_width = DMA_MEMORY_WIDTH_16BIT;
//        dma_init_struct.number = POINT_NUM2;
//        dma_init_struct.periph_addr = ((uint32_t)(&DAC0_R12DH));;
        dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
        dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;

dma_single_data_mode_init(SIN_DMA, SIN_DMA_CHANNEL, dma_init_struct);
       
       
       
       


}


void sin_dma_function_config(void)
{       
        //DMAx的通道y的存储器基地址配置
        dma_memory_address_config(SIN_DMA,SIN_DMA_CHANNEL,DMA_MEMORY_1,(uint32_t)Sine);  //(uint32_t)Sine
        //配置DMAx通道y还有多少数据要传输
        dma_transfer_number_config(SIN_DMA,SIN_DMA_CHANNEL,ARRAYNUM(Sine));
        //DMAx的通道y的外设基地址配置
        dma_periph_address_config(SIN_DMA,SIN_DMA_CHANNEL,DAC0_R12DH_DAC0_DOADDRESS);
       
        //DMA循环模式开启
        dma_circulation_enable(SIN_DMA, SIN_DMA_CHANNEL);
        //DMA的通道使能
        dma_channel_enable(SIN_DMA, SIN_DMA_CHANNEL);
       
       

}

/*TIMx触发配置*/
void sin_timx_trigger_function_config(void)
{
        timer_parameter_struct timer_initpara;

        rcu_periph_clock_enable(SIN_TIM_CLK);
        timer_deinit(SIN_TIM);

        /* TIMER0 configuration */
        timer_initpara.prescaler         = 999;//预分频
        timer_initpara.counterdirection  = TIMER_COUNTER_UP;//向上计数
        timer_initpara.period            = 49;//定时周期
        timer_init(SIN_TIM,&timer_initpara);
       


        //定时器主输出触发源选择
        timer_master_output_trigger_source_select(SIN_TIM,TIMER_TRI_OUT_SRC_UPDATE);
        timer_update_event_enable(SIN_TIM);
       
       
       
       
       
       
}

/*操作函数*/
void sin_app(void)
{
       
        sin_dma_config();
        sin_dma_function_config();
        sin_dac_gpio_config();
        sin_adc_channel_config();
        sin_timx_trigger_function_config();
        timer_enable(SIN_TIM);

       
}

改动之后仍然不好使

使用特权

评论回复
板凳
ttkwzyttk| | 2024-7-5 19:48 | 只看该作者
你好,我也遇到了这个问题,请问你是咋解决的

使用特权

评论回复
地板
t1ngus4| | 2024-7-29 14:48 | 只看该作者
输出为杂波是不是受到干扰了?

使用特权

评论回复
5
q1d0mnx| | 2024-7-29 15:52 | 只看该作者
你可以用仿真的方式看看程序运行情况的

使用特权

评论回复
6
su1yirg| | 2024-7-29 17:00 | 只看该作者
一般来说,如果是杂波,好像是配置失败导致的

使用特权

评论回复
7
d1ng2x| | 2024-7-29 18:03 | 只看该作者
建议用例程,在例程上修改一下试试呢?

使用特权

评论回复
8
zhizia4f| | 2024-7-29 19:10 | 只看该作者
感觉杂波是程序没正常运行呢

使用特权

评论回复
9
b5z1giu| | 2024-7-29 20:19 | 只看该作者
这个用定时器控制DAC,感觉是你的DAC没正常工作呢

使用特权

评论回复
10
y1n9an| | 2024-7-29 21:25 | 只看该作者
杂波是跟你的效果完全不一样吗?

使用特权

评论回复
11
shenxiaolin| | 2024-7-29 22:04 | 只看该作者
感谢分享

使用特权

评论回复
12
liu96jp| | 2024-7-30 08:36 | 只看该作者
你先去掉DMA试试呢?先单独用定时器和DAC试试

使用特权

评论回复
13
kaif2n9j| | 2024-7-30 10:05 | 只看该作者
感觉是哪里配置失败了,才会输出杂波

使用特权

评论回复
14
l1uyn9b| | 2024-7-30 13:00 | 只看该作者
是不是DMA配置不对啊,影响了DAC输出了

使用特权

评论回复
15
地瓜patch| | 2024-7-31 22:01 | 只看该作者
DMA在大数据读写上有优势

使用特权

评论回复
16
小小蚂蚁举千斤| | 2024-7-31 23:00 | 只看该作者
无法输出波形,输出结果为杂波,一般情况是输出配置出问题了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝