今天主要学习的是STM32的一个定时器开发的东西。
因为51的定时器很少,但是STM32的定时器资源非常多,所以说这玩意儿解释起来是特别复杂的。一般来说,常用的定时器大概有以下几种类型:
第一种是:SYSTICK:系统滴答定时器:集成在M3上的定时器,是给RTOS提供时钟节拍的,不属于外设的那种。主要用于移植芯片啥的。或者简单的延时啥的简单功能都用这个。因为有些芯片可能因为版本或者各种各样的原因是用不了HAL库里的DELAY的,所以可以自己写一个DELAY来操作,这时候就需要用到这个定时器。
第二种是:WatchDog:看门狗定时器
第三种是:RTC:实时时钟
第四五种是:基本定时器TIM6/7
第六七八九种是:通用定时器TIM2/3/4/5:在基本定时器上加入了输出比较,输入捕获,PWM,单脉冲生成的功能,所以说是运用最广泛的!!!!!!!!
第十十一种是:高级定时器TM1/2
一般来说,这些定时器现在都不用全部搞懂,因为说实话,你不用的话,很快就搞忘了,就没啥必要。
主要了解下重要的几个定时器就行了,比较常用。如果不是特殊项目要求,很多的功能可能根本用不上。
那么接下来,我们主要了解下通用定时器。对于通用定时器而言,它是通过啥可编程预分频器来驱动的一个16位的自动重装的计数器构成。可以对内外部时钟或者触发源进行计数。
它的基本工作原理:输入一个时钟信号(过程复杂),先送入16位预分频器(0~65535),等预分频器溢出后,再向16位的主计数器来发送一个脉冲信号。
其中,预分频器的系数,就是加法计数器的溢出值。
所以说,它的中断时间就可以计算了:
定时时间:=(可编程预分频器设置的值+1)*(主计数器设置的值+1)*(1/定时器的时钟频率)
比如说选择了一个32MHZ的时钟芯片,那么如果想定时500MS,这时候你就要看一下怎么设置更完美;比如32000*500/32000000=0.5s,大概就是这样一个逻辑。
第二步就是再次设置回调函数!!!
接下来就是例子的部分,一般来说,我们只需要修改一个外设参数,比如每隔0.5s或者1.5s啥的来翻转LED,就达到了我们定时的一个区别。
其余的LED配置是相同的,除了再TIMER里我们需要配置TIM2和TIM3
这里我配置的是8Mhz的时钟频率,所以计算方法是8000*1000/8000000=1s
0.5s之类的也是同类型的一个配置方法
紧接着和前面一样,对整个程序进行生成。生成后我们可以在main.c里的上层,看见多出来的TIM2和TIM3的初始化代码。
可以简单看一下TIM的一个配置。我们主要认知的就是PRESCALER预分频器和Period主计数器这两个玩意儿。时间的话,就可以直接在里面进行修改。
接下来由于需要用这个定时器,我们就需要干啥呢,需要去修改回调函数。就是去stm32f1xx_it.c里面找。这里可以看见这俩。
我们进入里面终端服务函数,找到里面关于时间间隔的一个定义。
HAL_TIM_IRQHandler,就是这个函数
然后通过经典操作CTRL+F找到它所定义的虚函数。
然后调用里面的虚函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)//后面配置TIM3一样的
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
}
}
上述的意思就是如果说,我发现我时钟的发生是在TIM2的话,那么久翻转我的LED。
之后我们回调了之后,就需要启动一下这个定时器。在stm32f1xx_hal_tim.c里面我们可以找到HAL_TIM_Base_Start();这样一个函数(这玩意儿有些实在stm32f1xx_hal.c里面找到的,我不是。。。)
这个函数大概又三个,不过后面的尾缀是不一样的,有STOP,还有IT的。如果说你要使用中断,一般就会用到IT。
这里我们用的就是
HAL_TIM_Base_Start_IT();括号里就是HTIM2/3的地址,所以需要加&指针。
那么代码如下
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
}
if(htim->Instance == TIM3)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);
}
}
int main(void)
{
MX_GPIO_Init();
MX_TIM2_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);
/* USER CODE END 2 */
while (1)
{
}
}
我只摘要了必要的回调函数和MAIN函数里的东西。总的来说这个还是很简单的朋友们。那么我们明天见。新的其实已经学了,但是还没写。