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的中断回调函数:

中断接收回调函数示例:

3.SPI常用函数:

4.定时器常用函数:

1. HAL_TIM_Base_Init 函数

2.TIM_Base_InitTypeDef 这个结构体类型

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);
}

3.SPI常用函数:

A47 STM32_HAL库函数 之 SPI通用驱动 所有函数的介绍及使用_hal库spi有关函数配置-CSDN博客

HAL_MAX_DELAY

4.定时器常用函数:

1. HAL_TIM_Base_Init 函数

定时器的初始化函数,其声明如下:

HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);

⚫ 函数描述: 用于初始化定时器。

⚫ 函数形参: 形参 1 是 TIM_HandleTypeDef 结构体类型指针变量(亦称定时器句柄),结构体定义如下:

typedef struct {

TIM_TypeDef *Instance; /* 外设寄存器基地址 */

TIM_Base_InitTypeDef Init; /* 定时器初始化结构体*/

HAL_TIM_ActiveChannel Channel; /* 定时器通道 */

DMA_HandleTypeDef *hdma[7]; /* DMA 管理结构体 */

HAL_LockTypeDef Lock; /* 锁定资源 */

__IO HAL_TIM_StateTypeDef State; /* 定时器状态 */

__IO HAL_TIM_ChannelStateTypeDef ChannelState;

/* 定时器通道状态 */

__IO HAL_TIM_ChannelStateTypeDef ChannelNState; /* 定时器互补通道状态 */

__IO HAL_TIM_DMABurstStateTypeDef DMABurstState; /* DMA 溢出状态 */
 }TIM_HandleTypeDef;

1)Instance:指向定时器寄存器基地址。

2)Init:定时器初始化结构体,用于配置定时器的相关参数。

3)Channel:定时器的通道选择,基本定时器没有该功能。

4)hdma[7]:用于配置定时器的 DMA 请求。

5)Lock:ADC 锁资源。

6)State:定时器工作状态。

7)ChannelState/ChannelNState:定时器通道/互补通道工作状态。

8)DMABurstState:DMA 溢出状态。

2.TIM_Base_InitTypeDef 这个结构体类型
typedef struct 
{ 
 uint32_t Prescaler; /* 预分频系数 */ 
 uint32_t CounterMode; /* 计数模式 */ 
 uint32_t Period; /* 自动重载值 ARR */ 
 uint32_t ClockDivision; /* 时钟分频因子 */ 
 uint32_t RepetitionCounter; /* 重复计数器 */ 
 uint32_t AutoReloadPreload; /* 自动重载预装载使能 */ 
} TIM_Base_InitTypeDef;

1)Prescaler:预分频系数,即写入预分频寄存器的值,范围 0 到 65535。

2)CounterMode:计数器计数模式,这里基本定时器只能向上计数。

3)Period:自动重载值,即写入自动重载寄存器的值,范围 0 到 65535。

4)ClockDivision:时钟分频因子,也就是定时器时钟频率 CK_INT 与数字滤波器所使用的采样 时钟之间的分频比,基本定时器没有此功能。

5)RepetitionCounter:设置重复计数器寄存器的值,用在高级定时器中。

6)AutoReloadPreload:自动重载预装载使能,即控制寄存器 1 (TIMx_CR1)的 ARPE 位。

⚫ 函数返回值: HAL_StatusTypeDef 枚举类型的值。

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;              /* 返回键值 */
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数通--3

一、动态路由 内部 路由器之间要互联互通,必须遵循相同的协议 企业内部用 IGP,企业之间用BGP RIP(已淘汰,不考) 距离就是长短,矢量就是方向,即路由的出接口 一台路由器 A 配好RIP,…

JavaWeb 17.过滤器

目录 一、过滤器概述 生活举例:公司前台,停车场安保系统,地铁检票闸机 过滤器开发中应用场景 过滤器工作位置图解 Filter接口API: 二、过滤器过滤过程图解 三、过滤器生命周期 四、过滤器链的使用 工作流程图解 注解方式配置过滤…

map和set(一)

首先模拟一下key形式类 使用的结构是搜索二叉树 结点中有左孩子和右孩子 还有一个存储的值 template <class K>struct BSTnode//搜索二叉树不支持修改 中序遍历是有序的{K _key;BSTnode<K>* _left;BSTnode<K>* _right;BSTnode(const K& key):_key(key…

网络资源模板--Android Studio 实现记事本App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的记事本App 二、项目测试环境 三、项目详情 首页 显示笔记列表&#xff1a;使用 ListView 显示从数据库中查询到的笔记内容。搜索功能&#xff…

web-105linux权限提升

rsync未授权本地覆盖 Rsync 是 linux 下一款数据备份工具&#xff0c;默认开启 873 端口 https://vulhub.org/#/environments/rsync/common/ 借助 Linux 默认计划任务调用/etc/cron.hourly&#xff0c;利用 rsync 连接覆盖 前提条件就是需要知道rsync的密码或者存在未授权 -提…

