STM32Cube配置STM32U5Axxx芯片不生成GPDMA1初始化代码 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
应管管大大的吩咐,特地用PWM+GPDMA来实现PWM波形的输出。
【实验环境】
STM32CubeIDE1.14.0
【实现步骤】
1、用STM32CubeIDE新建基于NUCLEO-U5A5ZJ-Q开发板的工程。
2、打开TIM1+CH1通道来实现PWM输出:
2、配置GPDMA,需要选择12通道以上,要不然会出现断言错误。
3、配置PWM1输出参数,使用两个频率分别对应TIM寄存器组的值如下:ARR/ RCR/ CCR1
定义两个数组:
uint32_t pulse1[3] = {1000, 2, 500} ;
uint32_t pulse2[3] = {5000, 1, 2500} ;
即输出2个pulse1的脉冲后,再输出1个pulse2脉冲,这样交替输出。
4、配置GPDMA,使用GPDMA 通道12的 linked list模式,并配置为循环模式:
5、Linked List 配置中,创建一个list queue,并添加两个list node,选择GPDMA来执行 此list queue,同样配置为循环模式,指定循环起始节点为TN1,如下图。
6、Linked List 节点配置中,使用TIM1 update事件来产生DMA请求,指定DMA目的地 址为TIMx_DMAR寄存器,源地址为pulse1数组地址。TN2只需将pulse1修改为pulse2 即可。
7、在CubeMX生成代码后,添加以下代码,将TIM与DMA通道绑定,并配置 TIMx_DCR寄存器:
MX_TQ1_Config();
if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel12, &TQ1) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&htim1, hdma[TIM_DMA_ID_CC1], handle_GPDMA1_Channel12);
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_UPDATE);
HAL_DMAEx_List_Start_IT(&handle_GPDMA1_Channel12);
// update事件触发 DMA burst
// 3个DMA transfer,分别修改ARR/ RCR/ CCR1寄存器
// TIM寄存器作为基地址的索引,ARR寄存器索引为11
htim1.Instance->DCR = (1<<16) | ((3-1)<<8) | (11<<0);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
测试结果如下图,可以看到两个频率的PWM波形交替输出,且脉冲个数也符合需求:
附工程文件:
搜索的教程为:TIM DMA burst 输出变频 PWM 波形 (stmicroelectronics.cn)