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.rhkb.cn/news/224389.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用内网穿透工具实现Java远程连接本地Elasticsearch搜索分析引擎

文章目录 前言1. Windows 安装 Cpolar2. 创建Elasticsearch公网连接地址3. 远程连接Elasticsearch4. 设置固定二级子域名 前言 简单几步,结合Cpolar 内网穿透工具实现Java 远程连接操作本地分布式搜索和数据分析引擎Elasticsearch。 Cpolar内网穿透提供了更高的安全性和隐私保…

【计算机视觉中的多视图几何系列】深入浅出理解针孔相机模型

温故而知新,可以为师矣! 一、参考资料 《计算机视觉中的多视图几何-第五章》-Richard Hartley, Andrew Zisserman. 二、针孔模型相关介绍 1. 重要概念 1.1 投影中心/摄像机中心/光心 投影中心称为摄像机中心,也称为光心。投影中心位于一…

50个免费的 AI 工具,提升工作效率(附网址)

上次我们已经介绍了20个精选的提高工作效率的免费AI工具,但如果你觉得这些AI工具还不过瘾的话,想进一步成为职场中最了解AI的人,本文将汇总介绍免费最新的50个AI工具。 DeepSwap DeepSwap 是一个基于 AI 的工具,适用于想要制作令人…

给零基础朋友的编程课07 - 代码

给零基础朋友的编程课07-初识色彩、初识变量、案例3讲解_哔哩哔哩_bilibili Code: // // 案例3 // //// -设定画面- // size(1000, 1000); // 设置画面大小 background(7, 119, 132); // 设置背景颜色// - 绘画 - //// 1 绘制垂线 // 设定线条风格 …

WebAssembly 的魅力:高效、安全、跨平台(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Topaz Video AI 视频修复工具(内附安装压缩包win+Mac)

目录 一、Topaz Video AI 简介 二、Topaz Video AI 安装下载 三、Topaz Video AI 使用 最近玩上了pika1.0和runway的图片转视频,发现生成出来的视频都是有点糊的,然后就找到这款AI修复视频工具 Topaz Video AI。 一、Topaz Video AI 简介 Topaz Video…

解决ELement-UI三级联动数据不回显

目录 一.处理数据时使用this.$set方法来动态地设置实例中的属性,以确保其响应式。 二.检查数据格式是否正确 三.绑定v-if 确保每次执行 四.完整代码 一.处理数据时使用this.$set方法来动态地设置实例中的属性,以确保其响应式。 二.检查数据格式是否正确…

Milvus数据一致性介绍及选择方法

1、Milvus 时钟机制 Milvus 通过时间戳水印来保障读链路的一致性,如下图所示,在往消息队列插入数据时, Milvus 不光会为这些插入记录打上时间戳,还会不间断地插入同步时间戳,以图中同步时间戳 syncTs1 为例&#xff0…

Redis数据库——键过期时间

一.设置键的生存时间或者过期时间 我们可以在Redis客户端输入命令,可以以秒或者毫秒精度为数据库中的某个键设置生存时间,在指定秒数或者毫秒数之后,服务器会自动删除生存时间为0的键。 1.1 设置过期时间 Redis有四个不同的命令可以用于设置键…

【网络编程】基于UDP数据报实现回显服务器/客户端程序

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论💌 前言 我们如果…

插入排序详解(C语言)

前言 插入排序是一种简单直观的排序算法,在小规模数据排序或部分有序的情况下插入排序的表现十分良好,今天我将带大家学习插入排序的使用。let’s go ! ! ! 插入排序 插入排序的基本思想是将待排序的序列分为已排序和未排序两部分。初始时&#xff0c…

3D模型人物换装系统(二 优化材质球合批降低DrawCall)

3D模型人物换装系统 介绍原理合批材质对比没有合批材质核心代码完整代码修改总结 介绍 本文使用2018.4.4和2020.3.26进行的测试 本文没有考虑法线贴图合并的问题,因为生成法线贴图有点问题,放在下一篇文章解决在进行优化 如果这里不太明白换装的流程可以…

Spark Shell的简单使用

简介 Spark shell是一个特别适合快速开发Spark原型程序的工具,可以帮助我们熟悉Scala语言。即使你对Scala不熟悉,仍然可以使用这个工具。Spark shell使得用户可以和Spark集群交互,提交查询,这便于调试,也便于初学者使用…

蓝桥杯c/c++程序设计——数位排序

数位排序【第十三届】【省赛】【C组】 题目描述 小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。 当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。 例如&#xff0…

【序列化和反序列化】

🍁什么是序列化和反序列化? 🍁典型解析🍁拓展知识仓🍁如何进行序列化和反序列化🍁未实现Serializable,可以序列化吗? 🍁典型解析 在Java中,我们可以通过多种方式来创建对…

大师计划1.0 - log2 CRTO笔记

CRTOⅠ笔记 log2 这个笔记是我在2023年11月23日-12月22日中,学习CRTO所做的一些笔记。 事实上TryHackMe的路径和htb学院包含了许多CRTO的知识并且甚至还超出了CRTO(CS除外),所以很多东西在THM和htb学院学过,这次CRTO等…

如何使用PatchaPalooza对微软每月的安全更新进行全面深入的分析

关于PatchaPalooza PatchaPalooza是一款针对微软每月安全更新的强大分析工具,广大研究人员可以直接使用该工具来对微软每月定期推送的安全更新代码进行详细、全面且深入的安全分析。 PatchaPalooza使用了微软MSRC CVRF API的强大功能来获取、存储和分析安全更新数…

探索 HTTP 请求的世界:get 和 post 的奥秘(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

MY FILE SERVER: 1

下载地址 https://download.vulnhub.com/myfileserver/My_file_server_1.ova 首先我们需要发现ip 我的kali是59.162所以167就是靶机的 然后我们拿nmap扫一下端口 nmap -sV -p- 192.168.59.167 扫完发现有七个端口开放 按照习惯先看80 没看到有啥有用信息,用nikto扫一下 nik…

Kafka日志文件存储

日志文件 kafka在server.properties配置文件中通过log.dir属性指定了Kafka的日志存储路径 核心文件 1. log文件 实际存储消息的日志文件, 大小固定1G(参数log.segment.bytes可配置), 写满后就会新增一个新的文件, 文件名是第一条消息的偏移量 2. index文件 以偏移量为索引…