首页 > 编程语言 >HAL库源码移植与使用之HAL库中断机制剖析

HAL库源码移植与使用之HAL库中断机制剖析

时间:2024-07-11 14:29:14浏览次数:12  
标签:HAL timxchy cap 剖析 TIM 源码 chy handle

经过一段时间的学习,我对HAL库自带的中断回调机制深恶痛绝,个人认为你可以把HAL库当成标准库去编写,形成你自己的编译风格,不用执行HAL库官方给的模板。

HAL库中断函数回调机制:

首先每个芯片的中断处理机制都是一样的,一样的中断头,一样的存储地址块

比如:HAL库中的void TIM5_IRQHandler(void)就与标准库的中断头一样

A.一触发中断就跳往对应中断的服务函数这里以定时器为例

按照HAL库格式,进去后执行

你也可以再加一个清除标志位在这里,不过前面那个函数里已经有清理函数了,再加一个做保险而已

B.进入HAL_TIM_IRQHandler(&g_timx_cap_chy_handle);  /* 定时器HAL库共用处理函数 */

这是一部分,但由一通全,可知全貌

从上图可以看出他先去判断每个标志位,把点亮了的全部执行其对应回调函数callback并clear该标志位

所以用户只需在callback函数中编写自己的功能就行

而且他是一次性检查一个外设里,并列if遍寻所有标志位谁亮执行谁的callback,所以编写不同callback函数就行,他会一起执行

像下面这个定时器5的ic1和溢出中断,两个callback函数在一个HAL_TIM_IRQHandler(&g_timx_cap_chy_handle);  /* 定时器HAL库共用处理函数 */判断执行并清除标志位

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM5)
    {
        if ((g_timxchy_cap_sta & 0X80) == 0)                /* 还没有成功捕获 */
        {
            if (g_timxchy_cap_sta & 0X40)                   /* 捕获到一个下降沿 */
            {
                g_timxchy_cap_sta |= 0X80;                  /* 标记成功捕获到一次高电平脉宽 */
                g_timxchy_cap_val = HAL_TIM_ReadCapturedValue(&g_timx_cap_chy_handle, TIM_CHANNEL_1);  /* 获取当前的捕获值 */
                TIM_RESET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, TIM_CHANNEL_1);                      /* 一定要先清除原来的设置 */
                TIM_SET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, TIM_CHANNEL_1, TIM_ICPOLARITY_RISING); /* 配置TIM5通道1上升沿捕获 */
            }
            else /* 还未开始,第一次捕获上升沿 */
            {
                g_timxchy_cap_sta = 0;                              /* 清空 */
                g_timxchy_cap_val = 0;
                g_timxchy_cap_sta |= 0X40;                          /* 标记捕获到了上升沿 */
                __HAL_TIM_DISABLE(&g_timx_cap_chy_handle);          /* 关闭定时器5 */
                __HAL_TIM_SET_COUNTER(&g_timx_cap_chy_handle, 0);   /* 定时器5计数器清零 */
                TIM_RESET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, TIM_CHANNEL_1);   /* 一定要先清除原来的设置!! */
                TIM_SET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, TIM_CHANNEL_1, TIM_ICPOLARITY_FALLING); /* 定时器5通道1设置为下降沿捕获 */
                __HAL_TIM_ENABLE(&g_timx_cap_chy_handle);           /* 使能定时器5 */
            }
        }
    }
}

/* 定时器更新中断回调函数 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM5)
    {
        if ((g_timxchy_cap_sta & 0X80) == 0)            /* 还未成功捕获 */
        {
            if (g_timxchy_cap_sta & 0X40)               /* 已经捕获到高电平了 */
            {
                if ((g_timxchy_cap_sta & 0X3F) == 0X3F) /* 高电平太长了 */
                {
                    TIM_RESET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, TIM_CHANNEL_1);                     /* 一定要先清除原来的设置 */
                    TIM_SET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, TIM_CHANNEL_1, TIM_ICPOLARITY_RISING);/* 配置TIM5通道1上升沿捕获 */
                    g_timxchy_cap_sta |= 0X80;          /* 标记成功捕获了一次 */
                    g_timxchy_cap_val = 0XFFFF;
                }
                else      /* 累计定时器溢出次数 */
                {
                    g_timxchy_cap_sta++;
                }
            }
        }
    }
}

 

