标准库占绝大多数,自己买的板子跟的资料也一般是标准库,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库相关推荐

  1. STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数

    STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数 一.步进电机闭环驱动器 二.CubeMx配置 1.Clock Configuration 2.脉冲端 定时器配置 3. ...

  2. STM32从零到一,从标准库移植到HAL库,UART串口1以DMA模式收发不定长数据代码详解+常见问题 一文解析

    前言 本文的参考资料 感谢提供标准库版本的CSDN同学:这两篇文章至少是我看过的最详细的标准库配置DMA版本.而且代码实测稳定能用. STM32 | DMA配置和使用如此简单(超详细)_...| .. ...

  3. STM32系列——手把手教你将SYN6288语音播报模块的标准库程序转为hal库使用

    目录 前言 1. 原理 2. Cubmx配置 3. keil5编写代码 3.1 main.c 3.2 syn6288.c 3.3 syn6288.h 前言 本教程基于stm32f103c8t6最小系统 ...

  4. stm32 IOT_基于STM32平台的cubeMX和HAL库详解

    课程简介: <朱有鹏老师单片机完全学习系列课程>总共5季,其中第1.2季是51单片机学习,第3.4.5季是STM32单片机与RTOS学习.整个课程时长约250小时,是一套零基础.全面系统. ...

  5. STM32单片机开发应用教程 (HAL库版) ---基于国信长天嵌入式竞赛实训平台(CT117E-M4)教程汇总 与第一章 硬件平台简介

    写在前面-- 作为<STM32单片机开发应用教程(HAL库版)-基于国信长天嵌入式竞赛实训平台(CT117E-M4)>教程汇总,第一章将介绍国信长天嵌入式竞赛实训平台(CT117E-M4) ...

  6. STM32学习笔记-SMT32使用HAL库UART中断方式使用

    目录 1.引言 2.配置 3.流程 1.引言 近来需要使用蓝牙模块,再了解到蓝牙模块等无线模块许多使用串口透传,便决定在研究一下串口UART 的使用方法. 由于用的板子种类每次都不一样,有F103 有 ...

  7. STM32串口通信原理及HAL库代码stm32f1xx_hal_uart.c阅读分析

    原理性说明: //参考网址:https://blog.csdn.net/u010561799/article/details/89526266 在USART的发送端有2个寄存器,一个是程序可以看到的U ...

  8. stm32蓝牙遥控小车(hal库)

    一.cubemx配置 我使用的板子是stm32f103rct6,这里我们使用串口1,选择异步模式,注意波特率的选择,一般是9600或者115200,如果波特率选择不对的话是不能进行通讯的(我小车怎么也 ...

  9. STM32 Cube MX以及STM32 H750 XBH6新建工程,HAL库,LL库

    最近因为需要学习研究一下FDCANFD\quad CANFDCAN模块,所以买了一块野火的STM32H750XBH6STM32H750XBH6STM32H750XBH6的开发板.拿到开发板之后准备像S ...

最新文章

  1. 在FreeBSD下安装mysql+apache+php
  2. SCCM 2012系列1 服务器准备上
  3. 技术是最求 买卖是境界
  4. linux man命令的1和1p,Linux中man命令的使用方法再解释
  5. BOOST_VMD_GET_TYPE宏相关的测试程序
  6. R语言学习——处理数据对象的实用函数
  7. 【emWin】例程六:设置颜色
  8. 2013计算机一级考试综合试题答案,2013全国计算机等级考试试题题库及答案.doc
  9. Adobe illustrator 导出可编辑文本 - 连载 18
  10. 数据结构基础(16) --树与二叉树
  11. JavaScript 之 截取字符串函数
  12. 一场面试过后—移动前端开发
  13. Vue + Refresh Token
  14. 唱歌腹式呼吸法的运用技巧
  15. HTML href指向function
  16. 4.1图像分割之区域生长法
  17. Java线程等待唤醒机制(加深理解)
  18. DOS下Debug工具使用
  19. opencv-Python 目标跟踪(一)《Meanshift算法、Camshift算法》
  20. springboot搭建支付宝手机网站支付

热门文章

  1. 生活无大事,生活无小事,需用心经营才行
  2. php微信开发 (获取用户地理位置)
  3. C语言数组讲解(1)一维数组的创建和初始化。
  4. Java(9)接口练习 运动员和教练
  5. Py之utils:Python库之utils的简介、安装、使用方法之详细攻略
  6. 如何用计算机算三角函数的度分秒,用计算器算三角函数!!!怎样输入度分秒!!!
  7. ▶链路层第三弹◀ 两种信道下的数据链路层【下】广播通信CSMA/CD
  8. OpenVP* 连接失败 查看日志报错:“There are no TAP-Windows adapters on this system ..... “
  9. 显示不了图啊阴功.....
  10. FCPX插件:56种高动态HDR视频调色预设HDR Look Effects