(一)、实验工具
- 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.。