当前位置: 首页 > news >正文

PY32 定时器中断回调不执行的解决办法

一,发现问题

我在调试 PY32 的定时器中断时,按 HAL 库的流程配好了定时器,也写了回调函数,但全速运行后回调就是不执行。

voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim->Instance==TIM14){// 这里的代码从来不执行}}

打断点发现 HAL 层的回调根本没被调用。

二,排查过程

我先是检查了定时器分频、重装值、中断优先级,都没问题。

然后去查了一下,发现根因在 startup 启动文件里:PY32 的 startup 文件虽然标了TIM14_IRQHandler这个标签,但它是一个weak 弱别名,默认指向一个空函数。中断发生后 CPU 跳到了空函数里,根本没进到 HAL 库。

三,解决方法

手动实现TIM14_IRQHandler,把中断重定向到HAL_TIM_IRQHandler。下面是一个完整的可运行例程:

#include"py32f0xx_hal.h"TIM_HandleTypeDef htim14;volatileuint32_ttimer_irq_count=0;staticvoidAPP_SystemClockConfig(void){RCC_OscInitTypeDef RCC_OscInitStruct={0};RCC_ClkInitTypeDef RCC_ClkInitStruct={0};RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState=RCC_HSI_ON;RCC_OscInitStruct.HSIDiv=RCC_HSI_DIV1;RCC_OscInitStruct.HSICalibrationValue=RCC_HSICALIBRATION_24MHz;HAL_RCC_OscConfig(&RCC_OscInitStruct);RCC_ClkInitStruct.ClockType=RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;RCC_ClkInitStruct.SYSCLKSource=RCC_SYSCLKSOURCE_HSI;RCC_ClkInitStruct.AHBCLKDivider=RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider=RCC_HCLK_DIV1;HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_0);}staticvoidAPP_TimerInit(void){__HAL_RCC_TIM14_CLK_ENABLE();htim14.Instance=TIM14;htim14.Init.Prescaler=23999;// 24MHz/(23999+1) = 1KHzhtim14.Init.CounterMode=TIM_COUNTERMODE_UP;htim14.Init.Period=999;// 1KHz/1000 = 1Hz 中断htim14.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;htim14.Init.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE;HAL_TIM_Base_Init(&htim14);HAL_NVIC_SetPriority(TIM14_IRQn,1,0);HAL_NVIC_EnableIRQ(TIM14_IRQn);HAL_TIM_Base_Start_IT(&htim14);}/* 关键:手动实现 IRQHandler,调用 HAL 库的处理函数 */voidTIM14_IRQHandler(void){HAL_TIM_IRQHandler(&htim14);}/* 定时器中断回调 */voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim->Instance==TIM14){timer_irq_count++;}}intmain(void){HAL_Init();APP_SystemClockConfig();APP_TimerInit();while(1){// 主循环,timer_irq_count 每秒自增一次}}

把上面这段代码复制到一个新工程,添加 HAL 库后编译下载,定时器中断就能正常工作了。

四,补充说明:为什么 HAL 要用回调

中断发生后,CPU 直接跳到向量表里的函数。但 HAL 库不知道用户想在这个中断里做什么事,所以它设计了两层 weak 定义:

TIM14_IRQHandler (weak) ← startup 给的默认空函数 ↓ 你实现了就覆盖 你写的 TIM14_IRQHandler → HAL_TIM_IRQHandler() ← HAL 帮你清标志 → HAL_TIM_PeriodElapsedCallback (weak) ← 你实现的回调

HAL 负责通用操作(判断哪个中断源、清标志),用户只需实现回调。互不干扰。

也可以不用回调,直接在中断函数里处理所有事,结果一样:

voidTIM14_IRQHandler(void){// 在这里判断标志、清标志、做事,不经过 HAL}

两种写法选一种即可,没有强制。

五,总结

PY32 的 startup 文件只给了中断入口标签,默认是弱定义。想让 HAL 库的中断回调生效,必须自己实现 IRQHandler 并调用对应的 HAL 处理函数。

同理,串口中断、外部中断 etc. 都需要手动重定向,例如:

voidUSART2_IRQHandler(void){HAL_UART_IRQHandler(&huart2);}voidEXTI0_1_IRQHandler(void){HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);}

这个步骤容易忽略,希望能帮到遇到同样问题的人。

如果有纰漏之处,欢迎指正。

http://www.jsqmd.com/news/1243915/

相关文章:

  • 北京产业园哪家能挂靠注册地址:【博亚信诚】地址稳定 - MXyuyu
  • 2026年7月 口碑好的 济南保安公司加盟平台、保安公司挂靠平台口碑**全面梳理 - 起跑123
  • 熵权法结合层次分析法组合权重➕模糊综合评价根据体育教师胜任力作为案例
  • 自动Cookie刷新功能:Roblox Account Manager让账号永不过期
  • 别再手动开机启动!Systemd 一键搞定所有后台服务
  • extended_text核心功能详解:从特殊文本到自定义背景,一篇搞定所有高级用法
  • 武汉女生适合读什么中职专业 护理 / 高铁 / 美术设计稳定好就业 - 湖北升学规划
  • 深圳长途搬家公司:长途搬家+家电打包避坑指南,2026年跨省搬迁注意事项 - szxybj
  • 2026年保定赵掌柜回收黄金首饰,金条金币铂金回收,竞秀区向阳南大街489号赵掌柜二奢按实时金价结算到手不扣费(185-3117-2838) - 赵掌柜二奢
  • Skills3:如何通过智能技能系统提升开发者300%的工作效率
  • 2026年深圳搬运公司:精密设备搬运+实验室搬迁流程步骤,避免损坏的避坑技巧 - szxybj
  • 拒玩虚的!北京行贿罪案件辩护律师_北京受贿罪律师top5靠谱排行(2026年7月22日最新):专业能力与案例实绩对比 - 奋斗者888
  • Terraspace模块化开发实战:3个案例教你构建可复用的基础设施代码
  • 北京汽车养护服务行业2026 GEO优化公司新**丨生成式引擎优化服务商头部**深度解析 - 企业新闻快传
  • 终极指南:如何用700欧元打造你的智能割草机器人 - OpenMower完整教程
  • 格拉苏蒂中国**售后服务中心|全新热线和维修地址**信息公示(2026年7月更新) - 亨得利官方服务中心
  • stablecoin-evm在Celo网络的部署指南:Fee Adapter与特殊实现
  • NocoBase开发实战:从零构建你的第一个AI+无代码业务系统
  • AI生成商业摄影级图片的7个致命误区:90%设计师踩坑的隐藏雷区,现在规避还来得及
  • 2026 年当下,江陵知名的粮仓聚氨酯保温优质厂家怎么联系,揭秘:粮仓保温的秘密武器,如何让粮食保鲜十年? - 实业推荐官【官方】
  • 2026年7月最新!格拉苏蒂金华**售后网点地址及全国统一服务热线 - 亨得利官方服务中心
  • 2026安义县红木家具回收公司哪家好,工程废旧回收公司推荐|南昌卓浩物质回收中心口碑推荐 - geo88
  • RTX Remix终极指南:7个简单技巧让经典游戏重制焕然一新
  • PCB制造中自动在线AXI射线检查设备的兴起
  • 微型PCB拼板-单板最小尺寸如何左右拼板选型
  • 关于屋面坡度相关规定
  • 排水抢险车智慧运维系统方案
  • 2026年7月亲身到店体验海口亨得利**名表服务中心|详细地址与24小时售后电话 - 亨得利官方博客
  • Typst快速入门指南:5分钟掌握现代文档排版系统
  • LambdaWorks数学基础:椭圆曲线与多项式承诺方案