STM32点灯实践(2)

  • 一、前言:
  • 二、HAL库
  • 三、实验工具
    • 1、STM32cubeMx的安装
    • 2、安装HAL库
  • 四、具体实验
    • 1、keil仿真调试
    • 2、上板即可
    • 3、观察GPIO端口的输出波形
  • 五、总结
  • 六、参考

一、前言:

在这之前,我们介绍了stm32利用寄存器实现点灯实验,但是现在我们来看一下更加简单的方式利用HAL库实现该功能,调用库是我们学习STM32最重要的一个点,利用我们目前已经封装好的库,可以更加简单轻松的实现我们需要的功能。

二、HAL库

基于寄存器方式的开发,实质上就是查找手册配置寄存器的过程,通过寄存器完成引脚的配置初始化和对应的操作。使用HAL库可以简化配置寄存器的过程。

HAL库设计思想
HAL库借鉴面向对象的思想,将外设和引脚抽象为具有同样属性和操作的对象,定义数据类型和接口函数来描述片内外设,通过实例化数据和实现接口函数来操作引脚

HAL库实现方式

  • 构造存储区域:设计相应的数据类型,用于存放配置到外设寄存器的参数
  • 设计接口函数:将数据类型中的参数写入到对应的外设寄存器中

以GPIO模块为例
stm32f4xx_hal_gpio.h文件完成数据类型的定义及接口函数的声明
stm32f4xx_hal_gpio.c文件完成接口函数的实现

GPIO外设数据类型

  • 引脚初始化:采用结构体类型实现,用于定义引脚的序号、工作模式、输出速度等基本特性,结构体成员变量的参数值通过宏定义实现
  • 引脚电平状态:采用枚举类型实现,用于定义引脚的电平状态,采用枚举类型可限定变量取值范围。
  • 引脚所属端口:采用结构体指针实现,用于访问该端口所对应的寄存器组。不同型号的微控制器数量不同,端口数据类型的定义在以芯片型号命名的头文件中。

GPIO外设接口函数
1.初始化函数

  • HAL_GPIO_Init:用于完成引脚的初始化
  • HAL_GPIO_DeInit:用于复位引脚到初始状态

2.控制函数

  • HAL_GPIO_ReadPin :用于读取引脚电平状态
  • HAL_GPIO_WritePin :用于设置引脚电平状态
  • HAL_GPIO_TogglePin :用于翻转引脚电平状态
    3.配置函数
  • HAL_GPIO_LockPin:用于锁定引脚配置

**使用HAL库:**基于库函数开发,我们只需要了解库函数中相关接口函数的功能,按要求传入参数,利用返回值完成操作即可,不需要过多了解底层硬件。
库工程必要文件的调用关系:

**这个图省略了DSP 核和实时系统层部分的文件关系。**在实际的使用库开发工程的过程中,我们把位于CMSIS 层的文件包含进工程,除了特殊系统时钟需要修system_stm32f4xx.c,其它文件丝毫不用修改,也不建议修改。
对于位于用户层的几个文件,就是我们在使用库的时候,针对不同的应用对库文件进行增删(用条件编译的方法增删)和改动的文件。

三、实验工具

  • mcuisp: https://pan.baidu.com/s/1WyvtnCJad_BqXbwTzhcofw 提取码:h2xc
  • STM32F103C8T6的最小系统板
  • STM32cubeMx
  • USB To LLT
  • 面板板、杜邦线、LED灯
    全套买下来大概40块钱,感兴趣的朋友可以自己买来玩一玩

    这里可以参考之前利用寄存器实现LED点亮实验,查看如何连接最小系统板:
    寄存器点灯

1、STM32cubeMx的安装

下载可以通过官网下载,不过在官网需要邮箱等等,当时作者下载的时候就吃了点苦头,我百度网盘放了我下好的文件,可根据自己需求选择:
1.点击安装包一直点击NEXT,同意安装许可

(2)勾选第一个即可,第二个选项是是否同意ST公司收集你的个人使用信息等

(3)选择安装位置,默认位置是安装在C盘中(注意:安装位置不要出现中文):

(4)直接点NEXT,其他不用设置 之后开始安装:


(5)这里就安装完成了

2、安装HAL库

