新闻详情

新闻详情

首页 / 资讯中心 / 详情

STM32F103C8T6 HAL 库按键中断控制流水灯

发布时间:2026/9/30 5:22:09来源:尧图网络
STM32F103C8T6 HAL 库按键中断控制流水灯
STM32F103C8T6 HAL 库按键中断控制流水灯实验报告文章目录STM32F103C8T6 HAL 库按键中断控制流水灯实验报告一、实验目的二、实验任务三、实验环境与器件3.1 软件环境3.2 硬件器件四、硬件连接五、实验原理5.1 GPIO 输出控制5.2 按键外部中断5.3 按键消抖5.4 流水灯计时5.5 暂停与继续六、关键程序代码6.1 系统时钟配置6.2 GPIO 和外部中断初始化6.3 按键中断回调6.4 主循环七、实验结果一、实验目的掌握 STM32F103C8T6 的 GPIO 推挽输出配置方法。掌握 HAL 库中 GPIO 初始化、输出控制和延时计时函数的使用。掌握外部中断 EXTI、NVIC 和中断回调函数的基本工作原理。使用 PB1 按键外部中断控制流水灯的暂停和继续。二、实验任务在前面流水灯实验的基础上使用 STM32 HAL 库和按键外部中断实现以下功能PA0、PA3、PC13 三只 LED 轮流点亮每只 LED 点亮时间约为 1 秒按下 PB1 按键后流水灯暂停并保持当前 LED 状态再次按下 PB1 按键后流水灯继续运行。本实验采用按键下降沿中断方式不在主循环中不断查询按键状态。三、实验环境与器件3.1 软件环境Keil µVision5ARMCC V5.06 编译器STM32CubeF1 HAL 库Keil.STM32F1xx_DFP 器件支持包ST-Link 下载器。3.2 硬件器件STM32F103C8T6 最小系统核心板一块LED 两只330 Ω1 kΩ 限流电阻两只按键一个面包板和杜邦线若干ST-Link 下载器一个。四、硬件连接功能STM32 引脚接线方式有效电平LED1PA0PA0 → 限流电阻 → LED → GND高电平点亮LED2PA3PA3 → 限流电阻 → LED → GND高电平点亮板载 LEDPC13核心板内部已连接 LED低电平点亮按键PB1PB1 → 按键 → GND低电平有效PB1 使用 GPIO 内部上拉。按键没有按下时PB1 为高电平按键按下时PB1 被拉低因此产生下降沿。PC13 板载 LED 的驱动电平与普通外接 LED 相反PC13 输出低电平时 LED 点亮输出高电平时 LED 熄灭。五、实验原理5.1 GPIO 输出控制将 PA0、PA3、PC13 配置为通用推挽输出通过 HAL 库函数控制输出电平HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);/* PA0 输出高电平 */HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);/* PA0 输出低电平 */HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);/* PC13 输出低电平 */HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);/* PC13 输出高电平 */PA0 和 PA3 输出高电平时点亮PC13 输出低电平时点亮。5.2 按键外部中断PB1 配置为下降沿触发中断GPIO_InitStruct.PinGPIO_PIN_1;GPIO_InitStruct.ModeGPIO_MODE_IT_FALLING;GPIO_InitStruct.PullGPIO_PULLUP;HAL_GPIO_Init(GPIOB,GPIO_InitStruct);PB1 对应 EXTI1 中断线因此需要使能HAL_NVIC_SetPriority(EXTI1_IRQn,0U,0U);HAL_NVIC_EnableIRQ(EXTI1_IRQn);当按键按下时程序进入voidEXTI1_IRQHandler(void){HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);}HAL_GPIO_EXTI_IRQHandler()会清除中断标志并调用用户编写的回调函数voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin)5.3 按键消抖机械按键在按下和松开的瞬间会产生抖动如果直接处理中断可能被误认为按了很多次。本实验没有在中断中使用HAL_Delay()而是比较两次按键的时间if((now_tick-last_press_tick)200U)只有在距离上一次有效按键超过 200 ms 时才认为本次按键有效并将key_event置为 1。5.4 流水灯计时程序在主循环中使用HAL_GetTick()判断时间而不使用阻塞延时代码。if((HAL_GetTick()-last_change_tick)1000U)HAL_GetTick()返回当前系统启动后的毫秒数时间差达到 1000 ms 时切换下一只 LED。这样的写法不会长时间阻塞主程序按键中断也可以及时响应。5.5 暂停与继续程序使用变量running表示运行状态running 1流水灯运行running 0流水灯暂停。每次按下 PB1中断回调置位key_event主循环检测到事件后将running取反running(running0U)?1U:0U;当running 0时主循环不改变 LED 输出状态因此当前 LED 保持点亮再次按下 PB1 后恢复流水灯切换。六、关键程序代码6.1 系统时钟配置本实验使用内部 HSI 8 MHz不依赖外部晶振。staticvoidSystemClock_Config(void){RCC_OscInitTypeDef RCC_OscInitStruct{0};RCC_ClkInitTypeDef RCC_ClkInitStruct{0};RCC_OscInitStruct.OscillatorTypeRCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIStateRCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValueRCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLStateRCC_PLL_NONE;if(HAL_RCC_OscConfig(RCC_OscInitStruct)!HAL_OK){Error_Handler();}RCC_ClkInitStruct.ClockTypeRCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSourceRCC_SYSCLKSOURCE_HSI;RCC_ClkInitStruct.AHBCLKDividerRCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDividerRCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDividerRCC_HCLK_DIV1;if(HAL_RCC_ClockConfig(RCC_ClkInitStruct,FLASH_LATENCY_0)!HAL_OK){Error_Handler();}}6.2 GPIO 和外部中断初始化staticvoidMX_GPIO_Init(void){GPIO_InitTypeDef GPIO_InitStruct{0};__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_AFIO_CLK_ENABLE();/* 初始状态熄灭 LED */HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);GPIO_InitStruct.ModeGPIO_MODE_OUTPUT_PP;GPIO_InitStruct.PullGPIO_NOPULL;GPIO_InitStruct.SpeedGPIO_SPEED_FREQ_LOW;GPIO_InitStruct.PinGPIO_PIN_0;HAL_GPIO_Init(GPIOA,GPIO_InitStruct);GPIO_InitStruct.PinGPIO_PIN_3;HAL_GPIO_Init(GPIOA,GPIO_InitStruct);GPIO_InitStruct.PinGPIO_PIN_13;HAL_GPIO_Init(GPIOC,GPIO_InitStruct);/* PB1 按键下降沿中断 */GPIO_InitStruct.PinGPIO_PIN_1;GPIO_InitStruct.ModeGPIO_MODE_IT_FALLING;GPIO_InitStruct.PullGPIO_PULLUP;HAL_GPIO_Init(GPIOB,GPIO_InitStruct);HAL_NVIC_SetPriority(EXTI1_IRQn,0U,0U);HAL_NVIC_EnableIRQ(EXTI1_IRQn);}6.3 按键中断回调voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){staticuint32_tlast_press_tick0U;uint32_tnow_tick;if(GPIO_PinGPIO_PIN_1){now_tickHAL_GetTick();if((now_tick-last_press_tick)200U){last_press_ticknow_tick;key_event1U;}}}6.4 主循环while(1){if(key_event!0U){key_event0U;running(running0U)?1U:0U;last_change_tickHAL_GetTick();}if(running0U){last_change_tickHAL_GetTick();continue;}if((HAL_GetTick()-last_change_tick)1000U){last_change_tickHAL_GetTick();HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);if(step0U){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);}elseif(step1U){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);}else{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);}step;if(step3U){step0U;}}}七、实验结果受帧率问题本gif动图并不能很好体现实验结果详情请看视频内容
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Ceph RBD 块存储实战:从部署到性能调优与容灾 2026/9/30 9:19:07

