目录
1、了解HAL库函数开发方法。
HAL库背景
ST 为开发者提供了非常方便的开发库:有标准外设库(SPL库)、HAL 库(Hardware Abstraction Layer,硬件抽象层库)、LL 库(Low-Layer,底层库)三种。前者是ST的老库已经停更了,后两者是ST现在主推的开发库。
相比标准外设库,STM32Cube HAL库表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。HAL库是ST未来主推的库,ST新出的芯片已经没有STD库了,比如F7系列。目前,HAL库已经支持STM32全线产品。
HAL库函数
EXTI的HAL库接口函数的源码定义在stm32f1xx_hal_exti.c源文件中,其对应的头文件stm32f1xx_hal_exti.h声明了EXTI所有的库函数.
2、安装 stm32CubeMX
安装链接
链接:https://pan.baidu.com/s/10LNTp8UpyMe38ROoinnRkg
提取码:0102
软件设计流程
新建STM32CubeMX工程,选择MCU
在D盘或其他盘符目录下新建一个文件夹,用来存放后面建立的STM32CubeMX工程。需要注意的是:所建工程文件名最好是英文名称,且最好是英文路径。 这里采用STM32F103ZET6芯片。
STM32CubeMX功能参数配置
RCC配置
HSE选择“Crystal/Ceramic Resonator”(晶振/陶瓷谐振器),LSE选择“Disable”.
MCU引脚选择
GPIO引脚参数配置
SYS选择
时钟配置
将HSI改为PLLCLK.
生成工程代码
配置keil工程名称和存放位置
定义“Project Name”为“MyProject_EXTI”,“Toolchain/IDE”选择“MDK-ARM V5”.
在“Code Generator”选项栏中找到“Generated files”框,勾选“Generate peripheral initialization as a pair of ’.c/.h’ files per IP”,将外设初始化的代码设置生成为独立的.c源文件和.h头文件。
通过STM32CubeMX的菜单栏中的“Generate Code”生成工程代码,生成代码后,会提示是否打开该工程窗口
3、LED流水灯
配合Keil,使用HAL库方式做一个LED流水灯,用GPIO端口完成2只LED灯的周期闪烁。
代码
在main.c中的while(1){}循环中加入代码
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?
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET); // ?2?
HAL_Delay(1000); // ??1s
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET); // ?2?
测试效果
观察波形
在没有示波器条件下,使用Keil的软件仿真逻辑分析仪功能观察LED管脚的时序波形,分析上面作业按键中断时,LED灯的波形变化情况。
波形图:
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */
#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */
#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */
#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */
#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */
#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */
#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */
#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */
比如,如果你需要查看PA15的引脚,就写为(PORTA & 0x00008000)>> 15(0x00008000可以写为0x8000)。
如图所示,每隔一秒灯轮流闪烁, 波形正确.
4、控制LED闪烁
接上,再用GPIO端某一管脚接2个开关(用杜邦线模拟代替)。采用中断模式编程,当2分开关接高电平时,对应的两个LED灯停止工作(即停止周期性闪烁),接低电平时,恢复工作。
代码
找到 stm32f1xx_hal_gpio.c,加上头文件
#include "gpio.h"
找到HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 函数,加入以下代码
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_RESET)
HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_RESET);//?A4?????
//???
else
HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_SET);//?A4?????
}
}
测试效果
5、总结
了解并掌握了HAL库函数开发方法,学会了安装 stm32CubeMX,并且配合Keil,使用HAL库方式完成led流水灯与控制led闪烁实验.