STM-HAL库点灯大师

前言

对于点灯操作,之前已经写了寄存器模式以及标准库模式,需要请看之前文章,本篇文章是用HAL库模式进行点灯操作的。

HAL库主要就是用STMCube进行配置我们需要使用的的端口,以及端口的状态模式,最终生成工程文件,然后再打开工程文件编写我们想要实现的内容即可。

一、stm32CubeMX与keil

STM32CubeMX和Keil各自具有独特的特点和优势。总体来说,STM32CubeMX倾向于图形化配置和生成代码,而Keil则提供了一个完整的开发环境。

1.stm32CubeMX

  • 图形化界面:STM32CubeMX提供了直观的图形化界面,使用户能够方便地选择所需的外设、功能并自动生成相应的代码和配置文件。
  • 自动生成代码:STM32CubeMX不仅能自动生成初始化代码,而且可以帮助用户优化代码和配置参数,从而提高嵌入式系统的性能和效率。
  • 包含库函数和中间件:STM32CubeMX包含了大量的库函数和中间件,可以帮助用户快速实现各种功能。
  • 与Keil的配合使用:STM32CubeMX可以生成初始化代码,这些代码可以被导入到Keil项目中,以简化STM32程序的开发过程。

2.keil

  • 集成开发环境:Keil是一款由ARM公司开发的集成开发环境,提供了一个完整的嵌入式开发平台,包括编辑器、编译器、调试器和仿真器等工具。
  • 支持多种编程语言和处理器架构:Keil支持多种编程语言和处理器架构,可以用于编写、编译和调试嵌入式代码。
  • 与CubeMX配合使用:Keil可以与CubeMX配合使用,将由CubeMX生成的代码导入Keil中进行开发和调试。

3.使用STM32CubeMX和HAL库函数进行开发方法

  • 安装STM32CubeMX和HAL库函数:首先,从STMicroelectronics的官方网站上下载并安装STM32CubeMX和HAL库函数。这些库函数是针对STM32系列微控制器的,其中STM32CubeMX是一个图形化工具,用于生成初始化代码,而HAL库函数是一组针对STM32的硬件抽象层库函数
安装STM32CubeMX

软件的下载地址:
链接: STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics

  • 创建STM32CubeMX项目:打开STM32CubeMX软件,创建一个新的项目。在创建项目的过程中,可以选择微控制器的型号和外设,并配置它们的相关参数。
  • 生成初始化代码:在STM32CubeMX中,可以使用图形化界面配置微控制器的各个外设和功能,并生成相应的初始化代码。生成的代码包括引脚配置、中断配置、时钟配置等。
  • 导入到Keil中:将生成的初始化代码导出为Keil项目文件(.uvprojx),然后打开Keil软件并导入该项目文件。Keil将自动生成相应的工程文件和源代码文件。
  • 使用HAL库函数编写应用程序:在Keil中,可以使用HAL库函数来编写应用程序。这些库函数提供了一组通用的API,用于访问和控制微控制器的各个外设和功能。可以在应用程序中使用HAL库函数来配置和控制微控制器的各个外设和功能。
  • 编译和调试:在Keil中,可以使用编译器将源代码编译成可执行文件,并使用调试器进行调试。Keil还提供了仿真器,用于模拟微控制器的运行过程。
  • 下载和运行:将可执行文件下载到微控制器中,然后启动应用程序。在应用程序运行时,HAL库函数将自动配置和控制微控制器的各个外设和功能,从而实现所需的功能。

总之,使用STM32CubeMX和HAL库函数进行开发可以简化STM32程序的开发过程,提高开发效率和代码质量。

 

二、通过STMCube配置工程

1.引脚设置说明

1.输出端口 PA0 PA1 PA2

2.配置工程

首先点击ACCESS TO MCU SELECTOR

进入之后首先选择STM32F103C8T6,然后点击Start Project

 随后,点击System Core,选择SYS

然后再debug栏里面选中Serial Wire

 在Clock Configuration中,选中PLLCLK

 点击GPIO,进行端口选择和配置功能,本文需要将PA0、PA1、PA2用高低电平控制其亮灭情况,因此只需要将这三个端口设置为output模式即可

进行工程创建并保存。在Project Manager中的project下配置工程名称、存储位置,并且选中MDK-ARM 

然后再按照下图勾中选项,最后直接生成代码即可。 

三、编写代码

 本文需要将三个端口的灯实现循环亮灭

