OpenEdv-开源电子网

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

HAL库 PWM+DMA 乒乓操作的写法

[复制链接]

36

主题

124

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-4-28
在线时间
263 小时
发表于 2019-10-27 21:11:33 | 显示全部楼层 |阅读模式
99金钱
各位大大好,最近想用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采用哪个数组。


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

后来查看,HAL_TIM_PWM_PulseFinishedCallback 这个函数好像是 每一个PWM周期都会产生中断,并不是DMA传输完成时的中断

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

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

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-8-23
在线时间
13 小时
发表于 2020-6-11 15:34:13 | 显示全部楼层
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-6-11 15:46:45 | 显示全部楼层
dma传输有dma传输完成中断,看你的目的应该是在dma传输完成中断里面去做数组切换。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 07:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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