硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5021|回复: 4
收起左侧

[技术讨论] HAL库 PWM+DMA 乒乓操作的写法

[复制链接]

9

主题

46

回帖

73

积分

初级会员

积分
73
发表于 2019-10-27 20:13:25 | 显示全部楼层 |阅读模式
ERIC大大好,之前和你请教用STM32播放PCM音频做成了(库函数+DAC+DMA+乒乓操作),最近想用STM32F030 做了一个 PWM+DMA+乒乓操作 来实验。

目前用HAL库建立的工程文件,DMA配置为 循环模式 , half word , Memory --》 Peripheral

在主程序调用 WHILE(1) 前  调用  HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)&pwm_data1,256) , 工作没有问题,在IO端的逻辑分析仪可以看到 DMA是循环将 pwm_data1里面的数组通过占空比调整进行输出

然后,我想在DMA传输结束时(也就是计数器走到头准备清0时) 产生中断,将DMA下一次传输数组改为 pwm_data2,实现乒乓操作。

我是这么写的

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
        if(htim == &htim3)
        {
                dma_bank_cnt++;
                HAL_TIM_PWM_Stop_DMA(&htim3, TIM_CHANNEL_1);
                if(dma_bank_cnt%2){HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)&pwm_data1,256);}
                else{HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)&pwm_data2,256);}
        }
}


dma_bank_cnt 就是中断次数计数器,取2的余数判断 下一次DMA采用哪个数组。


但是这么写后,经测试,好像永远只有一个数组被读取,也有可能这么写就根本不对,没有进中断

所以想请教怎么写呢?谢谢!

回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-10-27 20:53:22 | 显示全部楼层
HAL_TIM_PWM_PulseFinishedCallback 这个函数好像是一个PWM周期结束后就产生中断,并不是DMA传输结束时的中断
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-10-28 07:49:29 | 显示全部楼层
orta1986 发表于 2019-10-27 20:53
HAL_TIM_PWM_PulseFinishedCallback 这个函数好像是一个PWM周期结束后就产生中断,并不是DMA传输结束时的中 ...

改用DMA半缓冲传输完成中断做双缓冲实现,F030支持半缓冲吧
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-10-28 09:10:31 | 显示全部楼层
eric2013 发表于 2019-10-28 07:49
改用DMA半缓冲传输完成中断做双缓冲实现,F030支持半缓冲吧

请问这个DMA中断函数和判断在哪里呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-10-28 10:02:17 | 显示全部楼层
orta1986 发表于 2019-10-28 09:10
请问这个DMA中断函数和判断在哪里呢?

先看下F030的参考手册,DMA有这个中断标志不
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 21:20 , Processed in 0.158964 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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