目录
1.概述
概要:STM32有多种开发方式,比如寄存器、固件库、LL库和HAL库,本文用到了HAL库来实现GPIO口的控制以及中断识别点灯,HAL库的特点是操作简单、能够快速上手;另外本文还利用keil5软件携带的示波器对输出引脚波形进行判断,观察stm32芯片在HAL库下运行情况。
所需材料:STM32F103c8t6核心板、面包板(用来连接和固定芯片、LED灯)、STLink(用来将电脑上编写好的程序烧录进芯片)、杜邦线(连接STLink和开发板)。
2.软件安装
HAL库的使用需要用到STM32CubeMX和keil5
一、STM32CubeMX下载
STM32CubeMX的下载与安装可以参考下面这篇文章,按照整个流程来就行,没有什么难的地方,遇到问题就上网百度:
【STM32】入门(十):STM32CubeMx下载、安装、使用-CSDN博客
二、keil5的下载与安装
keil5的下载可以参考下面这个博客,讲解了keil5的下载与安装:
3.实验步骤
一、使用STM32CubeMX进行文件初始化
优点介绍:平时使用固件库编写代码需要加入很多头文件、源文件,还需要配置环境,过程十分繁琐,而使用STM32CubeMX可以一键生成配置好的keil文件,使用起来十分便捷。
步骤:
选择File、new project
搜索单片机型号
打开所选单片机
初始化配置,我配置了PA0,PA4,PB0三个端口,都是一样的配置方法
为了点亮Led,需要将引脚改为输出模式
继续配置
项目文件配置
生成文件
二、keil编写代码
上一步打开文件后来到了keil界面
代码如下:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // PA0处灯亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // PA0处灯灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // PA4处灯亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // PA4处灯灭
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // PB0处灯亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // PB0处灯灭
烧录配置
依次点击1,2,3,代码就被录入单片机了
效果图:
关于STLink与单片机的连接方式可以去b站看江协科技关于stm32的前两期视频。
4.在示波器上进行验证
打开keil软件,选择示波器
选择波形分析
选择setup
按步骤选择,第二步引脚编号写为GPIOX_IDR.x,如GPIOA_PIN3为GPIOA_IDR.3
效果图:
该示波器分析了不同引脚的输出情况,可以看出三个引脚的LED是保持两个高电平,1个低电平的
5.通过中断控制LED亮灭
要求:准备设置一个按键控制流水灯的亮灭
打开刚刚生成的CubeMX文件
选择外部中断
配置NVIC
中断配置完毕,按照之前的方法生成文件
打开刚刚生成的keil项目,在main.c中USER CODE BEGIN4里面加入中断代码,其中myFlag是我设置的一个全局变量,我设置在了main函数之前,用来检测是否中断,并且在主函数中调用它
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == GPIO_PIN_10){
{if(myFlag==1)
myFlag=0;
else
myFlag=1;
}
}
}
/* USER CODE END 4 */
主函数也发生了改变,具体为判断全局变量是否改变,若改变则说明发生了中断,LED流水灯停止或继续(模拟按键控制流水灯是否启动),下图为主函数里的代码,注意这个while循环是写在总while循环里面的
while(myFlag==0){
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // PA0处灯亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // PA0处灯灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // PA4处灯亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // PA4处灯灭
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // PB0处灯亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // PB0处灯灭
}
然后录入即可实现PA10按键控制流水灯运行
由于我没有按键,效果不好展示,不过我用了杜邦线接高低电平来代替按键,验证了该中断效果