目录
概述
1 STM32Cube配置项目
1.1 准备环境
1.2 配置项目参数
1.3 生成Project
2 HAL函数
2.1 初始化函数:HAL_TIM_Base_Init
2.2 中断模式启动定时器函数:HAL_TIM_Base_Start
2.3 定时器回调函数: HAL_TIM_PeriodElapsedCallback
3 应用实例
3.1 功能描述
3.2 代码实现
3.3.1 初始化定时器
3.3.2 回调函数
4 验证
4.1 验证方法
4.2 测试代码实现
4.3 测试功能
概述
本文主要讲述STM32F103系列芯片通用定时器的使用方法,通用定时器仅仅只能实现定时功能,笔者使用STM32Cube工具,快速实现和定时器相关的功能代码,然后编写回调函数,以测试定时器功能的精确度。采用逻辑分析仪捕捉波形验证了其准确度。
1 STM32Cube配置项目
1.1 准备环境
软件名称 | 版本信息 |
---|---|
STM32Cube | STM32CubeMX 6.11 |
STM32 HAL | STM32Cube_FW_F1_V1.8.5 |
1.2 配置项目参数
1)配置时钟参数
STM32F103系列芯片最高工作频率为72M Hz, 配置时钟频率时选择外部晶振,HCLK配置值最高工作频率(72M Hz),定时器的系统频率APB1也配置为72M Hz。
2) 配置定时器的相关参数
笔者选择通用定时器TIM7,具体参数配置如下:
参数名称 | 参数值 | 描述 |
---|---|---|
Prescaler | 71 | 系统频率为72M Hz,Prescaler=71,定时器的工作主频为1M Hz |
Counter Mode | Up | 选择增计数模式 |
Counter Period | 999 | 定时器产生中断间隔为1ms |
auto-reload | Enable | 使能计数周期重载 |
3)使能中断项
1.3 生成Project
在完成项目配置后,进行项目相关的配置
点击GENERATE生成项目文件,打开工程后,可以看见如下内容:
2 HAL函数
2.1 初始化函数:HAL_TIM_Base_Init
函数原型:
HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);
功能描述:
根据TIM_HandleTypeDef中指定的参数初始化TIM时间基单位,并初始化相关句柄
2.2 中断模式启动定时器函数:HAL_TIM_Base_Start
函数原型:
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);
功能描述:
启动TIM Base
2.3 定时器回调函数: HAL_TIM_PeriodElapsedCallback
函数原型:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
功能描述:
在非阻塞模式下经过的周期回调
3 应用实例
3.1 功能描述
使用TIM7定时器实现1ms的定时,基于中断模式,产生定时中断后,在回调函数中实现USR功能。
3.2 代码实现
3.3.1 初始化定时器
这个函数的大部分代码是由STM32Cube自动生成的,user只需添加如下源码:
/* USER CODE BEGIN TIM7_Init 2 */
HAL_TIM_Base_Start_IT(&htim7);
/* USER CODE END TIM7_Init 2 */
用于启动定时器,此时整个定时器的初始化和启动已经全部完成
3.3.2 回调函数
在STM32F103对应的HAL库中,回调函数HAL_TIM_PeriodElapsedCallback被定义为一个__weak类型的函数,程序员只需重写此函数实现相关的功能。
笔者重写该函数具体代码如下:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
static int count = 0;
/* USER CODE END Callback 0 */
if (htim->Instance == TIM6) {
HAL_IncTick();
}
/* USER CODE BEGIN Callback 1 */
if (htim->Instance == TIM7) {
}
/* USER CODE END Callback 1 */
}
4 验证
4.1 验证方法
为了便于测试定时器功能,笔者定义了一个IO,每当定时器中断发生时,这个IO的输出电平会发生翻转。然后使用逻辑分析仪捕捉该波形,就能测试定时器的频率。
4.2 测试代码实现
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
static int count = 0;
/* USER CODE END Callback 0 */
if (htim->Instance == TIM6) {
HAL_IncTick();
if( (count %1000) == 0)
{
HAL_GPIO_TogglePin( STATUS_LED_GPIO_Port, STATUS_LED_Pin);
}
count++;
}
/* USER CODE BEGIN Callback 1 */
if (htim->Instance == TIM7) {
HAL_GPIO_TogglePin( TEST_PIN_GPIO_Port, TEST_PIN_Pin);
}
/* USER CODE END Callback 1 */
}
4.3 测试功能
编译代码,然后下载到板卡中,测试波形,观察波形可得,中断周期为1 ms