GPIO_EXIT1模式
时间: 2024-06-17 18:05:01 浏览: 11
GPIO_EXTI1是STM32系列微控制器的外部中断输入模式之一,可以通过配置相应的寄存器将外部中断的输入信号映射到GPIO口上,以实现中断响应。具体来说,GPIO_EXTI1是指将外部中断映射到GPIO口1上,当GPIO口1上的信号发生变化时,就会触发相应的中断处理程序。在使用GPIO_EXTI1模式时,需要先对GPIO口进行配置,然后再对外部中断进行配置,最后再使能中断。这种模式常用于需要对外部事件进行响应的应用场景,如按键检测等。
相关问题
解释下述代码#include "stm32f10x.h" u8 ReadValue1=0; void Gpio_Init_Port(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD, &GPIO_InitStructure); } void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_Init(&EXTI_InitStructure); } void EXIT0_IRQHander(void) { ReadValue1=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0); if(ReadValue1==1) { GPIO_WriteBit(GPIOA, GPIO_Pin_8, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8)))); GPIO_WriteBit(GPIOD, GPIO_Pin_2, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_2)))); } EXTI_ClearFlag(EXTI_Line0); } int main() { Gpio_Init_Port(); EXTI_Configuration(); NVIC_Config(); GPIO_WriteBit(GPIOA, GPIO_Pin_8,Bit_RESET); GPIO_WriteBit(GPIOD, GPIO_Pin_2,Bit_RESET); while(1); }
这段代码是针对STM32F10x系列单片机进行的配置和初始化,主要实现了以下几个功能:
1. Gpio_Init_Port()函数:初始化GPIO引脚,其中包括了GPIOA的第8个引脚和GPIOA的第0个引脚以及GPIOD的第2个引脚。GPIOA的第8个引脚被配置为输出模式,而GPIOA的第0个引脚和GPIOD的第2个引脚被配置为输入模式。
2. NVIC_Config()函数:配置中断优先级。在这里,设置了EXTI0_IRQn中断的抢占优先级和子优先级,都为0。
3. EXTI_Configuration()函数:配置外部中断线。在这里,配置了GPIOA的第0个引脚对应的EXTI_Line0外部中断线,以上升沿触发方式进行中断。
4. EXTI0_IRQHandler()函数:外部中断0的中断服务函数。当GPIOA的第0个引脚产生上升沿时,读取该引脚的值,如果为1,则将GPIOA的第8个引脚和GPIOD的第2个引脚的输出状态取反。最后清除EXTI_Line0中断标志位。
5. 主函数main():在这里进行了GPIO输出引脚的初始化,然后进入一个死循环。
void EXTI0_IRQHandler(void) { // 判断按键状态,如果长按了Src Key,而且当前不在测试状态中,进入测试状态 if (HAL_GPIO_ReadPin(SRC_KEY_GPIO_Port, SRC_KEY_Pin) == GPIO_PIN_RESET && !is_testing) { is_testing = true; HAL_Delay(1000); // 延时1s,防止误触发 if (HAL_GPIO_ReadPin(SRC_KEY_GPIO_Port, SRC_KEY_Pin) == GPIO_PIN_RESET) { // 进入测试状态 testing_type = get_testing_type(); // 获取测试类型 enter_testing_mode(testing_type); // 进入测试模式 } else { is_testing = false; } } // 如果在测试状态中,根据测试类型进行相应处理 if (is_testing) { switch (testing_type) { case TESTING_TYPE_A: // 处理测试A break; case TESTING_TYPE_B: // 处理测试B break; default: break; } } // 如果退出测试,回到正常状态 if (HAL_GPIO_ReadPin(SRC_KEY_GPIO_Port, SRC_KEY_Pin) == GPIO_PIN_SET && is_testing) { is_testing = false; exit_testing_mode(testing_type); // 退出测试模式 } }
这段代码的作用是对 `Src Key` 按钮的中断进行处理。具体来说,当检测到 `Src Key` 按钮被长按,并且当前不在测试状态中时,会进入测试状态,进行相应的测试;当检测到 `Src Key` 按钮被松开,并且当前处于测试状态时,会退出测试状态,回到正常状态。
在代码实现中,使用了 `HAL_GPIO_ReadPin()` 函数来读取 `Src Key` 按钮的状态,使用了 `HAL_Delay()` 函数进行延时,避免误触发。同时,在进入测试状态时,调用了 `get_testing_type()` 函数来获取测试类型,调用了 `enter_testing_mode()` 函数进入测试模式,在退出测试状态时,调用了 `exit_testing_mode()` 函数退出测试模式。
需要注意的是,本段代码中的 `is_testing` 和 `testing_type` 都是全局变量,需要在其他地方进行声明和定义。同时,`TESTING_TYPE_A` 和 `TESTING_TYPE_B` 都是枚举类型,需要在代码中进行定义。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)