STM32L5系列定时器功能丰富,主要包括基本定时功能、PWM生成与信号捕获等。
基本定时功能是其最基础的应用,能够设置时间延迟或进行周期性定时操作,适用于各种简单的定时任务。
PWM(脉冲宽度调制)功能使得STM32L5定时器能够生成具有特定占空比和频率的波形,广泛应用于电机控制、LED调光及电源管理等场景。通过配置预分频器、自动重装载值和占空比等参数,可以精确控制PWM信号的输出。
STM32L5定时器还支持输入捕获功能,能够检测外部信号的边沿变化,并记录当前定时器的值。该功能主要用于测量信号的脉宽或频率,通过配置滤波器、捕获极性和映射通道等参数,可以实现对外部信号的精确捕获和处理。
我们本此时根据外设的基本情况实现基本定时功能,以及拟通过LED进行PWM输出的展示。
这个时候我们需要看看外设情况:
之前用的两个LED居然不支持定时器的通道输出,那我们就没法使用板载的LED了吗?不用担心,板子的外设资源是很丰富的,我们又找到了一个LED:
这个LED对应的引脚是PG9:
这个引脚支持定时器的通道输出,不过有一点特殊的是这是一个互补的通道,一般会用在一些电机控制的引脚。
接下来开始我们定时器的相关控制:
普通定时器选择的是TIM6,并定时10ms;
PWM输出需要配置时钟源、通道、定时基准等信息,这里我们实现配置的频率为1KHz。
接下来我们就要进行一些初始化的操作,要开启相关的定时器:
<p>HAL_TIM_Base_Start_IT(&htim6);</p><p>HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_1);</p><p>HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);</p><p>__HAL_TIM_SET_COMPARE(&htim15,TIM_CHANNEL_1,500);</p>
然后就是在定时器的回调函数中进行呼吸灯的变化控制:
<p>void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)</p><p>{</p><p> if (htim->Instance == TIM6) {</p><p> HAL_IncTick();</p><p> Tim_cnt++;</p><p> if(Tim_cnt <= 100){</p><p> __HAL_TIM_SET_COMPARE(&htim15,TIM_CHANNEL_1,Tim_cnt*10);</p><p> if(Tim_cnt == 100)</p><p> HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);</p><p> }</p><p> else if(Tim_cnt > 100 && Tim_cnt <= 200){</p><p> __HAL_TIM_SET_COMPARE(&htim15,TIM_CHANNEL_1,(200-Tim_cnt)*10);</p><p> if(Tim_cnt == 200)</p><p> HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);</p><p> }</p><p> else</p><p> Tim_cnt = 0;</p><p> }</p><p>}</p>
效果如下:
|