普中stm32开发板带您进入ARM世界定时器中断
普中stm32开发板带您进入ARM世界定时器中断
更多
好的!使用 普中 STM32 开发板 实现 定时器中断 是学习 ARM Cortex-M 内核(特别是 STM32)中断系统和定时器外设的绝佳入门实践。下面我将用中文详细解释步骤和关键概念,并提供一个基于 HAL 库的示例代码框架。
核心概念:
- 定时器 (TIM): STM32 内部有多个高级/通用/基本定时器。它们本质上是一个计数器,可以根据时钟源(通常是系统时钟或其分频)自动递增或递减。当计数器达到特定值(自动重装载值)时,可以产生事件或中断。
- 中断 (Interrupt): 一种硬件机制。当某个特定事件(如定时器溢出)发生时,处理器会暂停当前正在执行的代码,转而去执行一段预先定义好的代码(中断服务程序 ISR),执行完毕后再返回原程序继续执行。这允许 MCU 及时响应外部或内部事件。
- 定时器中断: 配置定时器在特定时间间隔(由时钟频率、预分频器和自动重装载值决定)产生溢出更新事件,并允许这个事件触发中断。在中断服务程序中,你可以执行周期性任务(如翻转 LED、读取传感器、发送数据等)。
实现步骤 (基于 STM32 HAL 库):
假设你使用的是普中开发板常见的 STM32F1 系列(如 STM32F103ZE),并使用 CubeMX 初始化或直接编写 HAL 库代码。以下步骤以通用定时器 TIMx (例如 TIM2, TIM3, TIM4) 为例:
-
使能时钟:
- 定时器本身需要时钟才能工作。
- 如果使用 GPIO 控制 LED 来验证中断,还需要使能对应 GPIO 端口的时钟。
- HAL 库函数:
__HAL_RCC_TIMx_CLK_ENABLE();和__HAL_RCC_GPIOx_CLK_ENABLE();(替换x为你的定时器和 GPIO 编号)。
// 例如,使能 TIM2 和 GPIOA (假设 LED 在 PA5) __HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); -
配置 GPIO (用于 LED):
- 将连接 LED 的引脚配置为推挽输出模式。
GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_5; // 替换为你的实际 LED 引脚号 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 替换为你的实际 GPIO 端口 -
配置定时器基础参数:
- 使用
HAL_TIM_Base_Init()函数初始化定时器。 - 需要填充
TIM_HandleTypeDef结构体和TIM_Base_InitTypeDef结构体。 - 关键参数:
Prescaler(预分频器):对定时器时钟源进行分频。定时器实际时钟 = 定时器输入时钟 / (Prescaler + 1)。用于调整计数速度。Period(自动重装载值):计数器计数到这个值后,会产生更新事件(并可能溢出归零或根据计数方向处理)。Period + 1就是计数器从 0 计到溢出所需的计数值。CounterMode:计数模式,通常用TIM_COUNTERMODE_UP(向上计数)。ClockDivision:时钟分频(用于数字滤波器),通常用TIM_CLOCKDIVISION_DIV1。
TIM_HandleTypeDef htim2; // 定时器句柄 htim2.Instance = TIM2; // 选择定时器2 htim2.Init.Prescaler = 7199; // 预分频值 (示例:72MHz / (7199 + 1) = 10KHz) htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 9999; // 自动重装载值 (示例:10000 个计数) htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; // 建议启用预装载 if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { // 初始化错误处理 Error_Handler(); }计算中断时间间隔:
- 假设系统时钟 (SYSCLK) = 72 MHz
- 定时器时钟 (TIMxCLK) = SYSCLK = 72 MHz (对于 APB1 上的 TIM2/3/4,如果 APB1 预分频器是 1,否则需要计算)
- 定时器实际计数频率 = TIMxCLK / (Prescaler + 1) = 72,000,000 / (7199 + 1) = 72,000,000 / 7200 = 10,000 Hz (10 KHz)
- 中断频率 = 定时器实际计数频率 / (Period + 1) = 10,000 / (9999 + 1) = 10,000 / 10,000 = 1 Hz (1 秒一次中断)
- 所以,这个配置会让 TIM2 每 1 秒产生一次更新中断。
- 使用
-
配置定时器中断:
- 使用
HAL_TIM_Base_Start_IT()函数启动定时器并开启更新中断。 - 使用
HAL_NVIC_SetPriority()设置定时器中断通道的优先级。 - 使用
HAL_NVIC_EnableIRQ()使能定时器中断通道。
// 启动定时器并开启更新中断 if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK) { // 启动错误处理 Error_Handler(); } // 设置中断优先级 (根据你的系统配置调整优先级和子优先级) HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0); // TIM2_IRQn 是 TIM2 的中断号 // 使能 TIM2 中断 HAL_NVIC_EnableIRQ(TIM2_IRQn); - 使用
-
编写中断服务程序 (ISR):
- 在
stm32f1xx_it.c文件中找到对应定时器的中断向量函数(如TIM2_IRQHandler)。 - 在这个函数里,必须调用
HAL_TIM_IRQHandler(&htim2);。这个 HAL 库函数会检查中断源并调用相应的回调函数。 - 关键: 在 ISR 中执行的操作必须尽量简短!避免长时间阻塞影响其他中断或主程序。
// 在 stm32f1xx_it.c 文件中 void TIM2_IRQHandler(void) { // 调用 HAL 库的中断处理函数 HAL_TIM_IRQHandler(&htim2); } - 在
-
编写定时器溢出更新中断回调函数:
- HAL 库提供了一个弱定义的
HAL_TIM_PeriodElapsedCallback()函数。当更新中断发生时,HAL_TIM_IRQHandler()会调用这个函数。 - 你需要在你的主程序文件(如
main.c)中重写 (Override) 这个函数,添加你希望在每次定时器中断发生时执行的代码(如翻转 LED)。
// 在 main.c 文件中 (或其他用户文件) void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { // 检查是哪个定时器触发的回调 if (htim->Instance == TIM2) { // 执行你的中断任务,例如翻转 LED (PA5) HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); } // 可以在这里检查其他定时器... } - HAL 库提供了一个弱定义的
-
主函数 (main):
- 调用上面的初始化函数(时钟、GPIO、定时器)。
- 启动定时器中断。
- 进入主循环。主循环可以执行其他任务,中断会异步发生。
int main(void) { HAL_Init(); // 初始化 HAL 库 SystemClock_Config(); // 配置系统时钟 (通常由 CubeMX 生成或自己实现) // 初始化 GPIO (LED) MX_GPIO_Init(); // 或者直接调用你写的 GPIO 初始化函数 // 初始化定时器 TIM2 MX_TIM2_Init(); // 或者直接调用你写的 TIM2 初始化函数 // 启动 TIM2 中断模式 if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK) { Error_Handler(); } // 设置并使能 NVIC HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0); HAL_NVIC_EnableIRQ(TIM2_IRQn); while (1) { // 主循环,可以执行其他任务 // 例如:HAL_Delay(100); 或者处理其他逻辑 // 注意:避免在中断和主循环中同时操作同一个资源(如全局变量)时产生冲突,可能需要临界区保护。 } }
总结与关键点:
- 时钟是核心: 清楚系统时钟、定时器时钟源、预分频后的实际计数时钟之间的关系是计算中断间隔的基础。
- HAL 库流程:
HAL_TIM_Base_Init:配置定时器参数。HAL_TIM_Base_Start_IT:启动定时器并开启更新中断。HAL_NVIC_*:配置中断优先级和使能。TIMx_IRQHandler:中断入口,调用HAL_TIM_IRQHandler。HAL_TIM_IRQHandler:库函数,根据中断标志调用对应回调。HAL_TIM_PeriodElapsedCallback:你需要重写的函数,放置你的中断处理逻辑。
- 中断服务程序 (ISR) 要短小精悍! 避免复杂计算、长时间延时(如
HAL_Delay)、或可能阻塞的操作。通常只设置标志位、翻转 IO、更新简单计数器等。 - 预装载 (AutoReloadPreload): 启用 (
TIM_AUTORELOAD_PRELOAD_ENABLE) 可以确保在更新周期时新值能平滑加载,避免在写入新Period值时产生毛刺。 - 验证: 最简单的验证方式就是在回调函数中翻转一个 LED。观察 LED 是否按照你计算的时间间隔闪烁。
- 查找资料: 普中开发板通常有配套资料。查找你板载 MCU 的具体型号(如 STM32F103ZET6)的参考手册和数据手册,查看定时器章节和中断向量表。查看开发板原理图,确认 LED 连接的引脚。
动手实践:
- 根据你的开发板型号和使用的 IDE (Keil, IAR, STM32CubeIDE),创建一个新工程。
- 按照上述步骤编写代码。特别注意替换
TIMx、GPIOx、PINx、IRQn为实际使用的值,并根据你的时钟配置计算Prescaler和Period以达到期望的中断时间。 - 编译、下载程序到开发板。
- 观察 LED 是否按预期闪烁。如果没有,检查:
- 时钟配置是否正确(
SystemClock_Config)? - 定时器时钟是否使能?
- GPIO 配置和初始化是否正确?LED 引脚是否接对?
- 中断优先级设置和使能是否做了?
- 是否在
stm32f1xx_it.c中调用了HAL_TIM_IRQHandler? - 是否正确地重写了
HAL_TIM_PeriodElapsedCallback? - 计算
Prescaler和Period的公式是否正确?用示波器或逻辑分析仪看引脚波形最直接。
- 时钟配置是否正确(
通过这个实验,你就成功利用 STM32 的定时器中断实现了周期性任务,这是嵌入式 ARM 开发中非常基础和重要的技能!祝你成功进入 ARM 世界!
STM32H757I-EVAL开发板
1970-01-01 08:00:00 至 1970-01-01 08:00:00
基于cubemx的stm32开发之路(使用正点原子战舰V3开发板)——基本定时器的应用
1hz的闪烁实验设备正点原子新战舰V3 STM32F103ZET6开发板学习板st-link烧录
资料下载
万物死
2021-12-08 15:21:11
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览