STM32CubeMX使用HAL库点亮LED流水灯

一、安装STM32CubeMX

1、配置环境

stm32cubemx 运行需要Java环境,如果没有可以安装JDK。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、安装STM32CubeMX

(1)下载压缩包
官网下载地址
点击Get latest下载安装包
在这里插入图片描述

(2)解压后,右击应用程序以管理员身份运行安装程序,点击next;
在这里插入图片描述

勾选“I accept the terms of this license agreement”,之后点击Next;
在这里插入图片描述

勾选第一项,点击Next;
在这里插入图片描述

选择安装位置,默认位置是安装在C盘中,需要注意的是安装位置中不要出现中文;
在这里插入图片描述

点击确定
在这里插入图片描述

直接点击Next,之后直接开始安装
在这里插入图片描述

等待安装,安装完成点击Done退出
在这里插入图片描述

2、安装HAL库

(1)打开安装好的STMCubeMX,点击 HELP->Manage embedded software packages
在这里插入图片描述
(2)在跳出来的界面中选择STM32F1,勾选要安装的HAL库点击Inatall Now,安装成功如下图所示,相应库前显示绿色。
在这里插入图片描述

3、新建项目

(1)打开STMCubeMX的主界面,点击创建新项目:
在这里插入图片描述
(2)在part name中选择STM32F103C8,点击start project
在这里插入图片描述
(3)点击system core,进入SYS,在debug下选择serial wire
在这里插入图片描述
(4)进入RCC配置时钟,因为要用的GPIO口在APB2里,而时钟架构中APB2总线的时钟由HSE控制,因此将HSE设置为Crystal/Ceramic Resonator
在这里插入图片描述
(5)之后在右侧芯片上选择相应引脚设置为GPIO_Output,即输出模式。
在这里插入图片描述
(6)之后进入Clock Configuration设置时钟架构在这里插入图片描述

(7)进入Project Manager界面设置项目路径和项目名,并将IDE选择为MDK-ARM
在这里插入图片描述在这里插入图片描述

(8)再进入Code Generator界面选择生成初始化.c/.h文件,最后点击GENERATE CODE创建项目。
在这里插入图片描述

二、利用HAL库实现LED流水灯

1、代码编写

(1)打开新建立的工程文件,找到main.c中的主函数部分
在这里插入图片描述
(2)将代码加入主函数中

SystemClock_Config();//系统时钟初始化
  while (1)
  {
    /* USER CODE END WHILE */
        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);//延时1s		
        HAL_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
  }

(3)GPIO输出的HAL库函数,可以设定或改变当前引脚电平值

  • 电平输出的HAL函数,返回空
     HAL_GPIO_WritePin(GPIO_TypeDef* GPIOX,Uint16_t GPIO_Pin,GPIO_PinState pinstate);
    

    GPIOX代表目标引脚的端口号,如GPIOA
    GPIO_Pin代表目标引脚的引脚号,如GPIOA_Pin_5
    pinstate代表当前引脚的高低电平,高电平(GPIO_PIN_SET)、低电平(GPIO_PIN_RESET)。

2、硬件实现

在这里插入图片描述

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

Keil中逻辑分析仪的具体使用可以参考:基于标准外设库的LED流水灯

(1)在keil中点击魔法棒,进入Target界面,设置晶振为8MHz
在这里插入图片描述
(2)进入Debug界面进行如下设置,最后点击OK
在这里插入图片描述
(3)点击Debug进入调试,打开逻辑分析仪(Logic Analyzer),选择要观察的引脚
在这里插入图片描述
(4)观察波形
在这里插入图片描述
引脚为低电平的灯亮,高电平的灯不亮,高低电平转换周期为1s左右。

三、利用HAL库中断模式通过按键控制LED流水灯

1、创建工程
  • 打开STM32CubeMX新建工程,选择使用STM32F103C8T6芯片;
  • 选择PA4,PB9,PC15为输出端口,设置为GPIO_Output,PA8为中断输入端口,设置为GPIO_EXIT 在这里插入图片描述
  • PA8进行中断配置
    在这里插入图片描述
  • 进入NVIC界面设置中断优先级
    在这里插入图片描述
  • 进入CLK Configyration界面中配置时钟在这里插入图片描述
  • 进入Project Manager进行工程设置,点击生成工程文件
2、代码编写

(1)HAL库中断处理机制

  • HAL库的中断处理函数是按照HAL处理机制来实现,统一由HAL_UART_IRQHandler来进行处理。
  • 外部中断是由引脚检测到的中断。中断可以由上升沿、下降沿或双边沿触发。
  • HAL_GPIO_EXTI_IRQHandler函数通过传入不同的参数,来区分是哪一条中断线触发的中断。
  • 不同的外部中断都调用了同一个HAL库的回调函数:HAL_GPIO_EXTI_IRQHandler。此回调函数是用户编写业务逻辑的函数。

(2)编程思路

  • 首先设置中断标志flag,按下按键flag=1,不按按键flag=0
     uint16_t flag=0;
    
  • 编写中断回调函数HAL_GPIO_EXTI_Callback()
    void HAL_GPIO_EXTI_Callback(uint16_t   GPIO_Pin){
    if(GPIO_Pin == GPIO_PIN_8){
       //获取A8的电位
      GPIO_PinState pinState = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8);
    
       //高电位
       if(pinState==GPIO_PIN_SET)//高电位流水灯亮
       {
     	  flag=1;//高电位标识
       }
       //低电位
       else if(pinState==GPIO_PIN_RESET)//低电位流水灯灭
       {
     	  flag=0;//低电位标识
       }
       } 
    }
    

    PA8端口作为中断输入,当PA8端口电平变换时触发中断,进入中断回调函数,再通过HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8) 函数获取PA8的端口电平,高电平令flag=1,流水灯点亮,低电平令flag=0,流水灯熄灭。
    需要注意的是中断函数中只能执行很快的命令,所以不能在回调函数中写入循环函数,否则程序将无法继续执行。

  • 添加主函数
     while (1)
    {
        if(flag==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);//延时1s
      	HAL_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
        }
        else if(flag==0){
          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_SET);//PC15熄灯
      	HAL_Delay(5000);//延时5s
        }
    }
    

    标识符flag=1时PA8端口电平为高,流水灯点亮;flag=0时PA8端口电平为低,流水灯熄灭。

3、硬件实现

实验中按键用杜邦线代替,杜邦线插入端口代表按键按下,拔出代表松开按键。
在这里插入图片描述

四、参考资料

1、HAL库教程4:外部中断
2、嵌入式-STM32-GPIO输出和输入的HAL库函数
3、stm32cubeMX使用HAL库点亮LED流水灯

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值