HAL_TIM_PWM源码理解

注:下文说起代码行数均为GENERAL_TIMx_Init();函数体内容,即第三张图片。函数

通用定时器和高级控制定时器都有 PWM 模式。下面就是讲解用HAL库配置定时器输出PWM模式。spa


main函数里的前两行做用是复位全部外设,初始化FLASH接口和初始化滴答定时器并配置系统时钟。指针

SystemClock_Config();函数在前面的一篇文章里已经具体讲解过。
blog

GENERAL_TIMx_Init();咱们双击函数名并Go to Definition Of 'GENERAL_TIMx_Init'进入他的函数体以下图
接口




首先咱们看到函数体的最后一行,HAL_TIM_MspPortInit();咱们用上面一样的方法进入函数体。图片


该函数的形参是一个TIM_HandlerTypeDef类型的结构体指针变量。首先定义一个GPIO的API结构体指针变量,经过形参变量htim对应的基地址与GENERAL_TIMx(经过对宏的跟踪咱们知道它是TIM3的外设基地址)比较,若知足条件进入if{   }。首先使能TIM3时钟,而后设置引脚号,输出模式,引脚速度,最后经过HAL_GPIO_Init带入配置的引脚参数,此时定时器通道引脚初始化已经完成。it

回到GENERAL_TIMx_Init();函数。函数外定义了一个TIM_HandlerTypeDef类型的结构体指针变量htimx。函数内首先定义了三个不一样类型的结构体指针变量sClockSourceConfig、sMasterConfig、sConfigOC。io

如图第66—71行配置了TIM3的预分频系数和重装载值,时钟分频系数和向上计数模式。外部触发预分频为TIMx->SMCR->ETPS=01,即ETRP频率除以2。ast

第76行表示复位 – TIMx_EGR寄存器的UG位被用于做为触发输出(TRGO)。若是是触发输入产生的复位(从模式控制器处于复位模式),则TRGO上的信号相对实际的复位会有一个延迟。变量

第77行表示不使能主从定时器功能。

第80—84行设置了PWM模式1,输出极性高电平有效,以及输出比较1 快速失能 。

到此,定时器pwm模式 配置完毕。


回到main函数。  HAL_TIM_Base_Start_IT(&htimx);开启定时器中断。

  HAL_TIM_PWM_Start(&htimx,TIM_CHANNEL_3);开启定时器通道3输出PWM方波。


最后一个函数:    __HAL_TIM_SET_COMPARE(htim,TIM_CHANNEL_3,indexWave[pwm_index]);修改特定的定时器通道的比较寄存器的值(占空比)。