一:STM32F411定时器相关知识:
该器件包含一个高级控制定时器、七个通用定时器和两个看门狗定时器。
所有定时器计数器都可以冻结在调试模式下。
表4比较了高级控制定时器和通用定时器的特性。
高级控制定时器(TIM1)
高级控制定时器(TIM1)可以被视为三个相位的PWM发生器,它们被复用在四个独立的通道上。它具有互补的PWM输出,具有可编程的插入死区时间。它也可以被认为是一个完整的一般用途定时器。它的四个独立通道可用于:
输入捕获
输出比较
PWM 生成(边缘或中心对齐模式)
单脉冲模式输出
如果配置为标准16位定时器,则具有与通用TIMx定时器相同的功能。如果配置为16位PWM发生器,则具有完整的调制能力(0-100%)
高级控制定时器可以通过定时器链接功能与TIMx定时器一起工作,以实现同步或事件链
TIM1 支持独立 DMA 请求生成。
二:通用定时器知识分享:
通用定时器(TIMx)
STM32F411xC/xE中嵌入了七个可同步的通用定时器(参见表4以了解差异)
TIM2、TIM3、TIM4、TIM5
STM32F411xC/xE设备包含4个功能齐全的一般用途定时器:TIM2、TIM5、TIM3和TIM4。TIM2和TIM5定时器基于32位自动重载上/下计数器和16位预分频器。TIM3和TIM4定时器基于16位自动重载上/下计 计数器和16位预分 频器。它们都具有4个独立的通道,用于输入捕获/输出比较、PWM或单脉冲模式输出。这使得最多可以有15个输入捕获/输出比较/PWM。
TIM2、TIM3、TIM4、TIM5通用定时器可以协同工作,或者与其他通用定时器和高级控制定时器TIM1通过定时器链接功能进行同步或事件链。
这些通用定时器中的任何一个都可以用于生成PWM输出。TIM2、TIM3、TIM4、TIM5都具有独立的DMA请求生成功能。它们能够处理正交(增量)编码器信号以及来自1到4个霍尔效应传感器的数字输出。
TIM9、TIM10和TIM11
这些定时器基于16位自动重载计数器和16位预分频器。TIM10和TIM11具有一个独立的通道,而TIM9具有两个独立的通道,用于输入捕获/输出比较、PWM或单脉冲模式输出。它们可以与TIM2、TIM3、TIM4、TIM5功能齐全的一般用途定时器同步。它们也可以用作简单的时间基准。
对于看门口定时、窗口看门口和系统滴答定时器,这里不在介绍:
三:STM32 cube MX的配置
3.1 首先我们看下原理图,开发板晶振的配置过程:
可以看到板载调试的PA8引脚输出的一定的频率接到了STM32F411开发板的PF0引脚,所以我们可以使用外部的高速时钟源,作为HSE的晶振频率,使用示波器测量一下,晶振的工作频率,可以保证系统的稳定运行。当然也可以使用内的高速时钟:16Mhz
3.2 修改系统的时钟的配置部分:
由于手头上暂时没有示波器,测量不了外部得晶振频率,防止程序跑飞,这里我使用内部得HSI:16MHZ,作为系统的时钟源;
3.3 定时器10的配置,这里为了节省资源,使用的基本定时器10实现LED灯的翻转;
Tout(中断触发时间)=(ARR+1)(PSC+1)/定时器的时钟频率
这里配置好,定时器10的分频系数、重装值和使能自动重装功能;
3.4 配置项目工程的中断分组和中断的优先级
配置完成后,参考之前帖子直接生成代码就好;
四:软件编写:
4.1 开启定时器10计数功能:
void MX_TIM10_Init(void) { /* USER CODE BEGIN TIM10_Init 0 */ /* USER CODE END TIM10_Init 0 */ /* USER CODE BEGIN TIM10_Init 1 */ /* USER CODE END TIM10_Init 1 */ htim10.Instance = TIM10; htim10.Init.Prescaler = 99; htim10.Init.CounterMode = TIM_COUNTERMODE_UP; htim10.Init.Period = 999; htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim10) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM10_Init 2 */ HAL_TIM_Base_Start_IT(&htim10); /* USER CODE END TIM10_Init 2 */ }
4.2 编写定时器10的中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { /* USER CODE BEGIN Callback 0 */ /* USER CODE END Callback 0 */ /* USER CODE BEGIN Callback 1 */ if (htim->Instance == TIM10) { Time10point++; if(Time10point >=1000) { Time10point = 0 ; HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); } } }
试验现象:定时器以1S的时间间隔闪烁
测试代码如下所示: