STM32回调函数的使用 /定时器/GPIO/按鍵/串口的中斷回調

【STM32+cubemx】0003 HAL库开发:定时器基础应用,中断和回调函数 本节我们来学习STM32最基础的定时器应用,并利用hal库生成的代码,添加用户自己的功能到回调函数中。 程序实现的功能是:以10ms的定时器中断为周期,循环检测一个按键的状态,如果按下,则点亮LED灯;没有按下则熄灭LED灯。 1)cubemx生成代码 首先还是在cubemx中生成代码,选择器件、设置SYS(调试接口)、设置RCC(外部晶振时钟源)这几个步骤和前一节一样。 然后设置用户IO口,我们需要一个引脚输出驱动LED灯,一个引脚输入作为按键。这里我们的硬件上LED仍然使用开发板上的PC13 阅读详情

目录

回调函数

定时器——标准库

如何判断是否产生了中断重叠现象?

如何得知定时中断执行的时长?

定时器——HAL库

1. htim->Instance == TIM2

2. htim == &htim2

区别与选择建议

GPIO的中断回调——HAL库

使能外部中断(CubeMX 生成代码已包含,无需手动写)

实现中断回调函数(需要用户手动写)

串口——HAL库

串口接收的中断回调函数实现:

串口发送的中断


回调函数

        回调函数是 HAL 库等框架中,由用户实现、但在特定事件(如定时器周期到达、GPIO 触发)发生时由框架自动调用的函数。

        作用是 “分离通用底层逻辑与用户业务逻辑”—— 比如定时器中断中,HAL 库自动完成标志位判断、清除等通用操作,用户只需在回调函数里写 LED 翻转、数据读取这类具体需求,不用关心底层细节。

        简单说,回调函数就像给框架留的 “接口”:你提前写好要做的事(比如 LED 翻转),告诉框架 “当某个事件发生时,就调用我写的这个函数”,后续事件触发后,框架会自动执行你预留的逻辑,大大简化了代码编写和底层操作的复杂度。

定时器——标准库

定时器初始化完成后记得在主函数中完成初始化!!!

        标准库要求用户直接编写完整的中断服务函数(例如 TIM2_IRQHandler),所有逻辑(包括标志位判断、清除、业务处理)都需要在这个函数中手动实现,没有 “回调函数” 的概念。

例如,标准库实现 TIM2 定时中断的结构是:

// 标准库:中断服务函数需用户完全手动编写
void TIM2_IRQHandler(void)
{
    // 1. 判断中断标志
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
    {
        // 2. 清除中断标志
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        
        // 3. 业务逻辑(如LED翻转)
        GPIO_TogglePin(GPIOE, GPIO_Pin_15);
    }
}

如何判断是否产生了中断重叠现象?

就是刚进中断就清除标志位,中断退出之前,再检查一下标志位,如果又置1了,说明中断重叠。

如何得知定时中断执行的时长?

只需要在函数退出之前,读取一下计数器

​​​

定时器——HAL库

HAL 库的回调函数机制:

        HAL 库通过 “底层中断服务函数 + 上层回调函数” 的分层设计,

        将通用逻辑(标志判断、清除)封装在 HAL 库内部(如 HAL_TIM_IRQHandler),

        用户只需实现回调函数(如 HAL_TIM_PeriodElapsedCallback)来处理业务逻辑,无需关心底层细节。

        在HAL 库环境下,不需要也不建议使用 TIM_GetITStatus(TIM2, TIM_IT_Update) == SET 来判断中断;

        HAL 库的 HAL_TIM_IRQHandler 函数会自动完成所有已使能的定时器中断标志位的判断与清除,用户在回调函数(如 HAL_TIM_PeriodElapsedCallback)中无需再处理标志位,只需专注于业务逻辑(如 LED 翻转、数据读取等)即可。

记得开启中断,初始化阶段完成

//手动开启TIM2定时器中断(关键步骤)
HAL_TIM_Base_Start_IT(&htim2);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim == (&htim2))
    {
	   ID++;
    }
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{

    if (htim->Instance == TIM2)
    {
        ID++;
    }
}

1. htim->Instance == TIM2

  • htim 是 TIM_HandleTypeDef 类型的指针,它的 Instance 成员直接指向定时器的硬件寄存器基地址(例如 TIM2 对应的寄存器基地址是 TIM2 这个宏定义)。
  • 这种写法是通过寄存器基地址来判断定时器实例,是 HAL 库中更 “底层” 且通用的判断方式,适用于所有定时器外设。

2. htim == &htim2

  • htim2 是用户在初始化时定义的 TIM_HandleTypeDef 类型的结构体变量(例如 TIM_HandleTypeDef htim2;)。
  • 这种写法是通过比较结构体变量的地址来判断,要求用户在代码中明确定义了对应的 htim2 变量,且该变量是 TIM2 的配置句柄。

区别与选择建议

对比项htim->Instance == TIM2htim == &htim2
依赖条件仅依赖定时器的寄存器基地址(由芯片定义)依赖用户定义的 TIM_HandleTypeDef 变量(如 htim2)
通用性更高(适用于所有定时器,无需关心变量名)较低(需确保变量名与定时器实例一一对应)
代码可读性直接体现 “判断定时器硬件实例” 的意图需结合变量定义才能明确对应关系

GPIO(按鍵)的中断回调——HAL库

触发条件

对比项External Interrupt Mode(中断模式)External Event Mode(事件模式)
CPU 参与度需要 CPU 响应中断,执行回调函数无 CPU 参与,纯硬件联动外设
延迟性存在中断响应延迟(微秒级)硬件级触发,延迟极低(纳秒级)
应用场景需要 CPU 处理逻辑(如状态判断、数据解析)仅需硬件联动外设(如定时器启动、DMA 触发)

        在 CubeMX 完成配置后,无需在函数中手动初始化中断的底层硬件逻辑(如 EXTI 寄存器、NVIC 优先级等),这些都由 CubeMX 生成的代码自动完成。你只需关注使能中断和实现回调函数这两个关键步骤,具体如下:

使能外部中断(CubeMX 生成代码已包含,无需手动写)

CubeMX 生成的MX_GPIO_Init()函数会自动初始化 A1 引脚的中断配置,包括:

  • 配置 GPIO 为外部中断模式(上升沿 / 下降沿触发)前提记得先上下拉;
  • NVIC中配置 EXTI 控制器的中断线映射;
  • 配置 NVIC 的中断使能和优先级(即你在 CubeMX NVIC 界面中设置的参数)。

实现中断回调函数(需要用户手动写)

在用户代码中重写HAL_GPIO_EXTI_Callback函数,处理 A1 引脚中断触发后的逻辑:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == GPIO_PIN_1)  // 判断是A1引脚触发的中断
    {
        // 在这里编写中断触发后的业务逻辑,例如:
        // 读取引脚电平、控制LED、执行特定任务等
        HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_15);  // 示例:翻转PE15的LED
    }
}

邊沿檢測很快,一般不用延遲,另外,可能有一个问题:

中断回调函数必须 “快进快出”,不能包含任何阻塞操作(如HAL_Delay()),否则会导致系统卡死。

HAL_Delay()是基于系统滴答定时器(SysTick)的延时函数,

        其原理是: 等待 SysTick 定时器产生指定次数的中断(每 1ms 一次),通过计数递减实现延时。

        但中断回调函数运行时,系统会关闭同优先级或更低优先级的中断(包括 SysTick 中断)。

        因此,在HAL_GPIO_EXTI_Callback中调用HAL_Delay(10)时: SysTick 中断被阻塞,无法正常产生 1ms 定时,HAL_Delay()会陷入无限等待(永远等不到计数结束)。 导致整个中断回调函数无法退出,系统卡死(主循环和其他中断都无法执行)。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)  // 重写中断回调函数
{
  // 清除中断标志位在这之前已经进行
 
  // 先判断是否是EXTO10传来的中断请求
  if (GPIO_Pin == KEY3_Pin)
  {
    // 消抖延时
    HAL_Delay(10);
 
    // 如果还是高电平就翻转LED1
    if (HAL_GPIO_ReadPin(GPIOF, GPIO_Pin) == GPIO_PIN_SET)
    {
      HAL_GPIO_TogglePin(GPIOA, LED1_Pin);
    }    
  }
}

不消抖,直接使用:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == GPIO_PIN_3)  // �ж���A1���Ŵ������ж�
    {
			if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == GPIO_PIN_RESET)
			{
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5); 			
			}
    }
    if (GPIO_Pin == GPIO_PIN_4)  // �ж���A1���Ŵ������ж�
    {
			if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET)
			{
        HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5); 			
			}
    }
}

串口——HAL库

配置

找定义,进去后一直往下翻,找串口接受的回调函数

串口接收的中断回调函数实现:

回调函数


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if (huart->Instance == USART1) // ???????????? USART1
  {
    /*    任务!!    */
    HAL_UART_Receive_IT(&huart1, (uint8_t*)rx_data, sizeof(rx_data)); // ???? UART ????
  }
}

记得重新开启接收中断:HAL_UART_Receive_IT(...)

        由于 HAL 库的串口中断接收是 “一次性” 的(每次接收完成后会自动关闭中断),必须在回调函数末尾重新调用该函数,才能保证后续数据能继续触发接收中断,实现持续接收。

初始化:

记得在主函数住启用串口中断,如下

// 在main函数初始化后调用,启动USART1的中断接收(接收1字节到rx_data缓冲区)
HAL_UART_Receive_IT(&huart1, (uint8_t*)rx_data, 1);

使能串口接收中断,当接收到指定长度(如 1 字节)数据后,自动触发 HAL_UART_RxCpltCallback 回调函数。

串口发送的中断

        发送的函数也可以配合接收的一些函数去使用,但是注意理清楚状态

  HAL_UART_TxCpltCallback 是串口发送完成后的通知机制。当 HAL_UART_Transmit_IT 启动的异步发送过程全部完成(所有字节发送完毕),HAL 库会自动调用该回调函数,用于:

        告知用户 “数据已发送完成”(例如设置发送完成标志位 tx_done = 1);

        触发后续操作(例如发送下一包数据、释放缓冲区、更新状态指示灯等)。

// 1. 启动异步发送
HAL_UART_Transmit_IT(&huart1, (uint8_t*)tx_data, len);  // 启动发送,立即返回

// 2. 发送过程由硬件中断自动完成(无需CPU干预)

// 3. 发送完成后,HAL库自动调用回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)  // 确认是USART1的发送完成
    {
        // 例如:标记发送完成,用于主循环判断
        tx_complete_flag = 1;
        
        // 例如:继续发送下一包数据
        // HAL_UART_Transmit_IT(&huart1, next_tx_data, next_len);
    }
}

如果仅需 “发送数据” 而无需关心 “是否发送完成”(例如简单的调试信息发送),可以不实现回调函数,HAL_UART_Transmit_IT 仍能正常发送数据。但在多数场景下(如连续发送多包数据、需要确保数据发送成功后再执行下一步),必须通过回调函数获取发送完成的通知,否则无法判断发送状态。

STM32物联网实战开发(4)——基本定时器 综上所述,我们明白啦,利用了HAL库,已经帮我们生成了大部分的代码,我们只需要定义一个结构体(一个变量,一个函数指针(用来打开定时器))。后期只需要调用结构体就可实现定时的功能,最后我们还需要写一个回调函数来实现我们想要实现的功能,因为hal中已经构建了一个弱函数,我们只需要重新构建一个同名的函数即可(定时器中断函数大功告成)。 阅读详情

相关推荐

用定时器在单片机中实现一次性回调函数执行

在定时器中断服务例程中,我们遍历链表,更新每个事件的剩余时间,并在事件超时执行回调函数。还有一个点要注意,中断回调函数执行事件不应该超过定时器的最小粒度,要求我们最小粒度定义不能太小,比如最小粒度定义为10ms,这个值是很多操作系统的参考值。当CPU处理其他任务时,定时器会在后台独立运行,当达到设定的时间后,触发中断,执行回调函数。检查是否有事件的剩余时间减到零,如果有的话,调用相应的回调函数,并更新事件状态。在中断服务例程中,清除中断标志,停止定时器,以便将其复用为一次性定时器。

weixin_41579872的博客 2056

stm32定时器中断函数回调函数

启用USE_HAL_TIM_REGISTER_CALLBACKS宏定义之后,在中断发生时,首先会调用硬件中断函数TIM3_IRQHandler,这是由单片机芯片硬件设计决定的,再此函数中会调用 HAL_TIM_IRQHandler(&htim3);编辑源码程序,在stm32f4xx_hal_config.h文件中打开USE_HAL_TIM_REGISTER_CALLBACKS宏定义为1。在HAL_TIM_IRQHandler中会有一段代码,决定执行哪个回调函数,这部分是在编译时就确定的。