Ceph RBD 块存储实战:从部署到性能调优与容灾

简介:这份PDF文档面向具备一定存储架构经验的云服务管理人员与开源分布式存储爱好者,系统讲解Ceph块存储的部署与应用。内容以三节点实验集群为背景,在Ubuntu 18.04环境下完成RBD池创建、块设备镜像管理、镜像映射至Linux块设备、格式化挂载及…

阅读更多 →
RTX 4090单卡部署27B模型:三值化量化与推理调优全实录 2026/9/30 9:19:07

RTX 4090单卡部署27B模型:三值化量化与推理调优全实录

RTX 4090 的 24GB 显存,放在 27B 大模型面前就是个尴尬的数字:FP16 要 54GB,放不下;INT4 能挤进去但想开长上下文又提心吊胆。最近我花了两周时间折腾 Ternary-Bonsai-2-27B 这个三值化模型,用 PTQ1_0 方案把它完整部署…

阅读更多 →
RTX 4090跑27B大模型:三元量化+llama.cpp部署实战 2026/9/30 9:19:07

RTX 4090跑27B大模型:三元量化+llama.cpp部署实战

RTX 4090这块卡,入手之后绕不开的一个话题就是本地跑大模型。24GB显存放在消费级市场已经是天花板,可真要跑一个27B级别的模型,还是心里没底——FP16权重光模型本身就奔着54GB去了,显存直接翻倍都不够。直到我拿到Ternary-Bonsai-…

阅读更多 →
适合短视频与有声书的 AI 文字转语音工具对比 2026/9/30 9:19:07

适合短视频与有声书的 AI 文字转语音工具对比

鲲穹灵境配音核心功能:鲲穹灵境配音是一款网页端 AI 文字转语音工具,支持文本一键生成配音,内置多种风格音色,可自定义语速、音量、音调,支持手动添加停顿标记、多音字校正、情绪调节,还能叠加背景音乐&…

阅读更多 →
SFRP2、Wnt与祖细胞栖息地——犬原代肾上腺外膜成纤维细胞如何解析微环境调控的分子网络 2026/9/30 9:19:06

SFRP2、Wnt与祖细胞栖息地——犬原代肾上腺外膜成纤维细胞如何解析微环境调控的分子网络

在肾上腺研究领域,皮质醇、醛固酮和儿茶酚胺的合成与分泌机制长期占据着研究舞台的中心。肾上腺皮质细胞、髓质嗜铬细胞以及调控它们的下丘脑-垂体轴,构成了经典内分泌学教科书中反复描摹的“信号主干道”。然而,在这条主干道的两侧&#xff…

阅读更多 →
油气领域多智能体协同与领域大模型落地实践 2026/9/30 9:18:58

油气领域多智能体协同与领域大模型落地实践

1. 项目概述:油气行业正迎来一场静默却深刻的“智能体革命”最近在几个能源行业技术沙龙里,我反复听到一个词被拎出来讨论——不是“数字孪生”,也不是“工业互联网”,而是“多智能体协同”。这个词乍一听像科幻小说里的设定&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