论STM32标准库程序修改为HAL库

2024-02-24 07:48
文章标签 stm32 hal 标准 程序修改

本文主要是介绍论STM32标准库程序修改为HAL库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

标准库占绝大多数,自己买的板子跟的资料也一般是标准库,HAL库很少,不过要是使用STM32CubeMx配置,那么就是使用的HAL库了,而参考资料是标准库的,就没有办法用。
注意:
1.标准库与HAL库不兼容,不要想着直接拿来用了,比如标准库使用#include “stm32f10x.h”,HAL库使用#include “stm32f1xx_hal.h”
要让标准库程序使用HAL库时也可以正常运行得到想要的结果,有以下几种方法:
一、 将标准库程序中的每个函数内的代码修改为使用HAL库且同样效果的代码,
比如标准库中配置GPIO的代码直接就可以用STM32CubeMx配置为相同效果
二、根据标准库程序整个程序运行的原理使用HAL库中提供的函数实现,
比如使用IIC写入内存的代码可以使用HAL库中提供的函数HAL_I2C_Mem_Write
实现


先举例介绍第一种方法:
1. 外部中断
标准库:中断入口函数在stm32f10x_it.c中,修改void EXTI&_IRQHandler()
使用if(EXTI_GetITStatus(EXTI_Line2)==SET)判断是否产生中断
处理中断时,要清除中断线路挂起位(EXTI_ClearITPendingBit),以便下次使用
HAL库:在stm32f1xx_it.c中依然有中断入口函数void EXTI2_IRQHandler(void)
该函数调用了HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);,当该引脚产生中断事件时会调用该函数
最后会由HAL_GPIO_EXTI_Callback(GPIO_Pin);回调函数执行中断,该函数是可以被重定义的,复制该函数添加到main.c中就可以进行特定引脚的中断事件处理
在HAL库的回调函数和标准库的中断入口函数中的中断事件执行是差不多的
2. 引脚操作
51、STM32的标准库和HAL库对引脚都有基本的读取引脚状态和设置引脚的操作
51:P0 = 0x00; //置P0口为低电平,P08个IO口全为低电平
P0 = 0xff; //置P0口为高电平
注意P0有8个IO口,即从P0.0到P0.7,而0x00二进制就是0000 0000,效果就是P0.0到P0.7都是0,即低电平。
P0 = 0xC8;
51可以实现直接将八位二进制直接传递给8个IO口,只需一次传值;也可以单独对某个IO口设置,但HAL库只能一次对一个引脚操作
标准库:GPIO_SetBits(GPIOC,GPIO_Pin_All);将引脚置1,可以将多个引脚一起设置使用GPIOx->BSRR = GPIO_Pin;
GPIO_ResetBits(GPIOC,GPIO_Pin_All);将引脚置0,使用GPIOx->BRR = GPIO_Pin;
GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)读取引脚状态
HAL库:所有GPIO的操作函数在stm32f1xx_hal_gpio.h中,也定义了一些GPIO设置用到的参数
具体函数见stm32f1xx_hal_gpio.h,功能和标准库大致相同,有一个引脚反转函数HAL_GPIO_TogglePin
问题:如何使用HAL库实现向多个引脚写入八位十六进制数据?
51:cmd = 0xc8;
PC = cmd;
HAL库:cmd = 0xc8;


if(cmd&0x01)
{
HAL_GPIO_WritePin(GPIOC,D0_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOC,D0_Pin,GPIO_PIN_RESET);
}
if(cmd&0x02)
{
HAL_GPIO_WritePin(GPIOC,D1_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOC,D1_Pin,GPIO_PIN_RESET);
}
if(cmd&0x04)
{
HAL_GPIO_WritePin(GPIOC,D2_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOC,D2_Pin,GPIO_PIN_RESET);
}
if(cmd&0x08)
{
HAL_GPIO_WritePin(GPIOC,D3_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOC,D3_Pin,GPIO_PIN_RESET);
}
if(cmd&0x10)
{
HAL_GPIO_WritePin(GPIOC,D4_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOC,D4_Pin,GPIO_PIN_RESET);
}
if(cmd&0x20)
{
HAL_GPIO_WritePin(GPIOC,D5_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOC,D5_Pin,GPIO_PIN_RESET);
}
if(cmd&0x40)
{
HAL_GPIO_WritePin(GPIOC,D6_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOC,D6_Pin,GPIO_PIN_RESET);
}
if(cmd&0x80)
{
HAL_GPIO_WritePin(GPIOC,D7_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOC,D7_Pin,GPIO_PIN_RESET);
}

这个方法比较笨,是使用与运算直接判断八位二进制数据的各位是0还是1,然后设置相应引脚即可。
3. 直接操作寄存器
这个在标准库和HAL库中的使用是一样的,
标准库:例如 #define IIC_SDA_IN() {GPIOB->CRH &= 0XFFFF0FFF;GPIOB->CRH |= 8 << 12;GPIOB->BSRR = 1 << 11;}
其中GPIOB是在stm32f10x.h中定义的,其中BSRR、CRH等是GPIO结构体中的属性,结构体为:
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
HAL库:例如 #define LCD_RST_CLR GPIOC->BRR=1<<5
其中GPIOC是在stm32f103xe.h中定义的,BSRR,BRR等GPIO结构体的属性也是在该文件中定义的,具体结构体为:
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;

与标准库的GPIO结构体定义相同。
待续………

这篇关于论STM32标准库程序修改为HAL库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/741429

相关文章

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

C 标准库 - `<float.h>`

C 标准库 - <float.h> 概述 <float.h> 是 C 标准库中的一个头文件,它定义了与浮点数类型相关的宏。这些宏提供了关于浮点数的属性信息,如精度、最小和最大值、以及舍入误差等。这个头文件对于需要精确控制浮点数行为的程序非常有用,尤其是在数值计算和科学计算领域。 主要宏 <float.h> 中定义了许多宏,下面列举了一些主要的宏: FLT_RADIX:定义了浮点数的基数。

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

《C++标准库》读书笔记/第一天(C++新特性(1))

C++11新特性(1) 以auto完成类型自动推导 auto i=42; //以auto声明的变量,其类型会根据其初值被自动推倒出来,因此一定需要一个初始化操作; static auto a=0.19;//可以用额外限定符修饰 vector<string> v;  auto pos=v.begin();//如果类型很长或类型表达式复杂 auto很有用; auto l=[] (int

STM32CubeMX和HAL库-新建项目

目录 新建项目 选择开发板  MCU图形化配置界面总览 MCU配置 新建项目 新建项目包含选择MCU创建项目、选择开发板新建项目和交叉选择MCU新建项目三部分。 1. 选择MCU创建项目 单击主菜单项File→New Project,或Home视图上的ACCESS TO MCU SELECTOR 按钮,都可以打开的New Project from a MCU/MPU对话框。