zd845101500的博客 7577

STM32CubeMX系列教程3:基本定时器中断

文章目录摘要配置工程配置定时器参数使能定时器配置定时器参数开启定时器中断生成工程编写用户程序编写中断回调函数启动定时器编译下载程序 摘要   本章讲解STM32基本定时器中断的使用方法,实现通过定时器中断,定时500毫秒,让LED灯的状态每隔500ms改变一次。本章的工程可以从前一章节的工程中复制修改完成。 配置工程   复制 STM32CubeMX系列教程0:创建工程 创建的工程目录GPIO_test,修改文件目录名称为TIM,双击打开GPIO_test.ioc。 配置定时器参数 使能定时器 打开Stm3

小白的学习笔记 1万+

STM32的通用定时器中断编程

如果遇到需要单片机产生严格时序的场景(比如DAC输出特定模拟信号,GPIO口控制模拟开关),延时函数可能就无法胜任了。这里我设计了一个简单的实验,单片机开发板上有LED0和LED1,我们让LED0亮500ms之后熄灭,随后LED1亮100ms之后熄灭,以此循环。不过从波形上来看会有较大的误差,因为只有500ms的时序是用中断严格实现的。(5)在stm32f4xx_it.c的代码沙盒段内进行虚函数重写,并且定义所需全局变量。(3)跳转定义查看函数底层逻辑,找到中断回调函数。(7)主函数编写功能函数。

qq_59757948的博客 1428

STM32的定时器中断与实例

有了前面学习中断的基础,本次对定时器的学习还是比较轻松的。PWM的原理很好的揭示了在电路中,数字信号是如何控制模拟信号的,这个很重要,也很实用。

qq_56353701的博客 5611

STM32CUBEMX生成按键控制PWM_LED灯

STM32CUBEMX配置 1. PWM设置:本次实验中采用按键控制PWM占空比来修改LED灯的亮度。 采用的定时器:Timer3,对应通道2选择PWM模式, 由于DS0外部连接的LED上接高电平,因而从0—1000对应的占空比值选择低极性模式。 其次是串口配置,使用usart1来给电脑发送串口信息, 本次实验中遇到的几个问题: 问题一: 设置外部中断时,因为存在系统时钟的中断优先级为0,与原先设置的外部中断优先级为0相冲突,因而我们在设置中断优先级的时候,要把外部中断的优先级设置低一级,这样就能在外部中

q1414502821的博客 4065

STM32HAL库定时器中断、按键中断、串口中断、按键消抖和低通滤波算法详解

本文将详细介绍STM32HAL库中的定时器中断、按键中断、串口中断的使用方法,以及按键消抖和低通滤波算法的实现。定时器中断是STM32开发中常用的一种中断方式,主要用于定时执行某些任务,例如按键消抖、定时更新显示等。1. 定时器中断法:通过定时器中断定时检测按键状态,若连续多次检测到按键状态一致,则认为按键有效。在main函数中,调用HAL_GPIO_EXTI_IRQHandler()函数启动按键中断。在main函数中,调用HAL_TIM_Base_Start_IT()函数启动定时器。

weixin_59592549的博客 6685

STM32单片机基础11——使用通用定时器闪烁LED

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的通用定时器外设,以中断的方式使LED闪烁。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): 测试LED 这里我直接使用板载LED,原理图如下: 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码; Ke...

小熊派开源社区的博客 3207

STM32 HAL库 STM32CubeMX -- TIM(定时器中断)

STM32 HAL库 STM32Cbue MX配置 定时器中断 TIM 定时器分类 定时器功能框图

Dir_x的博客 1万+

光流法实战:如何用OpenCV的Farneback算法实现图像对齐(附调参技巧)

本文详细介绍了如何使用OpenCV的Farneback稠密光流算法实现图像对齐,包括核心原理、参数调优和工程实现。通过实战代码和参数优化策略,帮助开发者解决动态场景中的图像对齐问题,提升多帧融合和视频处理的效果。

weixin_29266007的博客 290

关于影响力最大化问题中贪心算法的一些理解

