作业:基于HAL库的LED流水灯

使用HAL库,实现流水灯周期闪烁和中断模式编程。

开发环境的搭建

1.安装jdk(有java环境的可以不用这一步)
jdk官网下载链接:
https://www.oracle.com/java/technologies/javase-downloads.html
2.安装STM32CubeMX
下载地址:
https://www.st.com/en/development-tools/stm32cubemx.html
安装过程

  1. 管理员身份运行 SetupSTM32CubeMX-4.27.0.exe ,点击Next

  2. 选择"I accept the terms of this license agreement",点Next

  3. 选择安装位置,默认位置是安装在C盘中

  4. 点击确定

  5. 选择Next

  6. 安装完成后,选择Next

  7. 点击Done,完成安装!

安装固件库
运行CubeMX 4.27,选择 Help->Magne 安装固件库

图片1

流水灯的实现

使用STM32CubeMX创建工程:

  1. 打开STM32CubeMX,选择你的目标STM32微控制器型号,然后进入项目。

    图片2

  2. 在"Pinout & Configuration"选项卡中,开始如下配置:

    点击A->Z,选择SYS,在Debug一栏选择Serial Wire

    图片3

    选择RCC,如下:

    图片4

    选择OPIO,设置PA0、PB0,PC13为OutPut:

    图片5

  3. 在"Clock Configuration"选项卡中,设置如下:

    图片6

  4. 在"Project Manager"选项卡中,按如下配置:

    Project填好项目名称,然后在Toolchain/IDE选择MDK-ARM

    图片7

    Code Generator界面:

    图片8

  5. 最后,点击GENERATE CODE,生成后直接点击打开项目

    图片9

在Keil中编写代码:

  1. main.c文件中,找到while循坏,并将下面代码写入其中:
	 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);  // 灯1亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);  // 灯1灭
	  
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);  // 灯2亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);  // 灯2灭
	  
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);  // 灯3亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);  // 灯3灭

这段代码将交替控制三个LED灯的亮灭,每个LED都持续1秒。

编译:

编译项目并将生成的hex文件。

图片10

烧录:

将生成的文件烧录,便可以看到led周期闪烁的效果。

图片11

中断模式控制灯亮灭

使用STM32CubeMX创建工程:

  1. 打开STM32CubeMX,选择你的目标STM32微控制器型号,然后进入项目。

    图片2

  2. 在"Pinout & Configuration"选项卡中,开始如下配置:

    点击A->Z,选择SYS,在Debug一栏选择Serial Wire

    图片3

    选择RCC,如下:

    图片4

    选择OPIO,设置PA3、PB5,PA7为OutPut,PA5设置为GPIO_EXT13:

    图片12

  3. 在"Clock Configuration"选项卡中,设置如下:

    图片6

  4. 在"Project Manager"选项卡中,按如下配置:

    Project填好项目名称,然后在Toolchain/IDE选择MDK-ARM

    图片7

    Code Generator界面:

    图片8

  5. 最后,点击GENERATE CODE,生成后直接点击打开项目

    图片9

在Keil中编写代码:

  1. main.c文件中,找到while循坏,并将下面代码写入其中():

    需要定义一个全局变量,char n=0;

switch(n)
		{
			case 0:
			{
					HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
				  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
				  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
				  HAL_Delay(500);
				if(n==1)
				{	
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
				   break;
				}
				
			  	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
				  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
			   	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
			   	HAL_Delay(500);
				if(n==1)
				{	
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
				   break;
				}
				
				  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
				  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
				  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
				  HAL_Delay(500);
			}
			
		
			case 1:
		
			{
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
				break;
			}

		}

  1. 重载void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin):

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
    if(GPIO_Pin==GPIO_PIN_5)
    {
    	for(int i=0;i<999;i++)
    	{}
    		n=!n;
    }	
    }
    
    

    当外部中断触发时,HAL_GPIO_EXTI_Callback 函数会执行,从而实现中断控制。

  2. 编译:

    编译项目并将生成的hex文件。

    图片10

    烧录:

    将生成的文件烧录,便可以看到led周期闪烁的效果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值