分享一下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的时候注意一点。