前言
之前有一个人让我帮他配置了一下用DMA控制脉冲个数的程序,他有固件库的版本,让我帮他弄个CUBEMX版本的,我之前也没弄过,试了一下,感觉这个还是挺有价值,虽然也不是很难,不过有些细节问题还是需要注意一下。后面一些做步进电机控制的同学可能会参考。
CUBEMX配置:
上面是控制4路PWM,存储4路PWM的占空比数据,声明的是4000,所以就是存储4000个占空比数据,也就是,最多控制4000个脉冲,如果需要增加,自行修改。
代码:
/**
******************************************************************************
* 文件名 : pulse.c
* 描述 : 此文件用于控制可控数目的脉冲
* 作者 :
******************************************************************************
此文件用于控制可控数目的脉冲
*
******************************************************************************
*/
#include "pulse.h"
#include "tim.h"
PULSE Pulse;
/****************************************************************************
*
* 函数名: pulse_StructInit
* 输入: 无
* 输出: 无
* 返回值: 无
* 描述: 结构体初始化
***************************************************************************/
void pulse_StructInit (PULSE *pPulse)
{
uint32_t i = 0;
for(i = 0; i < 4000; i++)
{
pPulse->u32_pulseBuf1[i] = 500;
pPulse->u32_pulseBuf2[i] = 500;
pPulse->u32_pulseBuf3[i] = 500;
pPulse->u32_pulseBuf4[i] = 500;
}
}
/****************************************************************************
*
* 函数名: pulse_Tim1Ch1Counter
* 输入: 脉冲个数
* 输出: 无
* 返回值: 无
* 描述: TIM1通道1脉冲输出
***************************************************************************/
void pulse_Tim1Ch1Counter (uint32_t num , PULSE *pPulse)
{
uint32_t pulseNum = (num * 4);
HAL_TIM_PWM_Init(&htim1);
HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1,(uint32_t *)pPulse->u32_pulseBuf1,pulseNum);
}
/****************************************************************************
*
* 函数名: pulse_Tim1Ch4Counter
* 输入: 脉冲个数
* 输出: 无
* 返回值: 无
* 描述: TIM1通道4脉冲输出
***************************************************************************/
void pulse_Tim1Ch4Counter (uint32_t num , PULSE *pPulse)
{
uint32_t pulseNum = (num * 4);
HAL_TIM_PWM_Init(&htim1);
HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_4,(uint32_t *)pPulse->u32_pulseBuf2,pulseNum);
}
/****************************************************************************
*
* 函数名: pulse_Tim2Ch3Counter
* 输入: 脉冲个数
* 输出: 无
* 返回值: 无
* 描述: TIM2通道3脉冲输出
***************************************************************************/
void pulse_Tim2Ch3Counter (uint32_t num , PULSE *pPulse)
{
uint32_t pulseNum = (num * 4);
HAL_TIM_PWM_Init(&htim2);
HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_3,(uint32_t *)pPulse->u32_pulseBuf3,pulseNum);
}
/****************************************************************************
*
* 函数名: pulse_Tim2Ch4Counter
* 输入: 脉冲个数
* 输出: 无
* 返回值: 无
* 描述: TIM2通道4脉冲输出
***************************************************************************/
void pulse_Tim2Ch4Counter(uint32_t num , PULSE *pPulse)
{
uint32_t pulseNum = (num * 4);
HAL_TIM_PWM_Init(&htim2);
HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_4,(uint32_t *)pPulse->u32_pulseBuf4,pulseNum);
}