STM32 HAL库学习系列第8篇---回调函数总结

普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数
对普通函数的调用:
调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行”
对回调函数调用:
调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。
位置:stm32f4xx_hal_xxx.c 中
定义为虚函数
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
串口回调:stm32f4xx_hal_uart.c
voidHAL_UART_IRQHandler(UART_HandleTypeDef*huart);
voidHAL_UART_TxCpltCallback(UART_HandleTypeDef*huart); //发送回调
voidHAL_UART_TxHalfCpltCallback(UART_HandleTypeDef*huart);
voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart); //接收回调
voidHAL_UART_RxHalfCpltCallback(UART_HandleTypeDef*huart);
voidHAL_UART_ErrorCallback(UART_HandleTypeDef*huart);
voidHAL_UART_AbortCpltCallback(UART_HandleTypeDef*huart);
voidHAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef*huart);
voidHAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef*huart);
举例:
我使用的stm32的两路串口收发,两个串口接收中断处理有问题,我现在的处理方式是这样的
/* USER CODE BEGIN 4 */
voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart)
{
if(huart==&huart2)
{
uRX_buf[RX_cont++]=RX_buf;
// HAL_UART_Transmit_DMA(&huart2, uTX_buf, 8);
if(RX_cont>63)
{
RX_cont=0;
}
}
else if(huart==&huart4)
{
uRX_buf[RX_cont++]=RX_buf4;
if(RX_cont>63)
{
RX_cont=0;
}
// HAL_UART_Receive_IT(&huart4,&RX_buf4,1);//¡ä??¨²?¨®¨º¨¹?D??
}
定时器回调:stm32f4xx_hal_tim.c
voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim); //周期运行回调,配置定时进入中断
voidHAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef*htim);//输出比较回调
voidHAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef*htim);
voidHAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef*htim);
voidHAL_TIM_TriggerCallback(TIM_HandleTypeDef*htim);
voidHAL_TIM_ErrorCallback(TIM_HandleTypeDef*htim);
GPIO:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin);//读引脚状态
voidHAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin,GPIO_PinState PinState); //写状态
voidHAL_GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin); //翻转电平
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin); //锁存引脚状态
voidHAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin); //实际调用的是下边的中断回调函数
voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); //引脚触发之后的回调函数,按键中断函数
举例; cube配置时开启中断触发模式
/* USER CODE BEGIN 4 */
voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
switch(GPIO_Pin)
{
caseGPIO_PIN_12:LED0_Toggle();break;
caseGPIO_PIN_13:LED1_Toggle();break;
caseGPIO_PIN_14:LED2_Toggle();break;
caseGPIO_PIN_15:LED3_Toggle();break;
default:break;
}
}
/* USER CODE END 4 */
STM32 HAL库学习系列第8篇---回调函数总结的更多相关文章
- STM32 HAL库学习系列第5篇 定时器TIM---编码器接口模式配置
cube基本配置,外设开启编码器,串口2 可能大家在设置的时候有这个错误 错误:error: #20: identifier "TIM_ICPOLARITY_BOTHEDGE" ...
- STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置
ADC工作均为非阻塞状态 轮询模式 中断模式 DMA模式 库函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放 ...
- STM32 HAL库学习系列第6篇---定时器TIM 级联配置
应用情景 使用定时器配置编码器模式,发现STM32只有两个定时器是32位,16位的测量值不够用,发现是可以使用两个16位定时器级联为32位的. 我是在使用编码器计数电机转速时使用,但是最终实现的效果不 ...
- STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM输出配置
基本流程: 1.配置定时器 2.开启定时器 3.动态改变pwm输出,改变值 HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); 函数总结: __HAL_TIM ...
- STM32 HAL库学习系列第3篇 常使用的几种延时方式
1 自带的hal_delay 函数 毫秒级延迟 void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick( ...
- STM32 HAL库学习系列第2篇 GPIO配置
GPIO 库函数 基本就是使用以下几个函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void H ...
- STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能
测量脉冲宽度或者测量频率 基本方法 1.设置TIM2 CH1为输入捕获功能: 2.设置上升沿捕获: 3.使能TIM2 CH1捕获功能: 4.捕获到上升沿后,存入capture_buf[0], ...
- STM32 HAL库学习系列---定时器TIM 输入捕获功能
基本方法 1.设置TIM2 CH1为输入捕获功能: 2.设置上升沿捕获: 3.使能TIM2 CH1捕获功能: 4.捕获到上升沿后,存入capture_buf[0],改为捕获下降沿: 5.捕获到下降沿后 ...
- 我们一起学习WCF 第八篇回调函数
什么是回调函数? 一个简单的例子:小明想要在京东购买一件商品.他会登陆网站选好自己的商品.然后他把这件商品放在购物车,然后开始付钱(这个表示触发,不付钱不发货(排除货到付款)).然后京东的人员收到了小 ...
随机推荐
- ubuntu18.04手动安装二进制MySQL8.0
wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz tar xvJf ...
- rename批量命名命令
参考:http://www.ttlsa.com/linux-command/linux-rename-command-batch-rename/ Linux下rename命令有两种版本一种是C语言版本 ...
- 00点睛Spring4.1-环境搭建
转载:https://www.iteye.com/blog/wiselyman-2210250 0.1 前置条件 Spring 4.1提倡基于Java Config和注解的配置,所以本教程通篇不会采用 ...
- 最新 迅游科技java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.迅游科技等10家互联网公司的校招Offer,因为某些自身原因最终选择了迅游科技.6.7月主要是做系统复习.项目复盘.Leet ...
- social engineering toolkit
1. freebuf介绍 http://www.freebuf.com/sectool/73409.html 2. github https://github.com/trustedsec/socia ...
- 配置jdbc问题 mysql与IDEA
1.新建lib文件夹,将jar文件导入 2在structure中添加jar文件 3设置url时需要设置时区: import java.sql.Connection;import java.sql.Dr ...
- CSS float属性
表示向左浮动,比如多个div在一个页面上,默认情况是:一行一个div,但是只要在div的css中使用float:left,可以使一行有多个div,这样可以把网页划分成很多块,但是使用该属性会影响后面的 ...
- Variational Auto-encoder(VAE)变分自编码器-Pytorch
import os import torch import torch.nn as nn import torch.nn.functional as F import torchvision from ...
- Spring之3:ListableBeanFactory
ListableBeanFactory在BeanFactory的位置见<Spring源码阅览——BeanFactory体系结构> ListableBeanFactory:同样扩展BeanF ...
- python爬虫-爬取你想要的小姐姐
一.准备 1. 原地址 2. 检查html发现,网页是有规则的分页, 最大图片的class为pic-large 二.代码 import requests import os from bs4 impo ...