因此只需要在主函数下写入我们具体想实现的代码即可

 在主函数中的具体代码如下:

  while (1)
  {
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_All,GPIO_PIN_SET);//初始化,全灭
        HAL_Delay(500);//延时1s
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//PA0亮灯
		HAL_Delay(500);//延时1s
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//PA1亮灯
		HAL_Delay(500);//延时1s
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//PA2亮灯
		HAL_Delay(500);//延时1s
  }

四、烧录

本文使用的串口软件烧录的

1.选中.hex文件

首先在最小开发板上按以下连接后,第一次点击开始编程按钮,此时需要按一下开发板上的Reset键,使之进入串口烧录模式

完成后通过切换跳线帽的方式将BOOT0设置为0,再次按下Reset键,程序正常运行。

在这里会改变跳线帽的接法主要是需要改变启动模式,具体启动模式如下图

Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader;
Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中;
Step3:程序下载完成后,必须要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动。

2.具体结果

2.接着通过debug观察波形

首先设置debug

接下来再点击debug,进行引脚设置

最后点击 全速运行程序,即可输出波形

最终的输出波形如下所示: 

由输出波形可以看出,三个引脚可以实现循环亮灭。 

五、加入中断

1.中断的原理

(1)中断源:STM32微控制器具有多个硬件模块,如定时器、外部中断引脚、串口等,这些模块可以产生中断请求,被称为中断源。
(2)中断控制器:STM32微控制器内部集成了一个中断控制器,用于管理和控制不同中断源的优先级、屏蔽和响应方式。
(3)中断服务程序(ISR):当中断事件发生时,中断控制器根据优先级确定中断源,并将控制权转移到相应的中断服务程序。中断服务程序是用户自定义的函数,用于处理中断事件。
(4)中断优先级:不同的中断源具有不同的优先级,中断控制器根据优先级来确定应该响应的中断。高优先级的中断会打断正在执行的低优先级中断。
(5)中断嵌套:STM32微控制器支持中断嵌套,即在一个中断服务程序中可以接收和处理其他中断请求。
通过中断优先级的设置,可以灵活控制中断的嵌套。

2.加入中断的步骤

  • 在STM32CubeMX中配置中断:首先,在STM32CubeMX中打开项目,并进入“Pinout & Configuration”页面。在这里,需要配置微控制器的中断引脚和中断优先级。找到相应的中断引脚并启用它,然后设置中断优先级。
  • 生成中断服务程序(ISR):在STM32CubeMX中,打开“Project Manager”窗口,找到您的项目并展开。右键单击“Interrupts”文件夹,并选择“Add Interrupt Service Routine (ISR)”。在弹出的对话框中,选择您要处理的中断类型(例如,外部中断、定时器中断等),并输入ISR的名称。单击“OK”按钮以生成ISR模板。
  • 编写ISR程序:在Keil中,打开您的项目并进入“Project”窗口。找到生成的ISR文件(通常位于“Interrupts”文件夹下),双击它以打开代码编辑器。在ISR程序中,您可以编写中断处理逻辑。根据您的需求,可以在ISR程序中访问和控制微控制器的各个外设和功能。
  • 配置中断优先级:在Keil中,打开您的项目并进入“Project”窗口。找到您的项目属性文件(通常位于“Project”文件夹下),双击它以打开属性页。在属性页中,找到“Interrupt Priority”选项卡,并设置相应的中断优先级。根据您的需求,可以设置多个中断的优先级。
  • 编译和调试:在Keil中,使用编译器将源代码编译成可执行文件,并使用调试器进行调试。在调试过程中,您可以模拟中断的发生和处理过程,以验证程序的正确性。
  • 下载和运行:将可执行文件下载到微控制器中,然后启动应用程序。当相应的中断发生时,HAL库函数将自动调用ISR程序,从而实现所需的功能。

3.具体实现

 具体代码如下:

	if(GPIO_Pin==GPIO_PIN_0)
	{
		//获取B5的电位
        GPIO_PinState pinState = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
		if(pinState==GPIO_PIN_RESET)
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//把PA0变为低电位
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//把PA1变为低电位
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//把PA2变为低电位
		}
		else
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//把PA0变为高电位
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//把PA1变为高电位
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//把PA2变为高电位
		}
	}

烧录结果如下:

六、参考

(1)https://blog.csdn.net/tyler880/article/details/90311773

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值