HAL库的常用库函数(根据学习而更新)

目录

一、常用的GPIO相关HAL库函数

1、GPIO的初始化

2、配置GPIO引脚输出电平

3、切换指定引脚的电平,电平的翻转

4、读取指定GPIO引脚的电平

 5、结构体 GPIO_InitTypeDef (引脚)定义:

6、高低电平的表示

7、延时函数(提供了最小延时ms级别)

二、EXTI模式的中断

 1、中断产生回调函数

三、定时器Timer

 1、更新中断回调函数

2、在中断模式下启动TIM定时器

3.PWM

1. 开始产生PWM信号,使能定时器

2.修改比较值,修改占空比

4.计时器

1.启用TIM外设(使能定时器计数)

2.在运行时设置TIM计数器寄存器值

3.在运行时获取TIM计数器寄存器值

4.禁用TIM外设

5.启动TIM Base生成

6.停止生成TIM Base

四、串口发送/接收函数

1.以阻塞模式发送一定数量的数据

2.以阻塞模式接收一定数量的数据

3.以中断的方式接收和发送 

五、独立看门狗IWDG

1.刷新IWDG(俗称喂狗)

六、窗口看门狗WWDG

1.刷新WWDG(俗称喂狗)

七、DMA数据搬运

1、内存到内存搬运

1.启动DMA传输

2.获取DMA通道挂起标志

2、内存到外设搬运

1.以DMA模式发送一定数量的数据

3、外设到内存搬运

1.启用指定的UART中断。

2.在DMA模式下接收一定量的数据

3.检查是否设置了指定的UART标志

4.清除UART IDLE挂起标志

5.停止DMA传输

6.返回当前DMA通道传输中剩余数据单元的数量

八、ADC模数转换器

1.开启ADC,开启常规组转换(启动ADC单次转换)

2.等待常规组转换完成(等待ADC转换完成)

3.读取ADC转换数据

 九、IIC

1.以阻塞方式将一定数量的数据写入特定的内存地址

十、SPI


一、常用的GPIO相关HAL库函数

1、GPIO的初始化

void HAL_GPIO_Init ( GPIO_TypeDef * GPIOx , GPIO_InitTypeDef * GPIO_Init );

2、配置GPIO引脚输出电平

void HAL_GPIO_WritePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin , GPIO_PinState
PinState );

3、切换指定引脚的电平,电平的翻转

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

4、读取指定GPIO引脚的电平

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

 5、结构体 GPIO_InitTypeDef (引脚)定义:

typedef struct
{
uint32_t Pin ;//指定要配置的GPIO引脚
uint32_t Mode ;//选择所选引脚的工作模式
uint32_t Pull ;//指定所选引脚的上拉或下拉激活
uint32_t Speed ;//指定所选引脚的速度
} GPIO_InitTypeDef ;//把结构体命名为 GPIO_InitTypeDef

6、高低电平的表示

typedef enum
{
  GPIO_PIN_RESET = 0u,//低电平
  GPIO_PIN_SET//高电平
} GPIO_PinState;

7、延时函数(提供了最小延时ms级别)

 __weak void HAL_Delay(uint32_t Delay)

注意:在中断服务函数里调用HAL_Delay函数,如果直接调用就会造成系统卡死。

原因:程序在执行的时候默认把滴答定时器的中断优先级设置为最低,其他中断源很容易把他打断导致卡死

解决:在main函数里使用以下函数提高滴答定时器的中断优先级(提升至0)

HAL_NVIC_SetPriority ( SysTick_IRQn , 0 , 0 );//设置中断的优先级

二、EXTI模式的中断

定义:
EXTI  可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所不同。
产生中断线路目的是把输入信号输入到 NVIC(中断控制器,处理中断的),进一步会运行中断服务函数,实现功能,这样是软件级的。而 产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。
中断触发类型:
typedef enum
{
EXTI_Trigger_Rising = 0x08 , // 上升沿
EXTI_Trigger_Falling = 0x0C , // 下降沿
EXTI_Trigger_Rising_Falling = 0x10 // 上升沿和下降沿都触发
} EXTITrigger_TypeDef ;

 1、中断产生回调函数

(简而言之就是发生中断就会调用这个函数,需要我们重写)

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

传递过来的是发生中断的GPIO口

三、定时器Timer

STM32之定时器

  • PSC:预分频器的值
  • ARR:自动重装载值
  • Tclk:时钟频率
  • Tout:设定的时间
  • 1Mhz=1000000hz(次/秒)
  • 周期(s)=频率(hz)的倒数

 1、更新中断回调函数

(就是当定时器溢出时需要重载产生的中断,需要我们重写)

void HAL_TIM_PeriodElapsedCallback ( TIM_HandleTypeDef * htim )

2、在中断模式下启动TIM定时器

HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)

参数一:定时器句柄

3.PWM

STM32之定时器--PWM控制SG90舵机

1. 开始产生PWM信号,使能定时器

HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

参数1:定时器句柄

参数2:产生PWM的信号通道

2.修改比较值,修改占空比

__HAL_TIM_SetCompare(__HANDLE__, __CHANNEL__, __COMPARE__);

参数1:定时器句柄

参数2:产生PWM的信号通道

参数3:需要设定的比较值

4.计时器

1.启用TIM外设(使能定时器计数)

__HAL_TIM_ENABLE(__HANDLE__) 

参数1:定时器句柄

2.在运行时设置TIM计数器寄存器值

修改计数器的值

__HAL_TIM_SetCounter(__HANDLE__, __COUNTER__)

参数1:定时器句柄

参数2:指定计数器寄存器的新值

3.在运行时获取TIM计数器寄存器值

__HAL_TIM_GetCounter(__HANDLE__)

参数1:定时器句柄

4.禁用TIM外设

关闭定时器

__HAL_TIM_DISABLE(__HANDLE__)

参数1:定时器句柄

5.启动TIM Base生成

启动定时器计时

 HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)

参数1:定时器句柄

6.停止生成TIM Base

停止定时器计时

HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)

参数1:定时器句柄

四、串口发送/接收函数

1.以阻塞模式发送一定数量的数据

串口发送数据,使用超时管理机制
HAL_UART_Transmit(UART_HandleTypeDef *huart,
                                    const uint8_t *pData,
                                    uint16_t Size,
                                    uint32_t Timeout)
参数1: UART_HandleTypeDef 结构体类型指针变量--串口句柄
参数2:指向要发送的数据地址
参数3:要发送的数据大小,以字节为单位
形参 4 :设置的超时时间,以 ms 单位

2.以阻塞模式接收一定数量的数据

串口接收数据,使用超时管理机制

HAL_UART_Receive(UART_HandleTypeDef *huart,

                                    uint8_t *pData,

                                    uint16_t Size,

                                    uint32_t Timeout)

参数1: UART_HandleTypeDef 结构体类型指针变量--串口句柄
参数2:指向要接收的数据地址
参数3:要接收的数据大小,以字节为单位
形参 4 :设置的超时时间,以 ms 单位

3.以中断的方式接收和发送 

HAL_UART_Transmit_IT(); 串口中断模式发送  (没用过)
HAL_UART_Receive_IT(); 串口中断模式接收
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
作用:以中断的方式接收指定字节的数据
形参 1 UART_HandleTypeDef 结构体类型指针变量
形参 2 是指向接收数据缓冲区
形参 3 是要接收的数据大小,以字节为单位
此函数执行完后将清除中断,需要再次调用以重新开启中断。

stm32串口中断--接收字符串

中断回调函数需要重写

往串口发送数据时可以将printf重映射,然后使用printf来发送数据,printf的使用方法和之前一样

五、独立看门狗IWDG

HTM32看门狗

1.刷新IWDG(俗称喂狗)

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)

参数一:指向IWDG_HandleTypeDef结构的指针(独立看门狗的句柄)

返回值:HAL状态结构定义

六、窗口看门狗WWDG

1.刷新WWDG(俗称喂狗)

HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg)

参数一:指向WWDG_HandleTypeDef结构体的指针(窗口看门狗的句柄)

返回值:HAL状态结构定义

七、DMA数据搬运

STM32搬运工之DMA

1、内存到内存搬运

1.启动DMA传输

HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma,

                                                                uint32_t SrcAddress,

                                                                uint32_t DstAddress,

                                                                uint32_t DataLength)

参数一:DMA通道的句柄

参数二:源内存缓冲区地址

参数三:目标内存缓冲区地址

参数四:要从源传输到目的的数据长度,注意:需要乘以sizeof(uint32_t)

返回值:HAL状态结构定义(OKbusyERRORTIMEOUT

2.获取DMA通道挂起标志

#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)   

参数一: HANDLE DMA 通道句柄
参数二: FLAG ,数据传输标志。 DMA_FLAG_TCx 表示数据传输完成标志
返回值: FLAG 的值( SET/RESET )SET表示正在传输,RESET表示空闲

2、内存到外设搬运

1.以DMA模式发送一定数量的数据
将数据通过串口DMA发送

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart,

                                                                                const uint8_t *pData,

                                                                                uint16_t Size)

参数一: 串口句柄
参数二: 待发送数据首地址
参数三: 待发送数据长度
返回值: HAL_StatusTypeDef HAL 状态( OK busy ERROR TIMEOUT

3、外设到内存搬运

1.启用指定的UART中断。

#define __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__)

参数一: HANDLE ,串口句柄
参数二: INTERRUPT ,需要使能的中断
返回值:无
2.在DMA模式下接收一定量的数据

HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart,

                                                                               uint8_t *pData,

                                                                               uint16_t Size)

