基于HAL库的stm32流水灯开发

(一)、实验工具

  • STM32CubeMX
  • KEIL5
  • mcuisp
  • STM32F103C8T6的最小核心板
  • (以上软件可自行查找资源)

(二)、实验原理 

HAL库

HAL 库(Hardware Abstraction Layer,硬件抽象层)和标准库(Standard Peripheral Library,标准外设库,又称为 SPL)都是 STM32 微控制器的固件库。它们的主要区别在于结构和抽象级别。

1.HAL 库: HAL 库是 STMicroelectronics(ST)提供的较新的库。它提供了一套统一的 API,用于访问 STM32 系列微控制器的外设。HAL 库的目的是简化固件开发,让开发者更加关注应用层逻辑,而无需深入了解底层硬件。

HAL 库的特点:

跨平台支持:支持 STM32 全系列微控制器。
结构统一:为所有外设提供统一的 API 和驱动结构。
易于使用:简化了许多硬件操作,使得开发者可以快速上手。
与 STM32CubeMX 工具集成:STM32CubeMX 可以自动生成 HAL 库的初始代码,方便开发者配置硬件。

STM32 HAL固件库是Hardware Abstraction Layer的缩写,中文名称是:硬件抽象层。HAL库是ST公司为STM32的MCU最新推出的抽象层嵌入式软件,为更方便的实现跨STM32产品的最大可移植性。HAL库的推出,可以说ST也慢慢的抛弃了原来的标准固件库,这也使得很多老用户不满。但是HAL库推出的同时,也加入了很多第三方的中间件,有RTOS,USB,TCP / IP和图形等等。
和标准库对比起来,STM32的HAL库更加的抽象,ST最终的目的是要实现在STM32系列MCU之间无缝移植,甚至在其他MCU也能实现快速移植。
并且从16年开始,ST公司就逐渐停止了对标准固件库的更新,转而倾向于HAL固件库和 Low-layer底层库的更新,停止标准库更新,也就表示了以后使用STM32CubeMX配置HAL/LL库是主流配置环境;
 

(三)、STM32CubeMX使用HAL库生成流水灯代码

1、安装HAL库

       * 打开已下载的STM32CubeMX

        *选择help->Manage embedded software packages

        *选择下图的HAL库进行下载

2、新建项目

        *回到STMCubeMX的主界面,创建新项目: 

        *选择使用的开发板,然后新建工程文件

 

        *点击system core,进入SYS,在debug下选择serial wire 

 

        *配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,我们要用是GPIO接口,而这些接口都在APB2里: 

        *APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上: 

        *点击相应的引脚设置输出寄存器了,就是output那一项,一共选了三个,是PA0,PA1,PA2: 

        *点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM:

        *进入 code generate界面,选择生成初始化.c/.h文件,后面点击generate code,选择open project,然后就到KEIL5了

 

3、Keil仿真调试

       *进入对应生成的的keil文件

        *打开main.c文件,滑倒主函数那一部分: 

        *将下面代码放入主函数中(替代里面的内容) 

        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//PA4亮灯
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PB9熄灯
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PC15熄灯
		HAL_Delay(1000);//延时1s
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA4熄灯
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//PB9亮灯
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PC15熄灯
		HAL_Delay(1000);//延时1s		
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA4熄灯
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PB9熄灯
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//PC15亮灯
		HAL_Delay(1000);//延时1s

        *编译成功后使用FlyMcu进行烧录

        *电路板连线 

4、流水灯效果

(四)、采用中断模式控制流水灯

        要使用中断模式,需要在CubeMX配置EXIT。打开刚刚创建的文件。

        B5模拟开关,设置为GPIO_EXTI5

        *把A1配置为高电平、A7配置为低电平 把B5中断配置为上升沿和下降沿都触发 

        *创建项目,打开生成的Keil文件

        *打开生成的项目,找到stm32f1xx_it.c,找到EXTI9_5_IRQHandler这个函数,选中HAL_GPIO_EXTI_IRQHandler这个语句按F12跳到该函数

        *将下面代码放入主函数中(替代里面的内容) 

while (1)
  {
				
		switch(n){
			case 0:
			{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
				if(n!=0){break;}
				HAL_Delay(1000);//??1s
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
				if(n!=0){break;}
				HAL_Delay(1000);//??1s		
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
				if(n!=0){break;}
				HAL_Delay(1000);
			}
			
			case 1:
			{
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
			}
		}
		
				
  }

        *将刚刚跳转的中断函数复制到main.c文件中,因为程序中我使用了一个n的变量来控制流水灯,所以中断函数的控制也要在该文件中。

        *以下为中断函数程序。当B5口接入高电平时,流水灯停止运行,若不是将启动流水灯。 

  

 

        编译生成hex文件后烧录进开发板 

         *实验效果

中断

(五)、观察GPIO端口的输出波形

        *Target界面中,选择跟正确的晶振大小,使用8MHz的外部晶振。        

        *Debug设置,根据对应的芯片进行修改

        *打开 Debug进入调试模式,选择逻辑分析仪。

        *添加要观察的端口,输出的单位选择bit

        *运行结果,可以发现当其中一个端口为0时,另外的端口为1.。 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值