1、新建工程,包含对应的系统文件,启动文件
2、使用CUBEMX生成需要的文件函数分开CH生成
定时器5通道1,内部时钟,PWM模式1,开启更新中断,开启DMA传输(内存到内存,外设和内存地址都不增长,默认生成的DMA配置就能用,不用特定的通道);
3、移植对应的文件到工程中去,初始化后,使用默认的两个函数完成 DMA控制PWM个数功能;
定义变量 aSRC_Buffe[10]
HAL_TIM_DMABurst_WriteStart(&htim2, TIM_DMABASE_ARR, TIM_DMA_UPDATE,(uint32_t*)aSRC_Buffer, TIM_DMABURSTLENGTH_1TRANSFER);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
4、烧写测试
每次发送一个后不再发送,监控发现,HAL_TIM_DMABurst_WriteStart的TIM_DMABURSTLENGTH_1TRANSFER参数进行了两次重复利用,应该独立两个,一个用作DMA传输次数,另个个用作定时器的 DCR和DMAR的配置,一次DMA进行几次定时器的读写。
修改只要在函数添加一个形参,给与HAL_TIM_DMABurst_WriteStart函数中的 HAL_DMA_Start_IT中的长度使用即可;
5、配置好后,开起来调试,没词发送都是 1、2、3个脉冲,不受控制。多测试后发现 外设地址为TIM_DMABASE_RCR的时候可以控制个数,猜测外设地址有偏移写入,导致每次写进去后数据错误导致传输结束。
6、修改自动填充数组为对应的【10】【4】,设置对应的传输参数为 TIM_DMABURSTLENGTH_1TRANSFER,之对一个进行DMA写进,别的使用中断中进行。
7、调试测试,最后一次空闲,修改循环数组9为8,剔除空的占空比。
8、正常的操作都是进行DMA中断后进行数据操作,循环后不进行应有个数跳变,一般是数据改到别的地方了。