使用STM32CubeMX生产初始化代码,底板硬件使用NUCLEO-F411RE开发板
查看原理图,PC6的TIM3-CH1设置为PWM输出管脚。
独立输出所需要的文件
查看下面结构框图可以得知,时钟可以由内部的tim_ker_ck和tim_pclk产生或者外部ETR时钟产生
同时可以设置复位,使能,向上/向下,中央双向对齐计数模式。
tim_ker_ck说明:内核时钟计数器。这个钟一定是与tim_pclk(派生相同的源)。时钟率Tim_ker_ck /tim_pclk必须为整数:1,2,3,16(最大值)
说明下中央双向对齐溢出事件
中央双向对齐计数模式中,计数器交替向上、向下计数。当计数值从 TMRx_PR 值向下计数到 1 值时,产生下溢事件,然后从0开始向上计数;当向上计数到TMRx_PR值-1时,产生上溢事件,之后从TMRx_PR值向下计数。计数器计数方向可由计数器方向控制位(OWCDIR)实时查看
查看下列文档可以得知,定时器主要有TIMx_CNT、TIMx_PSC、TIMx_ARR、TIMx_RCR控制。
同时预分频器(TIMx_PSC)范围位1-65535。
查看TIMx_PSC说明,可以得知定时器频率为 fCK_PSC / (PSC[15:0] + 1)
可以看到,当psc设置为不同的值的时候,计数频率也会发生改变。
同时ARR可以改变计数值,当写入的ARR越大,他的频率越低,计数周期是ARR+1。
底层硬件使用外部晶振8M时钟, 时钟配置为以下
Stm32_Clock_Init(96,4,2,4); //设置时钟,96Mhz
在上面配置TIM1参数,预分频系数设置为96-1, 自动重载值设置为1000-1,那么PWM频率为96,000,000/((96-1+1)*(1000-1+1))=1000Hz,即1KHz。
这两个为定时器主从模式配置,很少用到,我们用不到,所以全部关闭
Trigger Output (TRGO) Parameters项 与本节无关,之后做详细介绍
TRGO:定时器的触发信号输出 在定时器的定时时间到达的时候输出一个信号(如:定时器更新产生TRGO信号来触发ADC的同步转换)
使能定时器中断:
只要TIM1_CNT
HAL_TIM_IRQHandler(&htim3);
定时器中断处理函数 在stm32f4xx_it.c的 TIM3_IRQHandler()定时器中断服务函数中
这个函数的具体作用是判断中断是否正常,然后判断产生的是哪一类定时器中断(溢出中断/PWM中断…),然后进入相应的中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
在HAL库中,每进行完一个中断,并不会立刻退出,而是会进入到中断回调函数中,这里我们是使用定时器溢出中断回调函数
▲void TIM3_IRQHandler(void) 首先进入中断函数
▲ HAL_TIM_IRQHandler(&htim3);之后进入定时器中断处理函数
▲判断产生的是哪一类定时器中断(溢出中断/PWM中断…) 和定时器通道
▲ void HAL_TIM_PeriodElapsedCallback(&htim2); 进入相对应中断回调函数
▲在中断回调函数中添加用户代码
__HAL_TIM_SET_COMPARE()
设置CCR值,可以通过此函数修改PWM。
由于上述设置计数值位1000,那么设置30%的正占空比的ccr应该配置为30%*1000=300,代码如下所示。
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 300);
修改PWM频率可以修改PSC或者ARR来进行改变。
__HAL_TIM_SET_AUTORELOAD ()
设置TIM自动重新加载寄存器值。
初始设置为PSC为96-1,ARR为1000-1,若设置为500-1,那么他的频率应该是96M/(96-1+1)(500-1+1)=2k
占空比为300/500*100%=60%
__HAL_TIM_SET_AUTORELOAD(&htim3, 500-1);