一 实验目的
1了解STM32中断原理和HAL库函数开发方法。
2学习使用stm32CubeMX和Keil配合使用HAL库完成任务。
3学习使用Keil的软件仿真逻辑分析仪功能观察管脚时序波形,以便动态跟踪调试和定位代码故障点。
二实验前准备
1 下载并安装JRE
安装STM32CubeMX软件是基于java环境运行的,所以需要安装JRE才能使用。
安装全选默认
2 下载并安装HAL库
STMicroelectronics: Our technology starts with you
官方网址下载
打开STM32CubeMX 软件,点击右上角“Help”,选择“Manage embedded saftware packages”
(2)如下所示的选择型界面,勾选所需的HAL库,本教程开发的STM32F103C8t开发板作为演示,选择的则为STM32F1 —>STM32Cube MCU Package for STM32F1 Series 1.8.5版本。
注意,需要提前在官网上注册才能下载
二 实验任务
1了解并掌握STM32中断原理,HAL库函数开发方法。安装 stm32CubeMX,配合Keil,使用HAL库方式完成下列任务:
1.1重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。
1.2用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。
2在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。
2.1请用此功能观察第1题中3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。
三 实验内容
1 重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。
1.1重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。
1)用stm32CubeMX创建工程并进行相关配置
安装好stm32CubeMX后,点击File,然后点击New Project创建新的工程。
然后在弹出来的页面中选择该实验需要用到的芯片为STM32F103C8T6,然后点击start project开始工程
然后配置SYS
然后配置RCC
然后配置GPIO,本实验选择PA5、PB0、PC14点击右侧芯片,找到所需要的端口,并将其设置为GPIO_Output,然后修改Pin脚的电平,将其设置为高电平。
设置时钟
设置时钟,将按钮电亮。
设置工程名,文件路径
点击Code Generator,进行勾选
创建打开工程。
2、代码编写及编译
在Keil中点击main.c,然后将while(1)循环中添加以下代码。
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
//????
HAL_Delay(1000);
//?????A4
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
//?????B5
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
//????
HAL_Delay(1000);
//?????B5
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
//?????C14
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);
//????
HAL_Delay(1000);
//?????C14
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);
/* USER CODE BEGIN 3 */代码更改完成后,点击魔法棒,进行相关设置。
生成hex文件并烧录
实验结果如图
1.2用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。
1)建立工程配置参数
重新建立一个工程,按照上个实验步骤进行相关配置,需要注意的是,该实验比上面的多了几步配置。
配置GPIO:
A0持续输出高电平
A2持续输出低电平
A8作为开关,配置为上升沿和下降沿都触发,用一个标签A_EXIT
配置NVIC:
其他步骤和第一个实验一样。
2、代码编写与编译
打开KEIL工程,打开User文件下的stm32f1xx_it.c文件,找到这个函数的位置
找到之后,往下找到HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)这个函数,这个函数需要自己编写的,代码如下:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == A_EXIT_Pin){
//获取A8的电位
GPIO_PinState pinState = HAL_GPIO_ReadPin(GPIOA,A_EXIT_Pin);
//低电位
if(pinState==GPIO_PIN_RESET)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET);
}
//高电位
else
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET);
}
}
}
代码编写完将这个函数插入到main.c文件中任意位置。
然后点击魔法棒进行相关设置,点击编译运行无错误输出.hex文件。
生成.hex文件后烧录到芯片中,然后运行。
运行结果
2在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。
2.1请用此功能观察第1题中3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。
打开第1个实验的keil工程,点击Debug,然后再出现的页面,找到波形图的按钮点击
然后选择实验用到的GPIO口,
点击运行
观察波形图可以发现,GPIOA、GPIOB、GPIOC口的流水灯轮流被点亮,间隔为两秒,高低电平转换周期以及LED闪烁的周期为3秒。
实验总结
1 在第一题中,我们成功地使用GPIO端口实现了3只LED红绿灯的周期闪烁。通过配置GPIO的输出模式和使用循环语句控制LED的亮灭,我们实现了流水灯效果。通过Keil的软件仿真逻辑分析仪功能,我们观察到了LED的时序波形。
2 在第二题中,我们将一个开关通过杜邦线模拟连接到GPIOA的某一管脚上,并采用中断模式编程。当开关接高电平时,LED流水灯工作;当开关接低电平时,LED流水灯停止工作。通过Keil的软件仿真逻辑分析仪功能,我们观察到了开关状态对LED流水灯的影响。
3 使用Keil的软件仿真逻辑分析仪功能可以方便地观察管脚的时序波形,帮助我们判断时序状态是否正确以及高低电平转换周期的实际数值。尽管没有实际的示波器设备,但这种功能在一定程度上提供了方便和帮助,可以用于动态跟踪调试和定位代码故障点。