参数一: 串口句柄
参数二: 接收缓存首地址(指向接收缓冲区的指针)
参数三: 接收缓存长度
返回值: HAL 状态( OK busy ERROR TIMEOUT
3.检查是否设置了指定的UART标志
判断IDLE标志位是否被置位,检测串口是否空闲

#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__)

参数一: HANDLE ,串口句柄
参数二: FLAG ,需要查看的 FLAG
这里用UART_FLAG_IDLE: Idle Line detection flag(空闲线路检测标志)
返回值: FLAG 的值
4.清除UART IDLE挂起标志

#define __HAL_UART_CLEAR_IDLEFLAG(__HANDLE__) 

参数一: HANDLE ,串口句柄
返回值:无
5.停止DMA传输

HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)

参数一: UART_HandleTypeDef *huart ,串口句柄
返回值: HAL_StatusTypeDef HAL 状态( OK busy ERROR TIMEOUT
6.返回当前DMA通道传输中剩余数据单元的数量

可用来计算数据的长度

#define __HAL_DMA_GET_COUNTER(__HANDLE__) 

参数一: HANDLE ,串口句柄
返回值:未传输数据大小

八、ADC模数转换器

STM32之模数转换器ADC

1.开启ADC,开启常规组转换(启动ADC单次转换)

HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)

参数一:ADC句柄

返回值:HAL状态(OKbusyERRORTIMEOUT

2.等待常规组转换完成(等待ADC转换完成)

HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc,

                                                                                    uint32_t Timeout)

参数一:ADC句柄

参数二:超时值,单位为毫秒

返回值:HAL状态(OKbusyERRORTIMEOUT

3.读取ADC转换数据

uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)

参数一:ADC句柄

返回值:ADC组定期转换数据

 九、IIC

STM32之IIC协议

1.以阻塞方式将一定数量的数据写入特定的内存地址

HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c,

                                                                        uint16_t DevAddress,

                                                                        uint16_t MemAddress,

                                                                        uint16_t MemAddSize,

                                                                        uint8_t *pData,

                                                                        uint16_t Size,

                                                                        uint32_t Timeout)

参数一: I2C 设备句柄
参数二: 目标器件的地址,七位地址必须左对齐
参数三: 目标器件的目标寄存器地址
参数四: 目标器件内部寄存器地址数据长度
参数五: 待写的数据首地址
参数六: 待写的数据长度
参数七: 超时时间
返回值: HAL 状态( OK busy ERROR TIMEOUT

十、SPI

STM32之SPI协议

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

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

相关文章

Java架构师系统架构需求分析实战

目录 1 导语2 需求分析实战3 核心方法论-架构立方体4 功能性模型-模块定义5 功能性模型-模块关系图6 功能性模型-模块细化 想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导语 架构设计的实战和思维方法的讨论,主要聚焦于需求分析的重要性和方…

buuctf-Misc 题目解答分解97-99

97.[BSidesSF2019]zippy 下载完就是一个流量包 追踪tcp nc -l -p 4445 > flag.zip unzip -P supercomplexpassword flag.zip Archive: flag.zip 压缩包密码 supercomplexpassword 保存为 flag.zip 解压得到flag 98.[GUET-CTF2019]虚假的压缩包 先从虚假的压缩包入手 &am…

逆向P1P2总结

字节八位 word 16位 deword 32 位 00 00 00 e8 是存储32位信息的起点 不是程序运行的起点 为什么电脑有32位与64位之分 寻址宽度 以字节为单位 0xfffffff 1 就是最大容量 转为十进制为 4294967296 / 1024 (k)/1024 (kb)/ 1…

软件测试面试八股文——基础篇

5)错误推测法:是基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法 6)正交实验法 7)判定表法 8)测试大纲法 3、提交缺陷的八大要素 1)缺陷编号&#xff1a…

数据通信网络基础华为ICT网络赛道

目录 前言: 1.网络与通信 2.网络类型与网络拓扑 3.网络工程与网络工程师 前言: 数据通信网络基础是通信领域的基本概念,涉及数据传输、路由交换、网络安全等方面的知识。华为ICT网络赛道则是华为公司提出的一种技术路径,旨在通…

合并的单元格如何填充连续的序号

希望你以后碰到合并的单元格,不在一个个输入序号,用以下操作帮你输入连续的序号。 一、操作过程如下 1.有一个基准的单元格在同一列,而且这个基准单元格必须得是序号为1的单元格的上面的一个单元格,这样的话后面才能自动递增&am…

Cesium.js三维地图的实现(依托天地图CDN文件)

