第7周实验3--基于HAL库的LED流水灯

目录

前言

一、实验任务

二、环境搭建

三、HAL库实现流水灯

        1、建立工程

        2、keil程序编写

        3、电路连接

        4、烧录运行

​编辑

        5、观察输出波形

四、使用中断控制流水灯开关

        1、建立工程

        2、代码完善

        3、电路连接并烧录运行

总结


前言

        本次作业时为了了解并掌握STM32中断原理,HAL库函数的开发方法。


一、实验任务

        1、重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。

        2、用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。

        3、在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。请用此功能观察第1题中3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。

二、环境搭建

        具体安装参考链接:【精选】STM32基于HAL库流水灯实验_hel库安装教程中文版-CSDN博客

三、HAL库实现流水灯

        1、建立工程

        (1)打开STMCubeMX主界面,创建新工程:

        (2)按照实际情况选择自己的芯片,然后start project,我使用的是TM32F103C8T6。

        (3)点击“A→Z”,找到SYS,在debug里面选择serial wire。

        (4)然后配置时钟,把HSE处的设置改为如下如所示。

        然后点击Clock Configuration,把PLLCLK选上。

        (5)然后选择引脚设置输出寄存器。在“A→Z”处找到GPIO,在右边的图中点击引脚并选择OUTPUT。

        最后大致如图。

        继续对引脚进行修改:点击要修改的引脚,然后将电平改为High。

        (6)在Project Manager板块写好工程名字,确定好保存路径,然后将IDE那里改成MDK-ARM。

        (7)在Code Generator处在如下图选项上打勾,生成初始化.c/.h文件,然后点击GENERATE CODE,再点击open project,就进入到keil5了。

        2、keil程序编写

        接着上一步进入到keil5中,打开main.c文件,并找到main函数的位置。然后在main函数里面的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);//延时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

        在魔法棒里面找到output,生成hex文件。

        再点击debug,修改如下配置。点击OK。

        然后进行编译,没有报错且产生了hex文件。

        3、电路连接

        根据设计的程序连接电路:
        对于USB转TTL模块和stm32f103c8t6连接:
        GND — GND
        3v3 — 3v3
        TXD — A10
        RXD — A9

        总电路:
        红——B9        
        绿——C15
        黄——A4

        接线实物图如下:

        4、烧录运行

        使用mcuisp进行烧录。

        5、观察输出波形

        首先对debug进行设置,如下:

        然后就可以开始运行了,在这个图标中观察波形图,需要手动进行添加,然后将类型设置为bit,点击关闭就可以观察波形了。

四、使用中断控制流水灯开关

        1、建立工程

        (1)工程创建。前四个步骤同上,不多讲述。

        (2)根据实际情况在GPIO处选择引脚:

        然后根据下图做好设置。

        (3)选择NVIC,在EXIT处进行勾选,并进行设置。

        (4)点击Clock Configuration,进行时钟配置,

        (5)点击Project Manager,生成.c/.h文件。

        (6)设置好文件名(不能有空格和中文名),在IDE处选择MDK-ARM,生成代码。

        2、代码完善

        在刚刚生成的keil5工程中找到main.c文件,点击进入定义处。

        把RESET改为SET,将这三个GPIO口设置为高电平,均不初始时不亮。

        然后回到main.c文件,编写一个中断函数HAL_GPIO_EXTI_Callback()以及自定义一个中断的标识符号flag。

uint32_t flag=0;//自定义中断标识符号
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
  if(GPIO_Pin == SWITCH_Pin){
      //获取B5的电位
     GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin);
 
      //高电位
      if(pinState==GPIO_PIN_SET)//PB5高电位流水灯亮
      {
		  flag=1;//PB5高电位标识
	  }
      //低电位
      else if(pinState==GPIO_PIN_RESET)//PB5低电位流水灯灭
	  {
		  flag=0;//PB5低电位标识
	  }
      } 
   }

        找到main函数中while(1),在里面加入代码:

if(flag==1)
	  {
		  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//PA0亮灯
          HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1熄灯
		  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PA2熄灯
		  HAL_Delay(100);//延时0.1s
	      HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0熄灯
		  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//PA1亮灯
		  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PA2熄灯
		  HAL_Delay(100);//延时0.1s		
		  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_RESET);//PA2亮灯
		  HAL_Delay(100);//延时0.1s
	  }
	  else if(flag==0)
	  {
          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熄灯
	  }

        编译成功,没有报错,成功生成了hex文件。

        3、电路连接并烧录运行

        过程同前一个实验一样,在此也就不过多叙述。最后实现的效果如下:


总结

        本次实验学习了有关HAL库的知识,也初步掌握了其运用方法,对于各种软件的调节也有了进一步的理解和认识,学习嵌入式是一个需要不断实践和积累经验的工作,通过本次作业,提高了自己的编程水平,不断试错,不断改正,保证程序的正确性,才能实现实验目标。

流水灯是一种常见的 LED 灯光效果,可以使用 HAL 库函数来实现。下面是一个简单的流水灯实现代码: ```C #include "stm32f10x.h" //包含STM32F10x系列的头文件 #define LED_NUM 8 //LED数量 #define DELAY_MS 200 //延时时间 int main(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; //LED引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA while (1) { int i, j; for (i = 0; i < LED_NUM; i++) { GPIO_SetBits(GPIOA, GPIO_Pin_0 << i); //点亮当前LED HAL_Delay(DELAY_MS); //延时 GPIO_ResetBits(GPIOA, GPIO_Pin_0 << i); //熄灭当前LED } for (j = LED_NUM - 1; j >= 0; j--) { GPIO_SetBits(GPIOA, GPIO_Pin_0 << j); //点亮当前LED HAL_Delay(DELAY_MS); //延时 GPIO_ResetBits(GPIOA, GPIO_Pin_0 << j); //熄灭当前LED } } return 0; } ``` 在这个程序中,我们使用 STM32F10x 系列的 HAL 库函数来控制 GPIO 口,实现对 LED 的控制。在程序开始时,我们定义了 LED 数量和延时时间,以及每个 LED 所连接的 GPIO 引脚。 在主循环中,我们使用两个 for 循环来实现 LED流水灯效果。首先从第一个 LED 开始逐个点亮和熄灭,然后再从最后一个 LED 开始逐个点亮和熄灭,如此往复循环。 需要注意的是,在使用 HAL 库函数时,需要先通过 CubeMX 工具生成相应的工程文件,并添加相应的库文件和头文件。同时,需要根据实际情况修改 LED 引脚的配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值