简介
使用定时器PWM触发DMA发送指定个数占空比。
背景
用这种方式不需要CPU去不断的刷时序了,这些都由DMA去完成了。CPU要做的只是根据需要去改变数组里的东西,腾出时间给CPU去处理其他事情。
stm32cubemx配置
时钟选择

烧录管脚配置

这里我选择PA0管脚进行脉冲输出

DMA配置如下

配置定时器PWM周期为1ms

系统时钟配置

代码实现
#define BUFFSIZE 10
uint8_t i = 0;
uint32_t sendBuf[BUFFSIZE] = {0};
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
//发送10个周期的波,每次低电平周期增加20us
for (i = 0; i < BUFFSIZE; i++) //10
{
sendBuf[i] = 20 * (i + 1);
}
while (1)
{
HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, (uint32_t*)sendBuf, BUFFSIZE);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief This function handles DMA1 channel5 global interrupt.
*/
void DMA1_Channel5_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel5_IRQn 0 */
/* USER CODE END DMA1_Channel5_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_tim2_ch1);
/* USER CODE BEGIN DMA1_Channel5_IRQn 1 */
/* USER CODE END DMA1_Channel5_IRQn 1 */
}
// PWM完成DMA关闭
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
HAL_TIM_PWM_Stop_DMA(&htim2, TIM_CHANNEL_1);
}
1.第一个周期

2.第二个周期
2.最后一个周期

最后
以上就是迷人中心最近收集整理的关于stm32之stm32cubemx配置定时器输出指定个数不同占空比脉冲简介背景stm32cubemx配置代码实现的全部内容,更多相关stm32之stm32cubemx配置定时器输出指定个数不同占空比脉冲简介背景stm32cubemx配置代码实现内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复