在影响力最大化问题中(Influence Maximization,以下简称IM),贪心算法是最早提出的一种解决方法,并且一直沿用至今。它基于IM问题所具有的单调性(Monotonicity)和子模性(Submodularity)使用一种Hill Climbing策略,不断使用Monte Carlo模拟来寻找在当前情况下的具有最大传播范围的节点,添加至种子集合,得到最终结果,算法伪代码如下所示: 这里算法1其实并没有使用MonteCarlo模拟,而只是使用了贪心的策略...

nianjuan1990的专栏 2851

[STM32系列]一、HAL库的串口中断接收

[STM32系列]一、HAL库的串口中断接收1、前言2、回调函数3、HAL库中断接收函数使用 1、前言 HAL即硬件抽象层(英语:Hardware Abstraction Layer),实现了不同硬件的统一接口操作。这就极大的简化了程序员的移植工作,搭配STM32CubeMX,使用起来非常方便。 2、回调函数 HAL库使用了很多的回调机制,这样写能够更好的实现程序的分层处理,不影响程序的主体框架,...

challenger 2万+

一文速学数模-K-means聚类算法实战:信用卡用户画像聚类分析

该项目算是非常经典的金融业务用户画像的基础分析了,主要根据用户信用卡使用行为数据进行分析,根据收集到的不同字段信息,对每个用户划分类别。这里需要说明一下的是,聚类模型只是将具有相似行为的大部分用户聚集到一个类别里面,这点并不会考虑到每个字段的含义,也就是分成的类别并不是用户价值等级,此类别仅仅是这个类别大体相同的信用卡用户行为对象,并不能给每个用户价值打上标签,那是评价模型做的事,这里要注意不要搞混淆了,用户价值评价是评价模型决定的,而画像是聚类模型分析的。

master_hunter的博客 1万+

STM32 CubeMX学习:6. 按键的外部中断

STM32 CubeMX学习:6. 按键的外部中断 系列文章目录 前期的准备 点亮 LED 闪烁 LED 定时器闪烁LED PWM控制LED亮度 常见的PWM设备 按键的外部中断 ADC模数转换 串口收发 未完待续… 文章目录STM32 CubeMX学习:6. 按键的外部中断0 前言1 基础知识1.1 按键原理图1.2 按键软件消抖1.3 外部中断2 程序的学习2.1 按键的外部中断在CubeMX里的配置2.2 HAL_GPIO_ReadPin函数介绍2.3 中断回调函数介绍2.4 程序中的前后

快乐撸代码 8128

手把手教你学Simulink——电机电磁兼容与可靠性场景示例:基于Simulink的电机噪声抑制控制仿真

本文带你完成了电机噪声抑制控制的Simulink仿真,实现了:✅ 揭示了电磁噪声从电流到声音的传递机理✅ 搭建了含死区、固定载波等噪声源的高保真模型随机PWM(消除啸叫)谐振控制器(抑制5/7次嗡鸣)谐波注入(降低THD) ✅ 通过综合方案将噪声降低10 dB以上(感知响度减半!) ✅ 为产品静音品质提升提供可落地的控制方案。

MHD0815的博客 94

使用Clumsy和Process Explorer定位软件高CPU占用问题

使用弱网模拟工具Clumsy和进程查看工具Process Explorer定位软件高CPU占用问题。

dvlinker的技术专栏 5706

STM32使用定时器进行串口通信和点灯

STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和 TIME7 等基本定时器。三种定时器功能如下:STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT) 构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波 形(输出比较和 PWM)等。

2301_82236705的博客 2335

openlayers6/7 行政区划裁剪 只显示某个区域 示例为天地图

openlayers6/7 行政区划裁剪 只显示某个区域 示例为天地图。

qq_36287830的博客 3100

STM32CubeMX开发STM32F103:串口+DMA,定时器内部中断、PWM输出、输入捕获,ADC+DMA,GPIO

STM32F103:串口+DMA,定时器内部中断、PWM输出、输入捕获,ADC+DMA,GPIO

weixin_44226356的博客 4846

手把手教你学Simulink——基于传统电网建模与稳定性分析的场景实例:基于同步发电机的单机无穷大系统建模与稳定性分析

