STM32F401 外部中断误触发问题

现象:调试STM32F411低功耗的时候,使用的PA1做个唤醒源,发现在没有触发EXTI的时候,MCU居然被唤醒。

原因:PA1配置成EXTI(上拉输入),经常被误触发

解决方式:将PA1配置成浮空输入,并且外部上拉一个4.7k电阻,就不会误触发了。

这种bug的原因一直没有搞清,先记下省的以后就忘记了,猜测可能是STM32芯片bug。

EXTI配置代码如下:

void TM_SetExit(FunctionalState State)
{
//PA1
#define REQUEST_PORT GPIOA
#define REQUEST_PIN GPIO_Pin_1
#define REQUEST_CLK_BUS RCC_AHB1Periph_GPIOA
#define REQUEST_PORT_SRC EXTI_PortSourceGPIOA
#define REQUEST_PIN_SRC GPIO_PinSource1
#define REQUEST_EXTI_LINE EXTI_Line1
#define REQUEST_NVIC_CHANNEL EXTI1_IRQn

GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;

RCC_AHB1PeriphClockCmd(REQUEST_CLK_BUS, ENABLE);
GPIO_InitStructure.GPIO_Pin = REQUEST_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//GPIO_PuPd_UP;
GPIO_Init(REQUEST_PORT, &GPIO_InitStructure);
SYSCFG_EXTILineConfig(REQUEST_PORT_SRC, REQUEST_PIN_SRC);

NVIC_InitStructure.NVIC_IRQChannel = REQUEST_NVIC_CHANNEL;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = State;
NVIC_Init(&NVIC_InitStructure);

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_LineCmd = State;
EXTI_InitStructure.EXTI_Line = REQUEST_EXTI_LINE;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
EXTI_ClearITPendingBit(REQUEST_EXTI_LINE);
}

原文地址:https://www.cnblogs.com/mfc1207/p/9324324.html

时间: 2024-10-10 15:27:01

STM32F401 外部中断误触发问题的相关文章

嵌入式单片机,外部中断,中断标志位介绍

body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-chil

向linux内核中添加外部中断驱动模块

本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内核中添加外部中断驱动模块.7.完整驱动程序代码.linux的内核版本为linux2.6.32.2. 一.linux模块的框架以及混杂设备相关知识 1.内核模块的框架如下图所示,其中module_init()(图中有误,不是modules_init)只有在使用insmod命令手动加载模块时才会被调用,

cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)

很多单片机都有低功耗模式, STM32 也不例外.在系统或电源复位以后,微控制器处于运行状态.运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码.当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时.用户需要根据最低电源消耗,最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式. STM32 的低功耗模式有 3 种: 1)睡眠模式( CM3 内核停止,外设仍然运行) 2)停止模式(所有时钟都停止) 3)待机模式( 1.8V 内核电源关闭) 在这

单片微机原理P2:80C51外部中断与定时器系统

0. 外部中断 书上的废话当然是很多的了,对于中断我想大家应该早就有一个很直观的认识,就是"设置断点,执行外部外码,然后返回断点"这样的三个过程.中断给系统提供了一个良好的响应模式.当然了,响应中断的时候记得保护现场,这是写汇编的良好习惯. 80C51一共是5个中断源,这五个中断源分别是外部中断0,1定时器中断0,1,串口中断. 1. 我们现在先来看外部中断: 一般开外部中断分为4个步骤(不用查询的方式的话): 1. 设置触发方式(IT0/IT1) 2. 开启外部中断(EX0/EX1)

2440 外部中断

2440外部中断的使用 1.设置io为外部中断引脚 通过2440数据手册可以知道需要使用io的外部中断需要配置那些位 a.通过上面的表格可以看出,如果要使用io的外部中断需要把对应的位设置为10 例如:GPF0和GPF2这两个io需要使用外部中断 GPFCON &= ~((3<<0)|(3<<4));//清除相应位 GPFCON |= ((2<<0)|(2<<4));//设置相应位为外部中断引脚 b.通过上面这个表格可以看出,需要设置外部中断的触发,

理解:浮空的时候外部一定要带上上拉或者下拉电阻,否则可能导致中断不断触发

浮空的时候外部一定要带上上拉或者下拉电阻,否则可能导致中断不断触发 为什么呢? 浮空,相当于此端口在默认情况下什么都不接,呈高阻态.(IO 输入状态,没接pin) IO输入状态,不接pin就可以不断产生中断,可以这样理解吗? 不可以. IO输入状态检测到上升或下降沿触发中断 因为IO输入状态,又没有接Pin,电平可能随机变化的.变化就有上升沿或下降沿. 磁场感应导致的还是? 不一定,芯片内部状态也有可能导致.

按键抖动的处理方法(按键外部中断)

当把按键设为外部中断时,存在按键抖动问题: 一种情况是没有按按键的时候,按键有时也会因为震动等原因误触发按键事件,引起程序误判.对于这种按键抖动,解决方式有: 并上一个小电容(比如0.1uF)即可解决. 延时检测:检测到按键中断后延时50ms判断这个引脚电平,然后再做进一步处理. 还有一种情况是按下按键时,由于按键本身的结构或质量问题.操作者的发力问题等,在操作者按下一次按键的过程中,实际上触发了数次按下-抬起的动作,引起程序误判.对于这种按键抖动,解决方式有: 延时检测:检测到按键中断后延时5

《零死角玩转STM32》-17-EXTI外部中断/事件控制器

/* * 本文中的相关图片来自火哥的教程,只作为随笔记录,无侵权之意 * 21:25:46, 2017-04-08 */ EXTI:外部中断/事件控制器.STM32F429共有23根,其中EXTI0~EXTI15,分别对应GPIO中的PX0 ~ PX15,另外7根线有如下用途: (中间省略了EXTI1 ~ EXTI15) EXTI功能框图如下所示: 按照图中的序号标识,可以清晰的看出外部GPIO引脚上的电平变化是如何传递到内核,即GPIO -> EXTI -> NVIC,并触发相应的中断/事件

掌握所有IO口的外部中断

外部中断配置流程 1.初始化IO口工作在普通IO.上拉输入状态. 2.首先开IO口组中断(P0IE=1.P1IE=1.P2IE=1): 3.开组内对应的具体某IO口中断(P0IEM.P1IEM.P2IEM该寄存器里面的对应位对应相应的IO口): 4.上升沿还是下降沿触发(PICTL寄存器): 5.开CPU总中断EA=1; #include <cc2530.h> void main() { //步骤1 P0SEL &=0xDF;//P05口表示为普通IO口 P0DIR &=0xD