赞
踩
目录
概要:STM32有多种开发方式,比如寄存器、固件库、LL库和HAL库,本文用到了HAL库来实现GPIO口的控制以及中断识别点灯,HAL库的特点是操作简单、能够快速上手;另外本文还利用keil5软件携带的示波器对输出引脚波形进行判断,观察stm32芯片在HAL库下运行情况。
所需材料:STM32F103c8t6核心板、面包板(用来连接和固定芯片、LED灯)、STLink(用来将电脑上编写好的程序烧录进芯片)、杜邦线(连接STLink和开发板)。
HAL库的使用需要用到STM32CubeMX和keil5
STM32CubeMX的下载与安装可以参考下面这篇文章,按照整个流程来就行,没有什么难的地方,遇到问题就上网百度:
keil5的下载可以参考下面这个博客,讲解了keil5的下载与安装:
优点介绍:平时使用固件库编写代码需要加入很多头文件、源文件,还需要配置环境,过程十分繁琐,而使用STM32CubeMX可以一键生成配置好的keil文件,使用起来十分便捷。
步骤:
选择File、new project
搜索单片机型号
打开所选单片机
初始化配置,我配置了PA0,PA4,PB0三个端口,都是一样的配置方法
为了点亮Led,需要将引脚改为输出模式
继续配置
项目文件配置
生成文件
上一步打开文件后来到了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的前两期视频。
打开keil软件,选择示波器
选择波形分析
选择setup
按步骤选择,第二步引脚编号写为GPIOX_IDR.x,如GPIOA_PIN3为GPIOA_IDR.3
效果图:
该示波器分析了不同引脚的输出情况,可以看出三个引脚的LED是保持两个高电平,1个低电平的
要求:准备设置一个按键控制流水灯的亮灭
打开刚刚生成的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按键控制流水灯运行
由于我没有按键,效果不好展示,不过我用了杜邦线接高低电平来代替按键,验证了该中断效果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。