本文详细介绍了使用MATLAB/Simulink进行单机无穷大系统(SMIB)建模与稳定性分析的方法。教程从系统结构设计入手,包含同步发电机、输电线路、无穷大母线等核心模块的建模步骤和参数配置示例。重点讲解了七个关键步骤:项目创建、模块配置、控制系统集成、负载添加(可选)以及仿真运行与结果分析,并提供了具体的MATLAB代码示例。最后通过性能评估指标(功角差、电压跌落、频率偏差)分析系统稳定性,为电力系统动态特性研究提供了实用指导,强调准确参数设置对仿真结果的重要性。

MHD0815的博客 298

【HALCON工业视觉应用探索】10. C#+Halcon 3D视觉实战:点云处理与三维测量工业指南(附完整代码与实操案例)

摘要:本文聚焦C#+Halcon在3D视觉领域的工业应用,从新手友好的“基础3D检测系统”切入,逐步深入“汽车铸件三维测量”等工业级场景。内容涵盖核心概念(点云数据结构、3D采集原理、坐标系统)、完整技术流程(数据采集→预处理→特征提取→三维测量→结果可视化)、工业级代码实现(多视角点云融合、微缺陷检测、高精度尺寸测量),以及现场落地关键技巧(硬件选型、标定流程、抗干扰优化)。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2004

STM32HAL 快速入门(十三):定时器消抖 —— 中断场景下的按键抖动处理

STM32定时器消抖实现高效按键处理 本文介绍了一种利用STM32的SysTick定时器实现按键消抖的方法,有效解决了中断场景下延时消抖的弊端。通过结构体封装定时器参数,在1ms中断中检查按键状态,确保仅在稳定10ms后才触发有效操作。实验表明,该方法能准确过滤抖动,避免多次误触发,同时保持系统实时性。代码实现包括定时器设置、检查函数和中断回调等模块,适用于需要快速响应的嵌入式场景。

2502_90552706的博客 2221

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

浅谈 STM32 库里的回调函数

回调函数在STM32库中是一种非常重要的编程技巧,它让开发者能够以更灵活、高效的方式处理中断和事件。通过合理运用回调函数,可以提高代码的可维护性、灵活性和复用性。不过,在使用回调函数时,要注意回调函数的原型匹配、执行时间和阻塞操作等问题,以保证系统的稳定性和实时性。✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进❤欢迎关注我的知乎:对error视而不见代码获取、问题探讨及文章转载可私信。☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。👇点击领取更多详细资料。

duierrorshuobu的博客 1095

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

STM32CubeMX——HAL库之各种中断

STM32CubeMX——HAL库之中断1 GPIO中断1.1 打开STM32CubeMX生成keil5工程1.2 在keil5中编写代码1.3 串口打印显示结果2 串口中断1.1 打开STM32CubeMX生成keil5工程1.2 在keil5中编写代码1.3 串口打印显示结果3 定时器中断1.1 打开STM32CubeMX生成keil5工程1.2 在keil5中编写代码1.3 串口打印显示结果 硬件准备:正点原子的F407探索者开发板一块、ST-Link下载器一个 参考文档:《正点原子的HAL库系列

乐享的博客 2559

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

5.单片机回调函数

这种机制允许底层驱动(如 HAL 库)在事件触发时,自动通知上层应用程序,而无需上层主动查询(把一个函数的地址(指针)传递给另一个函数,当特定事件发生时,这个指针会被用来调用对应的函数。固定名称:STM32库中预定义的中断回调函数名称(如外部中断0、定时器中断等)执行流程:当特定事件发生时,程序自动跳转到对应的回调函数执行。实现方式:通过回调函数实现,在单片机领域应用广泛。:底层驱动和上层应用分离,底层负责检测事件,上层负责处理事件。:不同功能的处理逻辑可以独立封装在不同的回调函数中。

知识共享、互助共进 2005

STM32F103的中断使用(按键打印按下时间差)

6. `if(HAL_GPIO_ReadPin(SW1_GPIO_Port,SW1_Pin) == GPIO_PIN_RESET)`:通过`HAL_GPIO_ReadPin`函数读取`SW1`按键对应的GPIO引脚电平状态,如果引脚电平为低电平(`GPIO_PIN_RESET`表示低电平),则表示按键按下。例如,假设按键`SW1`按下时`HAL_GetTick()`返回值为1000,松开时返回值为1500,那么输出的信息将是`SW1 down time 500 ms`,表示按键`SW1`按下了500毫秒。

m0_61801634的博客 1486
上一篇: MPU6050配置Studying
下一篇: AD使用记录
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值