mcu中的DMA功能

分享一下MCU开发的一些过程吧,我主要开发的是国民技术的N32M0和M4系列的MCU,虽和STM32f103十分的相似,但还有区别的,再加上我刚学习32位的MCU,技术确实不咋滴,跳了很对坑,浪费大量的时间,不过技术确实提高了不少。

下面说一STM32F103的问题吧,最近看别人做的灯带很炫酷,所以想着自己也做一下,就买了WS2812的RGBD灯带,本来以为是很简单的,不就是设置GPIO的高低电平变化,确实是简单。但是看了其他博主的文章,发现驱动IO高低电平的变化方式太简单了,还占用CPU的时间。还有两种基本的驱动方式:PWM+DMA和SPI+DMA的方式,这样就不用占用CPU的资源了。

首先是PWM+DMA的方式,本来以为轻轻松松就能完成的,最后用了好久解决问题,主要原因还是在配置DMA上出了问题。

问题点1,

定时器对应DMA的通道没选对,DMA对应定时器的4个通道外,还有一个定时器更新的通道,TIM_DMACmd(TIM2, TIM_DMA_CC2    , ENABLE);使能的时候一定要选对,要使用UP通道就要打开相应的通道才行,之前我就是因为这个出了问题,导致数据没有传输出去。

问题点2

数据能传输出去了,但是传输的数据确实乱码的,导致灯带不规则点亮,找了很久原因,一直以为是pwm配置出了问题,然后用逻辑分析仪抓了一下波形,pwm频率周期设置是没问题,但是数据就是乱的,排除只能是DMA配置出了问题,最后找到原因了, 是DMA的字宽和缓存数组的类型大小不一样,我的数组是char,DMA配置的是两个字节 DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

 DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

最后把缓存数组的类型改成16位的就可以了,问题解决了。

SPI+DMA的方式和配置也是大同小异,比pwm配置还简单些,毕竟只是使用发送数据就行了,主要还是配置DMA的时候注意一点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值