标签:HAL,timxchy,cap,剖析,TIM,源码,chy,handle
From: https://blog.csdn.net/2301_80317247/article/details/140315017

相关文章

  • 零基础STM32单片机编程入门(十三) 红外避障传感器模块实战含源码
    文章目录一.概要二.红外避障模块主要参数1.模块引脚定义2.模块特点3.模块原理图三.STM32单片机红外避障模块检测实验四.CubeMX工程源代码下载五.小结一.概要红外避障模块具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测遇到障碍物时,红外线反射回来......
  • PlugLink 与 AI 大模型:深入 COZE API 链接实践(附源码)
    在这个技术日新月异的时代,AI不再是遥不可及的概念,而是逐渐成为我们日常生活与工作中不可或缺的一部分。作为技术领域的探路者,我深感荣幸地向大家介绍PlugLink——一个旨在简化AI应用集成并促进跨领域协作的开源平台,以及它如何与AI大模型及COZEAPI完美握手,共同编......
  • PlugLink的技术架构实例解析(附源码)
    在探讨PlugLink这一开源应用的实际应用与技术细节时,我们可以从其构建的几个核心方面入手,结合当前AI编程的发展趋势,为您提供既有实例又有深度解析的内容。PlugLink的技术架构实例解析前端技术选型——layui框架:PlugLink选择了轻量级且功能丰富的layui作为前端框架,它提......
  • AI 助力开发者:PlugLink 如何让技术与创意无缝对接(附源码)
    AI助力开发者:PlugLink如何让技术与创意无缝对接PlugLink,它是如何利用AI的力量简化开发流程,提升开发效率的。想象一下,当你手握一个工具,可以让你在不懂全部技术细节的情况下就能快速构建出复杂的应用,这该有多酷!首先,让我们从PlugLink的基本概念入手。如同其名,PlugLink是一......
  • 基于javaweb jsp ssm汽车服务商城系统设计与实现+vue录像(源码+lw+部署文档+讲解等)
    前言......
  • Springboot智能购房推荐系统 毕业设计-附源码09040
    摘 要近年来随着我国经济的高速发展,房地产业也随之蓬勃发展,尤其是最近国家新出台的房改政策。鼓励居民购房,这对房产公司无疑是一个极好的发展势头。尤为重要的是,近几年随着信息技术和电子商务的快速发展,许多企业都开发了自己房产信息软件。智能购房推荐系统主要针对房屋......
  • ssm学科竞赛管理系统 毕业设计-附源码08604
    摘 要21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对学科竞赛管......
  • SSM电商微信小程序 毕业设计-附源码09228
    摘 要随着微信小程序的使用越来越广泛,在传统的商业模式中,对于各类生活日常商品,人们习惯于到各种商家店铺购买。然而在快节奏的新时代中,人们不一定能为购买商品腾出时间,更不会耐心挑选自己想要的商品。所以设计一个电商微信小程序,既是迎合电子商务的大潮流,也是传统商品行业......
  • (免费领取源码)计算机毕业设计项目:宠物店管理系统 19849(开题答辩+程序定制+全套文案 )上
    目 录摘要1绪论1.1背景及意义1.2研究现状1.3springboot框架介绍2 宠物店管理系统系统分析2.1可行性分析2.2系统流程分析2.2.1数据流程3.3.2业务流程2.3系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4系统用例分析2.5本章小结......
  • 基于java+springboot+vue实现的学生网上请假系统(文末源码+Lw)104
    系统功能:本学生网上请假系统管理员,教师,学生。管理员功能有个人中心,学生管理,教师管理,班级信息管理,请假表格管理,提交请假表管理,学生考勤管理,缺课记录管理。教师功能有个人中心,学生管理,班级信息管理,请假表格管理,提交请假表管理,学生考勤管理,缺课记录管理。学生功能有班级信息管......