精华内容
下载资源
问答
  • 2019-12-18 13:24:16

    void TIM5_Configuration(unsigned short frequency)

    { //8000

    NVIC_InitTypeDef NVIC_InitStructure;

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    TIM_ICInitTypeDef  TIM_ICInitStructure;

     

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度100MHz

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉

    GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA0

     

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //PA0复用位定时器5

    TIM_DeInit(TIM5);

     

    TIM_TimeBaseStructure.TIM_Period = frequency;

    TIM_TimeBaseStructure.TIM_Prescaler = 1;

     

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //设置时钟分割      

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数器模式为向上计数模式       

    TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);          //将配置应用到TIM2中

    TIM_ClearFlag(TIM5, TIM_FLAG_Update);                   //清除溢出中断标志    

     

    //初始化TIM5输入捕获参数

    TIM5->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC1E); //捕获禁止

       TIM5->CCMR1 |= 0x03; // IC1映射在TRC上

       TIM5->SMCR |= (1 << 6); //TI1的边沿检测器

       TIM5->SMCR &= ~((1 << 5) | (1 << 4));

       TIM5->CCER |= ((uint16_t)TIM_CCER_CC1E); //捕获使能

     

    NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

    TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断

    TIM_Cmd(TIM5, ENABLE);//DISABLE);

    }

     

    void TIM5_IRQHandler(void)

    {

    if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)//是更新中断

    {

    TIM_ClearITPendingBit(TIM5, TIM_IT_Update);  //清除TIM3更新中断标志

    }

    if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件

    {

    TIM_ClearITPendingBit(TIM5, TIM_IT_CC1);  //清除TIM3更新中断标志

    if(GPIOA->IDR & 0x0001) //上升沿

    {

    testcnt1++;

    }

    else

    {

    testcnt2++;

    }     

    }      

    }

     

    更多相关内容
  • 起初想用stm32做一个中断控制的4x4阵列键盘,利用的是PA0~PA7,八个I/O口。摁下按键对应的横(纵)线为接地为低电平。 识别方式为PA4~PA7设为上拉电阻输入,PA0~PA3设为推挽输出并将其复位(设为0)来保证无论...

    一。问题产生的过程

        起初想用stm32做一个中断控制的4x4阵列键盘,利用的是PA0~PA7,八个I/O口。摁下按键对应的横(纵)线为接地为低电平。

        识别方式为PA4~PA7设为上拉电阻输入,PA0~PA3设为推挽输出并将其复位(设为0)来保证无论对应横线上的按键是否按下恒为低电平。摁下按键后读取八个I/O口的值赋予a,然后将PA4~PA7、PA0~PA3状态翻转再读取八个I/O口的值赋予b,这时只需要将a与上b即可确定按下的是哪个键。然后将识别到的键按键的值显示再LED屏幕上。这时功能是能完全实现的:

    由于项目需要让反馈更加明显(按下对应按键需要语音提示),且做出相应动作需要在对应中断函数中完成。于是我将PA4~PA7四个通道设为下降沿触发,中断函数为EXTI4_IRQHandler()和EXTI9_5_IRQHandler。并且添加了提示音函数。这时问题就产生了。

    二。问题描述

    设想上应该每次摁下按键都将进入中断函数,播放一次提示音并显示按下的按键值。可是显示一切正常,但提示音非常长已经超过了BUZZER_BEEP1()函数内设定的0.2秒。为搞清楚原因设置一个全局变量n来记录进入中断函数的次数: 

    结果发现每按一次n+2,也就是重复进入了中断函数。

     三。问题发现与解决

    由于是下降沿触发,这时对电平要求很高,电平波动或不匹配都可能造成系统误以为触发了中断从而进入中断函数。而我这里采用了推挽输出模式来保证对横(或纵)线四个I/O识别时不受纵(或横)线I/O口的影响。特别是每识别完四个对PA4~PA7、PA0~PA3状态进行了翻转,可能就是这时对电平产生了影响导致重复进入了中断函数。

    解决办法:改变识别按键的逻辑,用于中断的通道避免采用推挽输出模式,或者尽量避免翻转,这可能导致中断触发的I/O口的状态改变。

    展开全文
  • 采用STM32F103C8T6单片机,KeilMDK5.32版本。 外部中断线1连接PA1,硬件下降沿触发,在中断回调函数中实现LED的亮灭的翻转。
  • STM32 外部中断

    2022-05-08 14:54:48
    外部中断类型 中断:在正常运行程序时,由于触发了某个条件,暂停运行目前正在运行的程序,转而去执行另一个程序 中断优先级:中断优先级有主优先级和子...GPIO触发中断的方式:触发中断方式由配置中断时决定,有上.

    外部中断类型

    中断:在正常运行程序时,由于触发了某个条件,暂停运行目前正在运行的程序,转而去执行另一个程序

    中断优先级:中断优先级有主优先级和子优先级,当同时触发了两个中断时,CPU会先判断主优先级,如果主优先级一样,则比较子优先级。优先级高的程序将先执行。
    当执行一个中断程序时,可以在中断执行的程序里面执行另一个中断程序,如在一个中断程序里加入延时,但这种操作会很危险,当正在执行的中断的比另一个中断的优先级低时,就会陷入这个中断无法退出

    GPIO触发中断的方式:触发中断方式由配置中断时决定,有上沿触发(电平由低变为高时触发),下沿触发(电平由高变为低时触发),上下沿触发(电平变化一次触发一次)。

    wai'bu

    STM32的每个IO都可以作为外部中断输入。

    STM32的中断控制器支持19个外部中断/事件请求:

    线0~15:对应外部IO口的输入中断。

    线16:连接到PVD输出。

    线17:连接到RTC闹钟事件。

    线18:连接到USB唤醒事件。

    每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。

    从上面可以看出,STM32供IO使用的中断线只有16个,但是STM32F10x系列的IO口多达上百个,STM32F103ZET6(112),

    STM32F103RCT6(51),那么中断线怎么跟io口对应呢?

    GPIOx.0映射到EXTI0

    GPIOx.1映射到EXTI1

    GPIOx.15映射到EXTI15

    对于每个中断线,我们可以设置相应的触发方式(上升沿触发,下降沿触发,边沿触发)以及使能。

    外部中断配置 

    1 配置RCC时钟
    将RCC的High Speed Clock(HSE)配置为Crystal/Ceramic Resonator
    将主频设置为72MHz

     


    2 配置GPIO
    将PA0脚配置为GPIO_EXTI0

     

    配置GPIO详细参数


    3 配置NVIC
    使能PA0外部中断的EXTI Line0 interrupt
    根据需要修改中断的优先级

     


    4 配置工程 ,生成MDK-ARM工程代码
    5 添加中断处理代码

    uint8_t key_state = 0;
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
    	if(GPIO_Pin == GPIO_PIN_0)
    		key_state = 1;
    }
    

    展开全文
  • STM32外部中断触发

    千次阅读 2020-10-21 16:50:49
    也量了引脚的电平,是一个持续的高电平,并没有出现任何的沿(我设置的触发方式是下降沿触发,单片机是STM32F103ZE)。 通过查看手册发现,要使用外部中断功能涉及到的寄存器主要有以下4个寄存器: - 中断屏蔽寄存器...

    最近在做一个关于USB PD快充的项目,在使用外部中断的时候遇到了一个奇怪的问题,一使能中断就直接触发了外部中断,进去了中断服务函数。

    引脚配置是高电平,上拉;也量了引脚的电平,是一个持续的高电平,并没有出现任何的沿(我设置的触发方式是下降沿触发,单片机是STM32F103ZE)。

    通过查看手册发现,要使用外部中断功能涉及到的寄存器主要有以下4个寄存器:

    - 中断屏蔽寄存器(EXTI_IMR)
    - 上升沿触发选择寄存器(EXTI_RTSR)
    - 下降沿触发选择寄存器(EXTI_FTSR)
    - 挂起寄存器(EXTI_PR)

    外部中断/事件控制器框图
    由图中的红线可知:
    第一个红箭头处为逻辑或,当边沿检测电路检测到下降沿或上升沿的时候,不管软件中断事件寄存器的值是多少,挂起寄存器都会被置为1;
    蓝色箭头处为逻辑与,由于在配置外部中断的时候,中断屏蔽寄存器已经被置1,所以当挂起寄存器置为1的时候就会进到中断服务函数里即触发了中断。

    由上面的分析可知,要同时满足EXTI_PR和EXTI_IMR两个寄存器才会进到中断服务函数。

    但是我一进中断就会清掉挂起寄存器,而且我还用void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)函数将引脚恢复为了初始状态,为什么还会一开启中断就进中断函数了呢?

    通过仿真发现,在清完挂起寄存器后,由于下降沿来的速度很快,基本上在3us左右,所以在我还没关掉中断使能的时候,挂起寄存器就又被值1了,虽然这时候我关掉了中断使能,但是挂起寄存器和中断屏蔽寄存器都是1,所以当我再开中断使能的时候,由于EXTI_PR和EXTI_IMR逻辑与成立,所以马上就进了中断。

    所以我们在使用外部中断的时候,要注意EXTI_PR和EXTI_IMR这两个寄存器,在开启中断使能前,要保证挂起寄存器的值一定是被清零的,可用EXTI->PR = __EXTI_LINE__来进行挂起寄存器清零,如我配置为外部中断的引脚是GPIO_PIN_1,所以__EXTI_LINE__的值就是GPIO_PIN_1。

        GPIO_InitTypeDef GPIO_InitStruct;
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
    
    	/* PA1配为外部中断,下降沿触发 */
        GPIO_InitStruct.Pin = GPIO_PIN_1;
        GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    	
    	/* 清挂起寄存器,写1清零 */
    	__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
    	
    	/* 设置中断优先级 */
        HAL_NVIC_SetPriority(EXTI1_IRQn, 1, 0);
    
    	/* 开启中断使能 */
        HAL_NVIC_EnableIRQ(EXTI1_IRQn);
    

    以上为本人亲测可行,实际情况不同实际的效果可能也会不一样。
    如果上面的方法不行,可以看看RCC->APB2ENR的AFIO有没有使能,没有使能的话就把它使能。

    展开全文
  • 外部中断的配置流程 定义结构体变量 1.使能SYSCFG时钟、使能GPIOE时钟 2.初始化GPIO、设置GPIOE各项参数 3.设置IO口与中断线的映射关系 4.初始化线上中断、设置中断各项参数 5.配置中断分组、设置各项参数 6...
  • STM32的配置中,有这么一个设置: 但是这其实是设置下降沿捕获,对应设置的寄存器为CCER, 可以看到这双沿触发就是下降沿触发。因为bit[3:2]都是保留的。 因此在仔细查看了各路大佬的博客后,发现双边沿触发...
  • 而且建议尽量不要使用双沿触发,即对于时钟的触发最好同步设置为上升沿/下降沿触发。 双沿触发的场景 场景描述 下面使用两个D触发器来说明双沿触发问题,如下图所示是两个D触发器,其中D(ata)口用于接收数去,Q口...
  • 浮空输入中断被误触发问题
  • STM32中断触发和事件触发彻底理解

    千次阅读 多人点赞 2020-07-12 21:15:39
    先拿一件生活中的事情打比方对上述三个概念做个基本的粗略理解,之后再分享一个STM32 GPIO外部中断配置案例。 比如一老师在教室里给学生们上课。课堂上的学生可能做出各种行为动作,比方做笔记、打哈气、翻书包、讲...
  • 获取按键的下降沿数据 会分成两种情况 1 发生了捕获事件 2 没有发生捕获事件 也就是他只是固定时间段的一种电平 (0或者1) 一 按键 1 按键的下降沿 下降沿是 1-0 变化 就是他是一段时间的电平变化 就是完成了某个...
  • 采用STM32F103C8T6单片机,KeilMDK5.32版本 定时器的使用内部时钟源 CK_PSC = CK_INT = 72MHz CK_CNT = 10KHz 计数器每计数一个数耗时0.0001s = 100us = 0.1ms 预分频器为72MHz / 10KHz = 7200 - 1 = 7199 计数器重...
  • 二、基于 STM32CubeMX 的外部中断设计步骤: 1、在 STM32CubeMX 中指定引脚,配置中断初始化参数: ① 将 GPIO 设置为GPIO_EXTI功能: ② 设置中断触发条件:上升沿触发下降沿触发或双边沿触发: 此处是下降沿...
  • 中断:就是当 CPU 执行程序时,由于发生了某种随机的事件(外部或内部),引起 CPU 暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的...
  • 目录 STM32外部中断概述 EXIT框图 中断配置优先级 ... 外部中断触发条件有三种,电平上升沿触发,电平下降沿触发,电平上升下降沿触发。这三种情况都是读取到的IO口的电平状态,通过控制IO口的电...
  • STM32中断涉及的内容比较多,我们今天仅仅说明不同中断触发类型之间的匹配。STM32外部中断触发方式都是边沿触发,如下: EXTI_Trigger_Rising = 0x08, EXTI_Trigger_Falling = 0x0C, EXTI_Trigger_Rising_...
  • STM32学习:外部中断

    千次阅读 2022-02-24 20:47:33
    文章目录一、STM32外部中断1、基本知识2、中断设计流程二、硬件配置1、proteus仿真电路搭建2、CubeMX硬件配置3、配置中断1、寻找中断虚函数2.读入数据总结 一、STM32外部中断 1、基本知识 1、外部中断(EXTI)是STM...
  • 关于STM32F407一次事件触发两次中断

    千次阅读 多人点赞 2021-01-03 22:29:49
    关于STM32F407一次事件触发两次中断问题描述“bug的提出”“bug的解决”功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格...
  • STM32F0系列——中断

    2022-06-20 22:05:48
    学习STM32所总结中断内容
  • STM32 GPIO触发中断

    千次阅读 2019-10-19 18:22:31
    配置GPIO管脚上升沿下降沿触发中断:  static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_...
  • EXTI(External interrupt/...每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
  • STM32外部中断边沿触发存在延时问题

    千次阅读 多人点赞 2020-05-31 16:20:56
    STM32外部中断时延问题 概括:通过软件调试,示波器观察的方式,来分析外部中断存在时延的原因。 在调试模拟SPI接收的时候,想用外部中断检测上升沿的方式来捕捉SCK的上升沿却发现了外部中断存在时延的情况。 直接上...
  • 1. STM32的外部中断线 2.外部中断线与IO引脚对应关系 3. 中断向量与服务函数 4.EXTI功能框图 三.外部中断配置(CUBEMX) 1.思维导图 2.工程配置 3.代码详解 一.外部中断介绍 首先我们要理解什么是中断。...
  • 第一步、使用stm32cubeMX创建工程,选择相应的芯片,配置RCC、SYS、引脚和时钟如下图所示: 注意,由于按键上有上拉电阻,这里选择中断模式的时候,我们选择下降沿触发中断。 第二步,配置输出Keil工程
  • 为了了解 STM32F103C8 中的中断,我们将使用按钮作为外部中断。在这里,我们让从一个变量从 0 开始每秒增1,并将其显示在16x2 LCD上,当按下按钮时,LED根据状态亮起或熄灭,LCD 显示屏会显示 INTERRUPT。 中断类型...
  • 外部中断EXIT是STM32芯片实时处理外部事件的一种机制,由于中断请求来自GPIO端口的引脚,所以称为外部中断 三、外部中断的程序设计思路 传统STM32外部中断设计步骤: 基于STM32CubeMX的外部中断设计步骤: 中断...
  • 实验预期效果 ① 上电复位时LED处于熄灭状态; ② 按下KEY1,LED点亮; ③ 按下KEY2,LED熄灭; 1 相关原理图 2 软件配置 配置PE3引脚和PE4​​引脚为外部中断触发引脚:​ ...
  • 采用STM32F103C8T6单片机,KeilMDK5.32版本 开启外部中断线1 并连接PA1,下降沿触发,上拉输入;在NVIC中使能外部中断1,设置优先级。 WFI指令进入停止模式状态。
  • STM32单片机外部中断配置讲解

    千次阅读 2021-09-09 11:11:34
    STM32单片机外部中断配置讲解 01 单片机外部中断简介 所谓外部中断,就是通过外部信号所引起的中断,如单片机引脚上的电平变化(高电平、低电平)、边沿变化(上升沿下降沿)等。51单片机有5个中断源,其中有两个是...
  • stm32之外部中断

    2022-05-08 23:23:20
    中断:在计算机系统中,中断是指计算机自动响应一个中断请求信号,暂时停止当前程序的执行,转而...1)stm32单片机上的I/O口有其对应的外部中断/事件线。 如下图中多个I/O口对应着一个外部中断/事件线: 在使.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,297
精华内容 1,718
关键字:

stm32下降沿触发中断