HAL库常用的函数:

目录

HAL库:

1.GPIO常用函数:

1.HAL_GPIO_ReadPin(        )

 2.HAL_GPIO_WritePin(        )

3.HAL_GPIO_TogglePin(        )

4.HAL_GPIO_EXTI_IRQHandler(          )

5.HAL_GPIO_EXTI_Callback(        )

2.UART常用函数:

1.HAL_UART_Init()

发送函数:

2.HAL_UART_Transmit()

3.HAL_UART_Transmit_IT( )

4.HAL_UART_Transmit_DMA( )

接收函数:

5.HAL_UART_Receive( )

6.HAL_UART_Receive_IT()

7.HAL_UART_Receive_DMA( )

UART中断处理函数

UART的中断回调函数:

中断接收回调函数示例:

1.按键扫描函数


HAL库:

1.GPIO常用函数:

HAL_GPIO_Init()

        这个函数主要用来初始化我们需要用到的引脚,设置其工作频率、工作模式、上下拉等参数。如果使用CubeMX配置工程,所有参数在Cube中调配,函数自动在工程中生成,无需要手动初始化。

        

HAL_GPIO_DeInit()

HAL_GPIO_Init能够实现对GPIO的初始化,那么HAL_GPIO_DeInit就是与其相反的操作,能够将GPIO口恢复至默认状态,即各个寄存器复位时的值

1.HAL_GPIO_ReadPin(        )

读取我们想要知道的引脚的电平状态、函数返回值类型为GPIO_PinState  =  0或1。

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
例:pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
 2.HAL_GPIO_WritePin(        )

给某个引脚写0或1,GPIO_PIN_RESET 也可写成0;GPIO_PIN_RSET 也可写成1

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
例:HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_RESET)
3.HAL_GPIO_TogglePin(        )

翻转某个引脚的电平状态

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
例:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
4.HAL_GPIO_EXTI_IRQHandler(          )

        这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。如果使用CUbeMX生产,无需自己手写,直需要在main.c中重新定义相应的回调函数即可

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);//配置好CubeMX后,自动生产
5.HAL_GPIO_EXTI_Callback(        )

中断回调函数,可以理解为中断函数具体要响应的动作。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

2.UART常用函数:

1.HAL_UART_Init()
  • 功能:初始化UART外设。
  • 参数:huart是指向UART_HandleTypeDef结构体的指针,该结构体包含了UART模块的配置信息。
  • 返回值:返回一个枚举类型的值,表示初始化是否成功。可能的返回值包括HAL_OK(成功)、HAL_ERROR(错误)、HAL_BUSY(正忙,配置失败的一种)和HAL_TIMEOUT(超时,配置失败的一种)。
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)

发送函数:

2.HAL_UART_Transmit()
  • 功能:发送指定长度的数据。
  • 参数:
    • huart:指向UART_HandleTypeDef结构体的指针。
    • pData:指向要发送的数据的指针。
    • Size:要发送的数据的长度。
    • Timeout:发送超时时间。
  • 返回值:返回一个枚举类型的值,表示发送是否成功。
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
3.HAL_UART_Transmit_IT( )
  • 功能:以中断方式发送指定长度的数据。
  • 参数:与HAL_UART_Transmit相同。
  • 返回值:返回一个枚举类型的值,表示发送是否成功启动。
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
4.HAL_UART_Transmit_DMA( )
  • 功能:以DMA(直接存储器访问)方式发送指定长度的数据。
  • 参数:与HAL_UART_Transmit相同。
  • 返回值:返回一个枚举类型的值,表示发送是否成功启动。
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

接收函数:

5.HAL_UART_Receive( )
  • 功能:接收指定长度的数据。
  • 参数:与HAL_UART_Transmit相同。
  • 返回值:返回一个枚举类型的值,表示接收是否成功。
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
6.HAL_UART_Receive_IT()

  • 功能:以中断方式接收指定长度的数据。
  • 参数:与HAL_UART_Transmit相同。
  • 返回值:返回一个枚举类型的值,表示接收是否成功启动。
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
7.HAL_UART_Receive_DMA( )
  • 功能:以DMA方式接收指定长度的数据。
  • 参数:与HAL_UART_Transmit相同。
  • 返回值:返回一个枚举类型的值,表示接收是否成功启动。
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

