STM32 常见定时器资源:
系统滴答定时器SysTick----提供时钟节拍做时间基准
看门狗定时器WatchDog----防止程序跑飞
实时时钟RTC
基本定时器:TIM7、TIM6
通用定时器:TIM2--TIM5----在通用定时器的基础的实现输出比较、输入捕获、PWM生成、单脉冲模式输出等使用最广。
高级定时器:TIM1、TIM8
这篇主讲TIM定时器的应用
高级控制定时器(TIM1和TIM8)和通用定时器(TIMx)是完全独立的,它们不共享任何资源,它们可以同步操作。
定时器的定时时间等于计数器的中断周期乘以中断的次数
STM32的通用定时器是一个通过可编程预分频器(Prescaler)驱动的16位自动重装主计数器(Counter Period)构成。可以对内部时钟或触发源以及外部时钟或触发源进行计数。
公式:定时时间=(Prescaler+1)*(Counter Period+1)/定时器时钟频率
例如要定时时间为0.1ms,可以设Prescaler=7199,Counter Period=999,(注Prescaler和Counter Period的值不是固定的)则:
(7199+1)*(999+1)/72000000=0.1ms
TIM在CUbeMX里的配置
【1】设置Clock Source时钟源
【2】设置Prescaler和Counter Period参数
【3】设置NVIC嵌套向量中断控制器
例:时钟信号72MHz,【1】利用TIM2实现间隔定时,每隔0.5秒将LED1的开关状态翻转。【2】利用TIM3实现间隔定时,每隔1秒将LED2的开关状态翻转。
代码如下(只给出主要部分):
/*通用定时器TIM练习*/
//回调函数,定时器中断服务函数调用的HAL库函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
LED1_TOG;
}
if(htim->Instance==TIM4)
{
LED2_TOG;
}
}
int main(void)
{
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
MX_TIM4_Init();
LED_GPIO_Init();
/* USER CODE BEGIN WHILE */
HAL_TIM_Base_Start_IT(&htim3);//使能定时器
HAL_TIM_Base_Start_IT(&htim4);
}
PWM是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术
如图为向上计数: 定时器重装载值为ARR,比较值CCRx ; t时刻对计数器值和比较值进行比较 ; 如果计数器值小于CCRx值,输出低电平 ; 如果计数器值大于CCRx值,输出高电平
PWM的一个周期 定时器从0开始向上计数 ; 当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平 ; t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平; 当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程 至此一个PWM周期完成
影响因素 ARR :决定PWM周期(在时钟频率一定的情况下,当前为默认内部时钟CK_INT) CCRx : 决定PWM占空比(高低电平所占整个周期比例)
向下计数则是从一个设定的数递减到零。
可参考: https://www.cnblogs.com/brianblog/p/7117896.html
以stm32f103ve为例
在pwm控制呼吸灯时TIM选择的PWM通道对应引脚要与LED对应引脚用杜邦线连接
如用TIM8的CH1来控制LED1,需将标出两引脚连接,同理如果用TIM1控制LED1的话将相应引脚连接即可。
int main(void)
{
char up_down_flag,pwm_value;
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
// MX_TIM1_Init();
MX_TIM8_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_1);开启PWM输出
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(20);
if(pwm_value == 0)
{
up_down_flag = 0;
}
if(pwm_value == 40)
{
up_down_flag = 1;
}
if(up_down_flag == 0)
{
pwm_value++;
}
else
{
pwm_value--;
}
__HAL_TIM_SET_COMPARE(&htim8,TIM_CHANNEL_1,pwm_value);
}
/* USER CODE END 3 */
}
函数总结:
1 __HAL_TIM_SET_COMPARE() // 是设置CCRx,一般是用在PWM输出的,控制PWM占空比
2 __HAL_TIM_GET_COMPARE() // 是用来读取CCRx的,一般用于捕获处理