STM32 HAL固件库是Hardware Abstraction Layer的缩写,中文名称是:硬件抽象层。HAL库是ST公司为STM32的MCU最新推出的抽象层嵌入式软件,为更方便的实现跨STM32产品的最大可移植性。HAL库的推出,可以说ST也慢慢的抛弃了原来的标准固件库,这也使得很多老用户不满。但是HAL库推出的同时,也加入了很多第三方的中间件,有RTOS,USB,TCP / IP和图形等等。
和标准库对比起来,STM32的HAL库更加的抽象,ST最终的目的是要实现在STM32系列MCU之间无缝移植,甚至在其他MCU也能实现快速移植。
并且从16年开始,ST公司就逐渐停止了对标准固件库的更新,转而倾向于HAL固件库和 Low-layer底层库的更新,停止标准库更新,也就表示了以后使用STM32CubeMX配置HAL/LL库是主流配置环境;

(1)打开CuBEMx,点击HELP->Manage embedded software packages :

(2)会跳出来一个选择型号界面,选择你系统板的类型,勾选上你要安装的HAL库, 点击“Install Now” 直到安装成功。 如下图:


(3)安装好了HAL库之后,回到主页面,点击ACCESS TO MCU SELECTOR 建立新的工程,这里提前在D盘建立一个CuBe的工程文件夹,用于存放CuBe的工程,依然最好不要用中文命名。

(4)在part name里选择自己的芯片,点击信息栏中的具体芯片信息选中,点击start project:

(5)点击system core,进入SYS,在debug下选择serial wire:

(6)配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,我们要用是GPIO接口,而这些接口都在APB2里:

(7)接下来观察时钟架构,APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上:

(8)将hse那里设为Crystal/Ceramic Resonator:

(9)接下来就是点击相应的引脚设置输出寄存器了,就是output那一项,一共选了三个,是PA5,PB9,PC14:


(10)点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM:

(11)进入 code generate界面,选择生成初始化.c/.h文件,后面点击generate code,选择open project,然后就到KEIL5了:

四、具体实验

1、keil仿真调试

(1)打开建立的文件,在MDK-ARM文件夹下打开 .uvprojx文件(或者在建好CuBe最后选择open project)

(2)打开main.c文件,滑倒主函数那一部分:

(3)将下面代码放入主函数中(替代里面的内容)

SystemClock_Config();//系统时钟初始化MX_GPIO_Init();//gpio初始化while (1){     HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4亮灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯HAL_Delay(1000);//延时1sHAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯HAL_Delay(1000);//延时1s        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯HAL_Delay(1000);//延时1s}

(4)即可点击调试按钮生成 . hex 文件
这一步可以翻看一下keil的基本设置,包括生成 .hex 文件等等。

2、上板即可

这里烧录与之前的文章相同,具体我就不解释了。如图:

3、观察GPIO端口的输出波形

(1)Target界面中,选择跟正确的晶振大小,我使用的是8MHz的外部晶振。这个选项在软件仿真中起到很重要的作用,如果选择错误,那么波形一定是错误的,因为时间不准确。

(2)Debug页的设置:
这里Parameter需要自己输入 -pSTM32F103c8

(3)点击Debug,进入调试界面,并选择逻辑分析仪:

(4)给逻辑分析仪中添加要观察的IO口

(5)添加要观察的引脚:

注意!!务必将Display Type处设置为Bit!!
(6)设置好之后,逻辑分析仪左侧会出现刚才设置的两个IO口,点击全速运行

执行一段时间后,点击停止按钮即可

(7)最终得到以下图像

五、总结

在这个过程中,利用CuBe建立工程比较复杂比较耗时间,最开始大家可能不太熟悉,所以可以多实验一下,不一定非要建立好工程,只是熟悉大概流程最后不用保存博客就行。
总之,对于利用HAL库实现点亮LED灯比寄存器容易,大家主要的问题就是不太熟悉过程,熟悉之后会好很多,通过这个过程可以学到很多东西,收获满满。

六、参考

1

2