零、技术选型: Vue2、VueCli5、天地图、Cesium.js 一、通过天地图官网案例实现 需要引入天地图官方提供的CDN链接访问Cesium.js相关文件 相关文件: https://api.tianditu.gov.cn/cdn/demo/sanwei/static/cesium/Cesium.js https://api.tianditu.gov.cn/…

大数据技术学习笔记(十一)—— Flume

目录 1 Flume 概述1.1 Flume 定义1.2 Flume 基础架构 2 Flume 安装3 Flume 入门案例3.1 监控端口数据3.2 实时监控单个追加文件3.3 实时监控目录下多个新文件3.4 实时监控目录下的多个追加文件 4 Flume 进阶4.1 Flume 事务4.2 Flume Agent 内部原理4.3 Flume 拓扑结构4.3.1 简单…

PyQt5和Qt designer的详细安装教程

Qt designer界面和所有组件功能的详细介绍参考:https://blog.csdn.net/qq_43811536/article/details/135186862?spm1001.2014.3001.5501 目录 0. 写在前面1. Anaconda创建虚拟环境2. 安装PyQt5和Qt designer3. 测试安装成功 0. 写在前面 Qt Designer是Qt提供的一种…

智慧互联网银行引领金融变革,开源网安VulHunter护航数字化发展

某银行作为国内知名的互联网银行,以构建“智慧型互联行”为总体战略目标,始终坚持科技赋能金融的理念。通过AI、大数据、云计算等数字技术与金融业务的探索融合,实现以更低的成本为客户提供便捷、高效和优质体验的互联网金融服务。 架构升级助…

操作无法完成(错误 0x000006ba),Windows 11 PDF打印机无法使用解决办法

操作无法完成(错误 0x000006ba),Windows 11 PDF打印机无法使用解决办法 解决方式一 先重启一次电脑,看看是否可以解决问题。 解决方式二 重新启动 Printer Spooler 服务

【JAVA】黑马MybatisPlus 学习笔记【三】【拓展功能】

3.扩展功能 3.1.代码生成 在使用MybatisPlus以后,基础的Mapper、Service、PO代码相对固定,重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据库表结构生成PO、Mapper、Service等相关代码。只不过代码生成器同样要编码使用,…

【QT】可执行文件图标由png格式手动改为ico格式,Qt程序报错原因及解决方案

1问题说明: 在修改可执行文件图标时,由png格式手动改为ico格式,Qt程序会报错。 报错如下: 2解决办法: 登录网页 在线生成透明ICO图标——ICO图标制作,利用ico在线生成透明ICO图标 将生成的ico图标由favicon…

CSRF(Pikachu)

CSRF(get) 首先我们先登录账号 admin 密码是;123456 点击修改个人信息 用F12或者BP 抓包看看我们的url 那么构成的CSRF攻击payload为http://pikachu.shifa23.com/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sexboy&phonenum”手机…

如何申请云闪付支付接口?

随着移动支付的普及,越来越多的商家开始接受各种移动支付方式。而在众多移动支付工具中,云闪付支付接口因其安全、便捷的特点,成为了越来越多商家的首选。那么,如何申请云闪付支付接口呢?本文将为您详细介绍申请云闪付…

PaddleOCR 的使用,极简介绍

安装 参考github的官网就可以: github链接 简单的说,就是两句话: python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple pip install "paddleocr>2.0.1" # 推荐使用2.0.1版本 Python下的使用…

NAT协议的实现方式

在网络通信中,NAT协议(Network Address Translation,网络地址转换)扮演着关键角色,允许内部网络与外部网络之间进行有效的通信。 实现内外网之间网络地址转换的过程中,NAT采用了不同的实现方式,…

FL Studio 21最新版本for mac 21.2.2.3470中文解锁版

FL Studio 21最新版本for mac 21.2.2.3470中文解锁版是最新强大的音乐制作工具。它可以与所有类型的音乐一起创作出令人惊叹的音乐。它提供了一个非常简单且用户友好的集成开发环境(IDE)来工作。这个完整的音乐工作站是由比利时公司 Image-Line 开发的。…

了解OAuth 2.0以及社交登录认证授权流程

1.前言 目前在写一个电商项目,可以通过手机号进行注册登录,为了方便用户使用本平台的系统,引入社交登录功能,这里使用的是gittee。 2.OAuth 2.0介绍 当谈到网络安全和身份验证时,OAuth 2.0(开放授权 2.0&a…

AXI总线协议---关键信号波形图分析

写过程协议图 读过程协议图 读协议执行顺序图 写协议顺序图 单箭头表示两个信号谁先有效无所谓,双箭头表示必须要等到前一个信号有效才能将后面的信号有效 如何体现协议图中的通道理解 声明:以上图均采用AMBA总线文档图 写过程关键信号 主机 写地址—M…
最新文章