用stm32的中断方式,通过两个按键分别控制流水灯的方向和亮灭

时间: 2023-06-15 13:05:01 浏览: 203
好的,我可以为您提供一个简单的示例代码,您可以根据您的具体硬件环境和需求进行修改和优化。 首先,您需要定义一些宏和变量来控制流水灯的状态和方向: ```c #include "stm32f10x.h" #define LED1_PIN GPIO_Pin_8 #define LED2_PIN GPIO_Pin_9 #define LED3_PIN GPIO_Pin_10 #define LED4_PIN GPIO_Pin_11 #define KEY1_PIN GPIO_Pin_0 #define KEY2_PIN GPIO_Pin_1 #define KEY1_PRESSED (GPIO_ReadInputDataBit(GPIOA, KEY1_PIN) == Bit_RESET) #define KEY2_PRESSED (GPIO_ReadInputDataBit(GPIOA, KEY2_PIN) == Bit_RESET) enum {LEFT, RIGHT} direction = LEFT; uint8_t leds = 0x01; ``` 其中,`LED1_PIN` 到 `LED4_PIN` 定义了流水灯使用的4个LED的引脚号码,`KEY1_PIN` 和 `KEY2_PIN` 定义了控制流水灯方向和亮灭的两个按键的引脚号码。`KEY1_PRESSED` 和 `KEY2_PRESSED` 判断按键是否被按下,`direction` 记录当前流水灯的方向,`leds` 记录当前流水灯的状态。 接下来,我们需要初始化GPIO和中断控制器: ```c void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* LED pins configuration */ GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Key pins configuration */ GPIO_InitStructure.GPIO_Pin = KEY1_PIN | KEY2_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* Enable AFIO clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); /* Connect EXTI Line0 and Line1 to PA0 and PA1 pins */ GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1); /* Configure EXTI Line0 and Line1 */ EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable and set EXTI Line0 and Line1 Interrupt to the lowest priority */ NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } ``` 在 `GPIO_Configuration` 函数中,我们初始化了GPIO引脚,将LED引脚设置为输出模式,将按键引脚设置为带上拉电阻的输入模式。在 `EXTI_Configuration` 函数中,我们初始化了中断控制器,将按键引脚连接到外部中断线0和1,并设置下降沿触发中断。同时,我们还将外部中断0和1的中断优先级设置为最低。 然后,我们需要编写中断服务函数: ```c void EXTI0_IRQHandler(void) { if (KEY1_PRESSED) { direction = LEFT; } EXTI_ClearITPendingBit(EXTI_Line0); } void EXTI1_IRQHandler(void) { if (KEY2_PRESSED) { leds = 0x00; } EXTI_ClearITPendingBit(EXTI_Line1); } ``` 在 `EXTI0_IRQHandler` 函数中,我们检测到按键1被按下,将流水灯的方向设置为左移。在 `EXTI1_IRQHandler` 函数中,我们检测到按键2被按下,将流水灯的状态设置为全灭。 最后,我们编写主函数,使用定时器中断驱动流水灯的移动: ```c int main(void) { GPIO_Configuration(); EXTI_Configuration(); /* Enable TIM2 clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* TIM2 Configuration */ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_Prescaler = 7199; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* TIM2 Interrupt Configuration */ NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); while(1); } void TIM2_IRQHandler(void) { switch (direction) { case LEFT: leds <<= 1; if (leds == 0x00) leds = 0x01; break; case RIGHT: leds >>= 1; if (leds == 0x00) leds = 0x08; break; } GPIO_Write(GPIOA, leds << 8); TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } ``` 在主函数中,我们初始化了定时器2,并将其设置为1ms的中断周期。在 `TIM2_IRQHandler` 函数中,我们根据当前的流水灯方向,移动流水灯的状态,并将状态写入LED引脚。 这样,您就可以通过按键控制流水灯的方向和亮灭了。需要注意的是,由于我们使用的是轮询方式,在按键被按下和中断服务函数被执行之间可能会有一定的时间延迟。如果您需要更加精确的响应时间,可以考虑使用DMA或者硬件定时器来处理输入事件。

相关推荐

最新推荐

recommend-type

基于STM32单片机流水灯仿真与程序设计

本次程序设计和仿真是基于Proteus和keil的环境对STM32F103系列单片机进行流水灯设计,通过配置STM32的GPIO工作模式,实现LED的点亮和熄灭;通过配置8位流水灯程序设计,实现灯的流水实现。 关键字:Proteus、keil、...
recommend-type

嵌入式实验报告 stm32f103 跑马灯实验 GPIO口操作

熟悉编译环境,尝试独立进行工程的创建、编译、下载。通过阅读 STM32 芯片手册了解关于 GPIO 的相关内容,并且通过编程实现 LED 流水灯控制。
recommend-type

STM32 按键检测程序

PA13 PA15 是JTAG的引脚。 所以JTAG 插上 模拟时候,不准去的。...只有调到SWD 模式 PA15 才能用。 PA13是SWDIO PA14 SWCLK 复用时候一定要注意。实验结果: DS0 交替闪烁 当按下KEY1 时候 DS1亮。 松手灭。
recommend-type

STM32的“外部中断”和“事件”区别和理解 .

事件是中断的触发源,开放了对应的中断屏蔽位,则事件可以触发相应的中断。 事件还是其它一些操作的触发源,比如DMA,还有TIM中影子寄存器的传递与更新;而中断是不能触发这些操作的,所以要把事件与中断区分开。
recommend-type

STM32中断嵌套及外部中断全程攻略

断断续续学习STM32一学期了,时间过的好快,现在对STM32F103系列单片机的中断嵌套及...废话不多说,ARM公司的Cortex-m3 内核,支持256个中断,其中包含16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

深入了解MATLAB开根号的最新研究和应用:获取开根号领域的最新动态

![matlab开根号](https://www.mathworks.com/discovery/image-segmentation/_jcr_content/mainParsys3/discoverysubsection_1185333930/mainParsys3/image_copy.adapt.full.medium.jpg/1712813808277.jpg) # 1. MATLAB开根号的理论基础 开根号运算在数学和科学计算中无处不在。在MATLAB中,开根号可以通过多种函数实现,包括`sqrt()`和`nthroot()`。`sqrt()`函数用于计算正实数的平方根,而`nt
recommend-type

react的函数组件的使用

React 的函数组件是一种简单的组件类型,用于定义无状态或者只读组件。 它们通常接受一个 props 对象作为参数并返回一个 React 元素。 函数组件的优点是代码简洁、易于测试和重用,并且它们使 React 应用程序的性能更加出色。 您可以使用函数组件来呈现简单的 UI 组件,例如按钮、菜单、标签或其他部件。 您还可以将它们与 React 中的其他组件类型(如类组件或 Hooks)结合使用,以实现更复杂的 UI 交互和功能。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。