一、MX的配置
通用定时器设置,选择时钟源为内部时钟,预分频7200得到10KHz的计数频率(以系统时钟72MHz为例),计数重装值为5000-1,则每0.5s会从0计数到4999产生一次更新。开启更新中断响应,即可利用中断每隔0.5s执行相应任务。下图为中断配置:
TIM1和TIM8为高级定时器,这里我们只用到了更新中断。
利用TIM2产生PWM在对应引脚输出的配置:
预分频为0,重装数为1892,大约能产生38KHz的脉冲。其中Pulse为占空,可以填写小于重装数的任意数字。占空比位Pulse值除以重装数。
附:判断一个引脚是否具有定时器输出的功能可以在软件中左键点击引脚,如下图:
例如PA8可以看到可以配置到TIM1的通道1。选中之后,TIM配置里同样也会有选中。在代码生成后,引脚复用的配置也会自动生成(HAL_TIM_MspPostInit)。关于引脚复用的map表可以在STM32参考手册的<通用和复用功能 GPIO/AFIO>中查阅。
二、生成的代码
TIM1初始化函数
牵扯到的中断响应配置:
其中中断响应函数也已经有了,在<stm32f1xx_it.c>内
TIM2的配置
硬件底层配置:
三、用户代码
对于TIM1的定时中断及响应
1. 开启
HAL_TIM_Base_Start_IT(&htim1);
2. 中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&htim1))
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);//LED循环1秒亮灭一次
}
}
3. 关闭
HAL_TIM_Base_Stop_IT(&htim1);
TIM2产生PWM并输出
1. 重设PWM占空比函数
void user_pwm1_setvalue(uint16_t value)
{
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = value;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}
2. 调用
user_pwm1_setvalue(946);
3. 停止
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1);