stm32标准库外部中断服务函数内部怎么判断是高电平到低电平(上升沿)还是低电平到高电平(下降沿)
时间: 2023-06-05 16:04:25 浏览: 63
在stm32标准库外部中断服务函数内部,可以通过读取输入引脚的状态寄存器,或者输入引脚的状态来判断是高电平到低电平(上升沿)还是低电平到高电平(下降沿)。具体可以使用EXTI_GetITStatus()函数来获取中断标志位,然后根据标志位的状态来判断是上升沿还是下降沿。
相关问题
stm32hal库的exti怎么检测是高电平还是低电平
在使用STM32HAL库的外部中断(EXTI)时,可以通过配置EXTI的触发模式来检测是高电平触发还是低电平触发。
以EXTI0为例,以下是配置EXTI0为下降沿触发模式的代码:
```
// 配置GPIO口
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 下降沿触发模式
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置EXTI线
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
HAL_EXTI_GetHandle(&hexti0, EXTI_LINE_0);
HAL_EXTI_RegisterCallback(&hexti0, HAL_EXTI_COMMON_CB_ID, EXTI_Callback);
HAL_EXTI_SetConfigLine(&hexti0, EXTI_TRIGGER_FALLING);
```
可以看到,通过设置`GPIO_InitStruct.Mode`为`GPIO_MODE_IT_FALLING`,将GPIO口配置为下降沿触发模式。然后通过`HAL_EXTI_SetConfigLine()`函数将EXTI线配置为下降沿触发模式。
如果需要配置为上升沿触发模式,则将`GPIO_InitStruct.Mode`设置为`GPIO_MODE_IT_RISING`,并将`HAL_EXTI_SetConfigLine()`函数的参数设置为`EXTI_TRIGGER_RISING`即可。
需要注意的是,如果需要检测高电平或低电平触发,需要通过外部电路将信号转换为上升沿或下降沿触发。如果直接使用GPIO口作为输入,需要保证输入信号的上升沿或下降沿斜率大于芯片内部输入滤波器的响应时间。
编写一个按键中断的程序,并设置上升沿,下降沿,高电平,低电平等触发方式
这里提供一个基于STM32F4的按键中断程序示例,可以设置上升沿、下降沿、高电平和低电平等触发方式:
```c
#include "stm32f4xx.h"
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET) //检测是否触发了EXTI0中断
{
//执行相应的操作
//...
EXTI_ClearITPendingBit(EXTI_Line0); //清除中断标志位
}
}
void EXTI_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能SYSCFG时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选择PA0作为按键输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //设置为输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉电阻
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置GPIO速度为100MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); //将GPIOA0与EXTI线连接
EXTI_InitStructure.EXTI_Line = EXTI_Line0; //选择EXTI线0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //设置触发方式为上升沿和下降沿
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能EXTI线
EXTI_Init(&EXTI_InitStructure); //初始化EXTI
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //选择EXTI0中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; //设置抢占优先级为最高
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //设置子优先级为最高
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能EXTI0中断通道
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
}
int main(void)
{
EXTI_Config(); //配置EXTI
while(1)
{
//主循环
}
}
```
在上述程序中,我们首先定义了一个`EXTI0_IRQHandler()`函数,用于处理EXTI0中断。在函数内部,我们可以执行相应的操作,例如修改某个标志位、触发其他中断等。
接下来是`EXTI_Config()`函数,用于配置EXTI。在函数内部,我们首先使能了GPIOA和SYSCFG的时钟,然后设置了GPIOA0为输入模式,并上拉了电阻。接着,我们将GPIOA0与EXTI线连接,并选择了EXTI线0。设置了触发方式为上升沿和下降沿,并使能了EXTI线。最后,我们初始化了NVIC,选择了EXTI0中断通道,并设置了抢占优先级和子优先级。
在主函数中,我们调用了`EXTI_Config()`函数进行配置,并进入了一个死循环。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.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)