前言
对于点灯操作,之前已经写了寄存器模式以及标准库模式,需要请看之前文章,本篇文章是用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变为高电位
}
}
烧录结果如下: