接下来我们将学习定时器的三大基本功能,定时器中断,输出PWM,输入捕获。
STM32F4 的通用定时器包含一个 16 位或 32 位自动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。STM32F4 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32F4 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 STM3 的通用 TIMx (TIM2~TIM5 和 TIM9~TIM14)定时器功能包括: 1)16 位/32 位(仅 TIM2 和 TIM5)向上、向下、向上/向下自动装载计数器(TIMx_CNT),注意:TIM9~TIM14 只支持向上(递增)计数方式。 2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。 3)4 个独立通道(TIMx_CH1-CH4,TIM9~TIM14 最多 2 个通道),这些通道可以来作为: A.输入捕获 B.输出比较 C.PWM 生成(边缘或中间对齐模式) ,注意:TIM9~TIM14 不支持中间对齐模式 D.单脉冲模式输出 4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。 5)如下事件发生时产生中断/DMA(TIM9~TIM14 不支持 DMA): A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) C.输入捕获 D.输出比较 E.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM9~TIM14 不支持) F.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM14 不支持) 由于 STM32F4 通用定时器比较复杂,这里我们不再多介绍,请大家直接参考《STM32F4xx中文参考手册》第 392 页,通用定时器一章。
1、根据库函数本实验是以定时器3为例,在功能选择区选择TIM3。 2、根据库函数配置,选择对应的参数 TIM3 的时钟为 84M,再根据我们设计的 arr 和 psc 的值,就可以计算中断时间了。计算公式如下: Tout= ((arr+1)*(psc+1))/Tclk; 其中: Tclk:TIM3 的输入时钟频率(单位为 Mhz)。 Tout:TIM3 溢出时间(单位为 us) 3、为了测试实验,同样用两个LED来检测 4、对于中断--------我有话要说 大家可以看到上面,对于中断配置了两个参数,抢占优先级和响应优先级。如果中断仅有一个的时候,在CubeMX不设置也没关系,有默认参数。但是在大型程序里面中断优先级会有很大影响,可以在NVIC中设置两个变量。
RCC时钟配置如前文一样(此处一般情况是不变的)。 【STM32F4】HAL库 CubeMX(一)--------创建工程(点亮LED)
1、加入宏定义和函数定义
#define LED0_Reversal() HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9) #define LED1_Reversal() HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10) void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);2、加入下列代码即可验证实验
LED0_Reversal(); HAL_Delay(200); void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim == &htim3)//确定是定时器三中断 { LED1_Reversal(); }//不需要清除标志位 }因为定时器较重要,所以在这里说一点关于中断细节。 在stm32f4xx_hal_tim.h中 根据上述,所以我们在编写中断服务函数的时候,仅需要判断是哪个定时器的中断,而不需要判断中断产生的原因(分为不同的中断服务函数)以及清除标志位。