STM32自定义回调

文章介绍了如何在STM32中定义和使用自定义回调函数,包括typedef定义函数指针类型,以及在实际应用中如何将函数名作为参数传递给其他函数,以实现特定功能,如GPIO状态检测和LED控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、自定义回调

func_cb:别名;uint16_t:函数指针返回数据类型;void:函数指针形参数据类型

typedef uint16_t (*func_cb)(void);

一般写法是

uint16_t(*func_cb)(void)//有几个参数在括号里写几个数据类型,逗号分隔

二、使用

typedef uint16_t (*func_cb)(void);
uint16_t num1() {
    if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == 0) {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
        printf("\r\n返回:0\r\n");
    } else {
        printf("\r\n返回:1\r\n");
    }
};

void led1(func_cb cb) {
    cb();//函数传递调用
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_1);
}
while (1) {
        led1(num1);//将函数名作为参数传递
        HAL_Delay(500);
    }

或:

uint16_t num1() {
    if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == 0) {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
        printf("\r\n返回:0\r\n");
    } else {
        printf("\r\n返回:1\r\n");
    }

};

void led1(uint16_t(*func_cb)(void)) {
    func_cb();
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_1);
}
 while (1) {
        led1(num1);
        HAL_Delay(500);

2.结果

在这里插入图片描述

### STM32 定时器回调函数使用方法 在STM32微控制器中,通过配置定时器并利用回调机制可以更加高效地管理时间敏感的任务。当定时器发生溢出或其他特定事件时,会触发相的中断服务程序(ISR),而ISR内部则可以通过调用预先设定好的回调函数来执行具体的业务逻辑[^1]。 对于基于HAL库开发的情况,在初始化阶段完成基本参数设置之后,还需要特别注意`HAL_TIM_Base_MspInit()` 函数内的操作——这里通常用于使能指定通道的全局中断以及关联对的硬件资源;随后可通过 `HAL_TIM_RegisterCallback()` 来登记想要使用的自定义回调函数[^4]。 下面给出一段简单的代码示例展示如何创建一个周期性的延时任务: ```c // 声明全局变量保存定时器句柄 TIM_HandleTypeDef htim2; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); /* 用户定义的回调函数 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ /* 如果是来自 TIM2 的请求,则打印消息 */ if (htim->Instance == TIM2) { printf("Timer interrupt occurred.\n"); } } int main(void){ // 初始化系统时钟、GPIO 和 TIM2 HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); // 启动定时器更新中断模式 HAL_TIM_Base_Start_IT(&htim2); while (1){ // 主循环体可放置其他非实时性工作 } } ``` 上述例子中实现了每当中断到来时自动调用一次预设的回调函数的功能。需要注意的是实际项目里当根据具体需求调整定时器的工作方式及其相关属性,并确保正确安装了必要的驱动支持以便于顺利编译链接整个工程文件[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值