嵌入式STM32入门之STM32点灯实践(2)——HAL库相关推荐

  1. 智能安全辅助驾驶系统 STM32——MQ3酒精传感器的应用(HAL库)

    智能安全辅助驾驶系统 STM32--MQ3酒精传感器的应用(HAL库) 准备: MQ3酒精传感器一个.STM32开发板(本实验采用F103RCT6,其他型号可参考本文同理设置) 一.MQ3酒精传感器的 ...

  2. 嵌入式STM32入门之STM32基础串口通信

    STM32基础串口通信 一.前言 二.串口协议 (1)浅谈设备通信方式 (2)具体串口协议 (3)STM32的串口通信 (4)RS-232通信协议 (5)USB To TTL(CH340) 5.1 C ...

  3. 基于STM32移植U8g2图形库——OLED显示(HAL库)

    前言:本文主要内容为将优秀的图形库U8g2移植到STM32单片机上,用于OLED显示精美UI.其实,目前GitHub上有需要优秀的开源GUI库,但是大部分的GUI解决方案并不适合0.96 OLED(1 ...

  4. STM32【H7】理论——综述、HAL库简述

    文章目录 1. STM32H7芯片简介 1.1 STM32H7与STM32F1.F4系列芯片的区别 1.2 硬件框图 1.3 STM32H7各型号对比 1.4 总线框图和时钟 1.5 AXI总线 1. ...

  5. STM32入门-学习STM32要掌握的内容

    STM32芯片架构 STM32F103系列芯片的系统架构如下: STM32芯片基于ARM公司的Cortex-M3内核,由ST公司设计生产,内核与总线矩阵之间有I(指令).S(系统).D(数据)三条信号 ...

  6. 洋桃电子STM32物联网入门30步笔记一、HAL库和标准库的区别

  7. 基于STM32的ESP8266获取天气数据(HAL库)

    一.介绍 进入主题,下图正是购买的esp8266模块 对于esp01,引脚图如下 二.刷固件 在使用AT指令时,有时候会无法进入AT模式,也就是在串口发送指令,无应答.除了检查引脚和TTL模块是否接错 ...

  8. STM32入门1——STM32CubeMX使用说明

    STM32入门1--STM32相关资源介绍 常用网站 CubeMx使用介绍 常用网站 Keil5 : http://www.keil.com/. pack包下载. IAR : https://www. ...

  9. STM32的HAL库知识总结

    已剪辑自: https://mp.weixin.qq.com/s/duV8sQGe-VwcPGTgSiBlAw STM32HAL库的几个点: 1.最大可移植性.2.提供了一整套一致的中间件组件,如RT ...

最新文章

  1. 【自动化__持续集成】___java___static
  2. ABAP数据库—更新数据
  3. metamask中的import account的代码实现
  4. PyCharm入门教程——在编辑器中选择文本
  5. linux - python
  6. 算法入门经典 第三章
  7. Nginx动静分离实现负载均衡
  8. [html] 在两个iframe之间传递参数的方法有哪些?
  9. Bootstrap3 弹出提示插件的选项
  10. java 并发存储,java并发编程——Java存储模型(JMM)
  11. 乐山市计算机学校欺骗,据说这个学校很乱。
  12. 2021年中国车内娱乐和信息系统市场趋势报告、技术动态创新及2027年市场预测
  13. C++函数参数的规则
  14. 仅需6道题轻松掌握SciPy空间计算基础 | Python技能树征题
  15. How to learn Lua
  16. poj 3468 A Simple Problem with Integers 基础线段树
  17. 利用PLC1200和elmo驱动器对maxon RE40电机的两种控制方式(PWM(PTO)或者模拟量控制)
  18. linux中的文件搜索命令
  19. 简单PHP会话(session)说明
  20. android 拍照水印日期,胶片日期水印app安卓版-胶片日期水印手机版预约v1.0-发卡屋...

热门文章

  1. (附源码)计算机毕业设计SSM基于Java的新冠疫苗预约系统
  2. DFA算法简单理解实现
  3. 职位扫盲(CEO,CTO。。。)
  4. 悯农--写给程序员的诗
  5. Z平台-数据交换平台应用
  6. html parent()属性,HTML DOM parentElement用法及代码示例
  7. MySql__为用户赋于主从同步的权限
  8. 基于IIC通信的显示器OLED编程详解(一篇搞懂)
  9. 转贴:孙云丰,你让我感到恶心 --鉴于google的退出,正好是写出了心中所想
  10. 荣盛生物将再次上会:前三季度收入约2亿元,曾被暂缓审议