Java微信支付接入(6) - API V3 Native 支付通知API

官方文档&#xff1a;https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_5.shtml 通知规则&#xff1a;用户支付完成后&#xff0c;微信会把相关支付结果和用户信息发送给商户&#xff0c;商户需要接收处理该消息&#xff0c;并返回应答。对后台通知交互时&#xff0c…

如何解决 Vim 中的 “E212: Can‘t open file for writing“ 错误:从编辑到权限管理(sudo)

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

第十五届蓝桥杯C++B组省赛

文章目录 1.握手问题解题思路1&#xff08;组合数学&#xff09;解题思路2&#xff08;暴力枚举&#xff09; 2.小球反弹做题思路 3.好数算法思路&#xff08;暴力解法&#xff09;---不会超时 4.R格式算法思路 5.宝石组合算法思路---唯一分解定理 6.数字接龙算法思路----DFS 7…

TinyOS 点对基站通信

文章目录 一、前言1.1 发包的BlinkToRadio的数据包格式 二、混淆基站源码分析2.1 Makefile2.2 组件连接2.3 主逻辑代码 一、前言 1.1 发包的BlinkToRadio的数据包格式 如下&#xff0c;注意&#xff1a;AM层类型(1byte)即handlerID使可以在组件中修改的。 二、混淆基站源码…

uniapp学习(004-1 组件 Part.2生命周期)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第31p-第p35的内容 文章目录 组件生命周期我们主要使用的三种生命周期setup(创建组件时执行)不可以操作dom节点…

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器 源链接&#xff1a;https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idchinaFlag 国内站点预览&#xff1a;http://threehub.cn github地址: https://github.com/z2586300277/three-ce…

python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS)

python异常检测 - Stochastic Outlier Selection (SOS) 前言 随机离群选择SOS算法全称stochastic outlier selection algorithm. 该算法的作者是jeroen janssens. SOS算法是一种无监督的异常检测算法. 随机离群选择SOS算法原理 随机离群选择SOS算法的输入: 特征矩阵(featu…

【代码】集合set

哈喽大家好&#xff0c;我是学霸小羊&#xff0c;今天来讲一讲集合&#xff08;set&#xff09;。 在数学上&#xff0c;集合长这样&#xff1a; 那今天就来讲一讲编程上的集合。 集合的定义&#xff1a;把一些元素按照某些规律放在一起&#xff0c;就形成了一个集合。比如说…

stm32单片机个人学习笔记10(TIM编码器接口)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

论文笔记:Template-Based Named Entity Recognition Using BART

论文来源&#xff1a;ACL 2021 Finding 论文链接&#xff1a;https://aclanthology.org/2021.findings-acl.161.pdf 论文代码&#xff1a;GitHub - Nealcly/templateNER: Source code for template-based NER 笔记仅供参考&#xff0c;撰写不易&#xff0c;请勿恶意转载抄袭…

D35【python 接口自动化学习】- python基础之输入输出与文件操作

day35 文件合并 学习日期&#xff1a;20241012 学习目标&#xff1a;输入输出与文件操作&#xfe63;-47 如何使用python合并多个文件&#xff1f; 学习笔记&#xff1a; 合并文件需求分析 合并两个文件 代码实现 # 合并两个文件 with open(demo1.txt) as f1:file_data_1f…

机器学习(10.7-10.13)(Pytorch LSTM和LSTMP的原理及其手写复现)

文章目录 摘要Abstract1 LSTM1.1 使用Pytorch LSTM1.1.1 LSTM API代码实现1.1.2 LSTMP代码实现 1.2 手写一个lstm_forward函数 实现单向LSTM的计算原理1.3 手写一个lstmp_forward函数 实现单向LSTMP的计算原理总结 摘要 LSTM是RNN的一个优秀的变种模型&#xff0c;继承了大部分…

鸿蒙--知乎评论

这里我们将采用组件化的思想进行开发 在开发中默认展示的是首页也就是 pages/Index.ets页面 这里存放的是所有页面的配置文件,类似与uniapp中的pages.json 如果我们此时要更改默认显示Zh

jmeter入门: 安装

前提&#xff1a; 安装jdk1.8&#xff0c; 并设置java_home 和path环境变量。 ​​​​​​1. download Apache JMeter - Download Apache JMeter 2. 解压jmeter包 3. 安装插件Install :: JMeter-Plugins.org 下载jar包&#xff0c;放到lib/ext目录 4. 打开jmeter &#xff0…

安装Node.js环境,安装vue工具

一、安装Node.js 去官方网站自行安装自己所需求的安装包 这是下载的官方网站 下载 | Node.js 中文网 给I accept the terms in the License Agreement打上勾然后点击Next 把安装包放到自己所知道的位置,后面一直点Next即可 等待它安装好 然后winr打开命令提示符cmd 二、安装…