文章目录
一、安装STM32CubeMX
1、配置环境
stm32cubemx 运行需要Java环境,如果没有可以安装JDK。
2、安装STM32CubeMX
(1)下载压缩包
官网下载地址
点击Get latest下载安装包
(2)解压后,右击应用程序以管理员身份运行安装程序,点击next;
勾选“I accept the terms of this license agreement”,之后点击Next;
勾选第一项,点击Next;
选择安装位置,默认位置是安装在C盘中,需要注意的是安装位置中不要出现中文;
点击确定
直接点击Next,之后直接开始安装
等待安装,安装完成点击Done退出
2、安装HAL库
(1)打开安装好的STMCubeMX,点击 HELP->Manage embedded software packages
(2)在跳出来的界面中选择STM32F1,勾选要安装的HAL库点击Inatall Now,安装成功如下图所示,相应库前显示绿色。
3、新建项目
(1)打开STMCubeMX的主界面,点击创建新项目:
(2)在part name中选择STM32F103C8,点击start project
(3)点击system core,进入SYS,在debug下选择serial wire
(4)进入RCC配置时钟,因为要用的GPIO口在APB2里,而时钟架构中APB2总线的时钟由HSE控制,因此将HSE设置为Crystal/Ceramic Resonator
(5)之后在右侧芯片上选择相应引脚设置为GPIO_Output,即输出模式。
(6)之后进入Clock Configuration设置时钟架构
(7)进入Project Manager界面设置项目路径和项目名,并将IDE选择为MDK-ARM
(8)再进入Code Generator界面选择生成初始化.c/.h文件,最后点击GENERATE CODE创建项目。
二、利用HAL库实现LED流水灯
1、代码编写
(1)打开新建立的工程文件,找到main.c中的主函数部分
(2)将代码加入主函数中
SystemClock_Config();//系统时钟初始化
while (1)
{
/* USER CODE END WHILE */
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
}
(3)GPIO输出的HAL库函数,可以设定或改变当前引脚电平值
- 电平输出的HAL函数,返回空
HAL_GPIO_WritePin(GPIO_TypeDef* GPIOX,Uint16_t GPIO_Pin,GPIO_PinState pinstate);
GPIOX代表目标引脚的端口号,如GPIOA
GPIO_Pin代表目标引脚的引脚号,如GPIOA_Pin_5
pinstate代表当前引脚的高低电平,高电平(GPIO_PIN_SET)、低电平(GPIO_PIN_RESET)。
2、硬件实现
3、观察GPIO端口的输出波形
Keil中逻辑分析仪的具体使用可以参考:基于标准外设库的LED流水灯
(1)在keil中点击魔法棒,进入Target界面,设置晶振为8MHz
(2)进入Debug界面进行如下设置,最后点击OK
(3)点击Debug进入调试,打开逻辑分析仪(Logic Analyzer),选择要观察的引脚
(4)观察波形
引脚为低电平的灯亮,高电平的灯不亮,高低电平转换周期为1s左右。
三、利用HAL库中断模式通过按键控制LED流水灯
1、创建工程
- 打开STM32CubeMX新建工程,选择使用STM32F103C8T6芯片;
- 选择PA4,PB9,PC15为输出端口,设置为GPIO_Output,PA8为中断输入端口,设置为GPIO_EXIT
- 对PA8进行中断配置
- 进入NVIC界面设置中断优先级
- 进入CLK Configyration界面中配置时钟
- 进入Project Manager进行工程设置,点击生成工程文件
2、代码编写
(1)HAL库中断处理机制
- HAL库的中断处理函数是按照HAL处理机制来实现,统一由HAL_UART_IRQHandler来进行处理。
- 外部中断是由引脚检测到的中断。中断可以由上升沿、下降沿或双边沿触发。
- HAL_GPIO_EXTI_IRQHandler函数通过传入不同的参数,来区分是哪一条中断线触发的中断。
- 不同的外部中断都调用了同一个HAL库的回调函数:HAL_GPIO_EXTI_IRQHandler。此回调函数是用户编写业务逻辑的函数。
(2)编程思路
- 首先设置中断标志flag,按下按键flag=1,不按按键flag=0
uint16_t flag=0;
- 编写中断回调函数HAL_GPIO_EXTI_Callback()
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == GPIO_PIN_8){ //获取A8的电位 GPIO_PinState pinState = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8); //高电位 if(pinState==GPIO_PIN_SET)//高电位流水灯亮 { flag=1;//高电位标识 } //低电位 else if(pinState==GPIO_PIN_RESET)//低电位流水灯灭 { flag=0;//低电位标识 } } }
PA8端口作为中断输入,当PA8端口电平变换时触发中断,进入中断回调函数,再通过HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8) 函数获取PA8的端口电平,高电平令flag=1,流水灯点亮,低电平令flag=0,流水灯熄灭。
需要注意的是中断函数中只能执行很快的命令,所以不能在回调函数中写入循环函数,否则程序将无法继续执行。 - 添加主函数
while (1) { if(flag==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 } else if(flag==0){ 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_SET);//PC15熄灯 HAL_Delay(5000);//延时5s } }
标识符flag=1时PA8端口电平为高,流水灯点亮;flag=0时PA8端口电平为低,流水灯熄灭。
3、硬件实现
实验中按键用杜邦线代替,杜邦线插入端口代表按键按下,拔出代表松开按键。
四、参考资料
1、HAL库教程4:外部中断
2、嵌入式-STM32-GPIO输出和输入的HAL库函数
3、stm32cubeMX使用HAL库点亮LED流水灯