UART中断处理函数

        UART中断处理函数通常是由HAL库内部调用的,但用户需要编写相应的中断服务函数(ISR)和回调函数来处理UART中断。例如,当使用中断方式发送或接收数据时,用户需要编写ISR来调用HAL库提供的HAL_UART_IRQHandler函数,并在回调函数中处理发送或接收完成的事件。

UART的中断回调函数:

  • HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart): 当UART传输完成时调用。
  • HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart): 当UART接收完成时调用。
  • HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart): 当UART传输一半数据时调用(如果使能了此中断)。
  • HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart): 当UART接收一半数据时调用(如果使能了此中断)。
  • HAL_UART_ErrorCallback(UART_HandleTypeDef *huart): 当UART发生错误时调用(如噪声、帧错误、溢出等)。
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)  
{  if (huart->Instance == USART1)  {  // 处理USART1传输完成的事件  // ...  }  
}  void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  
{  if (huart->Instance == USART1)  {  // 处理USART1接收完成的事件  // ...  }  
}

示例代码:

UART_HandleTypeDef huart1;  
uint8_t txData[] = "Hello, UART!";  
uint8_t rxData[10];  // UART初始化  
huart1.Instance = USART1;  
huart1.Init.BaudRate = 115200;  
huart1.Init.WordLength = UART_WORDLENGTH_8B;  
huart1.Init.StopBits = UART_STOPBITS_1;  
huart1.Init.Parity = UART_PARITY_NONE;  
huart1.Init.Mode = UART_MODE_TX_RX;  
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;  
huart1.Init.OverSampling = UART_OVERSAMPLING_16;  
HAL_UART_Init(&huart1);  // 发送数据  
HAL_UART_Transmit(&huart1, txData, strlen((char *)txData), HAL_MAX_DELAY);  // 接收数据  
HAL_UART_Receive(&huart1, rxData, 10, HAL_MAX_DELAY);
void USART1_IRQHandler(void)  
{  HAL_UART_IRQHandler(&huart1);  
}
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); // 设置中断优先级  
HAL_NVIC_EnableIRQ(USART1_IRQn);         // 使能USART1中断
中断接收回调函数示例:
uint8_t dataRcvd;
void main(void)
{HAL_UART_Receive_IT(&huart1,&dataRcvd,1);while(1){}}void HAL_URAT_RxCpltCallback()
{if(huart->Instance == USART1){}else if( ){}HAL_UART_Receive_IT(&huart1,&dataRcvd,1);
}

1.按键扫描函数

#define KEY0        HAL_GPIO_ReadPin(KEY0_GPIO_PORT, KEY0_GPIO_PIN)     /* 读取KEY0引脚 */
#define KEY1        HAL_GPIO_ReadPin(KEY1_GPIO_PORT, KEY1_GPIO_PIN)     /* 读取KEY1引脚 */
#define KEY2        HAL_GPIO_ReadPin(KEY2_GPIO_PORT, KEY2_GPIO_PIN)     /* 读取KEY2引脚 */
#define WK_UP       HAL_GPIO_ReadPin(WKUP_GPIO_PORT, WKUP_GPIO_PIN)     /* 读取WKUP引脚 */#define KEY0_PRES    1              /* KEY0按下 */
#define KEY1_PRES    2              /* KEY1按下 */
#define KEY2_PRES    3              /* KEY2按下 */
#define WKUP_PRES    4              /* KEY_UP按下(即WK_UP) */void key_init(void);                /* 按键初始化函数 */
uint8_t key_scan(uint8_t mode);     /* 按键扫描函数 */
/*** @brief       按键扫描函数* @note        该函数有响应优先级(同时按下多个按键): WK_UP > KEY2 > KEY1 > KEY0!!* @param       mode:0 / 1, 具体含义如下:*   @arg       0,  不支持连续按(当按键按下不放时, 只有第一次调用会返回键值,*                  必须松开以后, 再次按下才会返回其他键值)*   @arg       1,  支持连续按(当按键按下不放时, 每次调用该函数都会返回键值)* @retval      键值, 定义如下:*              KEY0_PRES, 1, KEY0按下*              KEY1_PRES, 2, KEY1按下*              KEY2_PRES, 3, KEY2按下*              WKUP_PRES, 4, WKUP按下*/
uint8_t key_scan(uint8_t mode)
{static uint8_t key_up = 1;  /* 按键按松开标志 */uint8_t keyval = 0;if (mode) key_up = 1;       /* 支持连按 */if (key_up && (KEY0 == 0 || KEY1 == 0 || KEY2 == 0 || WK_UP == 1))  /* 按键松开标志为1, 且有任意一个按键按下了 */{delay_ms(10);           /* 去抖动 */key_up = 0;if (KEY0 == 0)  keyval = KEY0_PRES;if (KEY1 == 0)  keyval = KEY1_PRES;if (KEY2 == 0)  keyval = KEY2_PRES;if (WK_UP == 1) keyval = WKUP_PRES;}else if (KEY0 == 1 && KEY1 == 1 && KEY2 == 1 && WK_UP == 0)         /* 没有任何按键按下, 标记按键松开 */{key_up = 1;}return keyval;              /* 返回键值 */
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1559539.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习笔记(持续更新)

注:本文所有深度学习内容都是基于PyTorch,PyTorch作为一个开源的深度学习框架,具有可以动态计算图、拥有简洁易用的API、支持GPU加速等特点,在计算机视觉、自然语言处理、强化学习等方面有广泛应用。 使用matplotlib绘图&#xff…

Python | Leetcode Python题解之第468题验证IP地址

题目: 题解: class Solution:def validIPAddress(self, queryIP: str) -> str:if queryIP.find(".") ! -1:# IPv4last -1for i in range(4):cur (len(queryIP) if i 3 else queryIP.find(".", last 1))if cur -1:return &q…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-10

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-10 1. Characterizing and Efficiently Accelerating Multimodal Generation Model Inference Y Lee, A Sun, B Hosmer, B Acun, C Balioglu, C Wang… - arXiv preprint arXiv …, 2024 https://arxiv.org/pdf…

如何使用Colly库进行大规模数据抓取?

在互联网时代,数据的价值日益凸显,大规模数据抓取成为获取信息的重要手段。Go语言因其高效的并发处理能力,成为编写大规模爬虫的首选语言。Colly库作为Go语言中一个轻量级且功能强大的爬虫框架,能够满足大规模数据抓取的需求。本文…

C语言 | Leetcode C语言题解之第467题环绕字符串中唯一的子字符串

题目&#xff1a; 题解&#xff1a; #define MAX(a, b) ((a) > (b) ? (a) : (b))int findSubstringInWraproundString(char * p) {int dp[26];int len strlen(p);memset(dp, 0, sizeof(dp));int k 0;for (int i 0; i < len; i) {if (i && (p[i] - p[i - 1] …

动态线程池设计与实现

为什么要有动态线程池 ThreadPoolExecutor 核心线程参数对某些业务不知到设置多少合适调整参数需要重新启动服务没有告警功能 设计思路 流程设计 库表抽象 更新操作流程图 代码实现 GitCode - 全球开发者的开源社区,开源代码托管平台

太阳诱电电感选型方法及产品介绍

功率电感在电子电路中被广泛应用&#xff0c;太阳诱电的功率电感从原材料开始进行研发&#xff0c;生产和销售。 本次研讨会将带领大家更加了解功率电感的选型方法&#xff0c;以及各种功率电感的种类和特征。 此外&#xff0c;也将介绍太阳诱电的最新产品阵容。本次研讨会预计…

python之详解集合

一种无序且不重复的数据容器&#xff0c;集合用大括号{}表示。 1、集合的查找访问 集合是不能通过 集合名[index] 这种方式访问的&#xff0c;其作用在于快速读取&#xff0c;而不是针对某个元素。 但&#xff0c;可将集合转为列表&#xff0c;再由列表访问元素。不过&#…

Spring Boot 进阶-实战Spring Boot整合Swagger3.0

说到Swagger有人会问Swagger到底是什么?作为一个后端开发人员来讲,为什么要使用Swagger呢?因为我们现在完成的项目大多数情况下都是前后端分离的项目,而对于前端开发人员来讲,他们需要调用接口,才能获取到对应的数据。那么这个接口如何获取,总不能是后端开发人员弄好之后…

xianshan分支预测单元基础与top层介绍

xianshan分支预测单元基础与top层接口介绍 2 xianshan BPU分支预测器总体架构2.1 分支预测器块思想2.2 多预测器2.3 多流水线2.4 取值目标队列--FTQ2.4.1 BPU预测结果内部重定向2.4.2 FTQ2BPU 重定向请求2.4.4 BPU的update请求 2.5 总结 在这里重点介绍xianshan分支预测单元BPU…

数学建模算法与应用 第8章 时间序列分析

目录 8.1 确定性时间序列分析方法 Matlab代码示例&#xff1a;移动平均法提取趋势 8.2 平稳时间序列模型 Matlab代码示例&#xff1a;差分法与ADF检验 8.3 时间序列的Matlab相关工具箱及命令 Matlab代码示例&#xff1a;ARIMA模型的建立 8.4 ARIMA序列与季节性序列 Matl…

开发环境搭建之NVM管理NODE安装

由于项目繁多前端node环境代码不统一、所以安装切换不同版本node、所以在此记录一下安装过程&#xff1a; 下载NVM工具 nvm zip github下载安装包 简单粗暴一看就会、直接从官网下载zip安装包、然后执行命令安装所需node版本即可 下载之后直接安装&#xff1a; 安装完成之…

linux执行脚本的时候为什么要写成 ./脚本名 而不是用脚本名直接执行

原因&#xff1a; 一定要写成 ./test.sh&#xff0c;而不是 test.sh&#xff0c;运行其它二进制的程序也一样&#xff0c;直接写 test.sh&#xff0c;linux 系统会去 PATH 里寻找有没有叫 test.sh 的&#xff0c;而只有 /bin, /sbin, /usr/bin&#xff0c;/usr/sbin 等在 PATH…

查询v$asm_disk等待enq: DD - contention

1.两个节点查询v$asm_disk均卡住&#xff0c;等待enq: DD - contention&#xff0c;阻塞源头为rbal进程&#xff0c;rbal进程未发生阻塞&#xff0c;未在异常等待事件上。 2.阻塞源头RBAL&#xff0c;在CPU上运行。没有在做rebalance磁盘平衡。 3.diag诊断日志中&#xff0c;阻…

python实现3D立柱图demo

import matplotlib.pyplot as plt import numpy as np plt.rcParams["font.sans-serif"] ["SimHei"] # 设置字体 plt.rcParams["axes.unicode_minus"] False # 该语句解决图像中的“-”负号的乱码问题# 数据 regions [东北, 中南, 华东, 华…

飞腾CPU技术发展分析

飞腾CPU剖析 CPU&#xff1a;信创根基&#xff0c;国之重器 国产CPU市场呈现三大领军阵营&#xff1a;x86、ARM以及其他创新架构。鲲鹏与飞腾在ARM阵营中引领风潮&#xff0c;依托ARM技术授权研发高性能处理器&#xff1b;海光与兆芯则以x86架构为基石&#xff0c;深入挖掘其潜…

数学建模算法与应用 第7章 数理统计与方法

目录 7.1 参数估计与假设检验 Matlab代码示例&#xff1a;均值的假设检验 7.2 Bootstrap方法 Matlab代码示例&#xff1a;Bootstrap估计均值的置信区间 7.3 方差分析 Matlab代码示例&#xff1a;单因素方差分析 7.4 回归分析 Matlab代码示例&#xff1a;线性回归 7.5 基…

Registry私有仓库可视化

Docker Registry 是一个用于存储和分发 Docker 镜像的服务&#xff0c;它支持构建私有仓库来管理组织内部的应用程序和镜像。然而&#xff0c;默认的 Docker Registry 并没有提供图形界面&#xff0c;这使得管理镜像变得不太直观。为了方便管理和查看私有仓库中的镜像&#xff…

显卡 3090 vs v100

1.3090 Date: 2020 AmperePielines/ Cuda cores: 10496 2.V100 Date: 2018 VoltaPielines/ Cuda cores: 5129 3.结构 & Core比较: v100优点: v100功耗小v100较快的双精度(fp64)和混合精度(fp16fp32)pcie版的NVLink与2080ti完全一致 v100缺点: 不支持整数格式计算&…

机器学习笔记-2

文章目录 一、Linear model二、How to represent this function三、Function with unknown parameter四、ReLU总结、A fancy name 一、Linear model 线性模型过于简单&#xff0c;有很大限制&#xff0c;我们需要更多复杂模式 蓝色是线性模型&#xff0c;线性模型无法去表示…