0


【STM32】学习笔记(EXTI)-江科大

EXTI外部中断

中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行

中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源

中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回
在这里插入图片描述

STM32中断

68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设

使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NVIC基本结构

在这里插入图片描述

AFIO复用I/O口(只能用一个)

AFIO主要用于引脚复用功能的选择和重定义

在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择
在这里插入图片描述

EXIT框图

在这里插入图片描述

旋转编码器

旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向
类型:机械触点式/霍尔传感器式/光栅式
在这里插入图片描述

硬件电路

在这里插入图片描述

对射式红外传感器计次

在这里插入图片描述

#include"stm32f10x.h"// Device headeruint16_t CountSensor_Count;voidCountSensor_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//时钟配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;//GPIO初始化
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;//设置引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//选的PB14
    
    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line14;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发EXTI_Init(&EXTI_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;//中断分组,抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;//响应优先级NVIC_Init(&NVIC_InitStructure);}uint16_tCountSensor_Get(void){return CountSensor_Count;}voidEXTI15_10_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line14)== SET){/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14)==0){
            CountSensor_Count ++;//计数}EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位}}

旋转编码器计次

在这里插入图片描述

#include"stm32f10x.h"// Device headerint16_t Encoder_Count;//两个中断voidEncoder_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;//两个中断端口
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
    
    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;//两条线路拨到中断模式
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发EXTI_Init(&EXTI_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;NVIC_Init(&NVIC_InitStructure);}int16_tEncoder_Get(void){int16_t Temp;
    Temp = Encoder_Count;
    Encoder_Count =0;return Temp;}//EXTI0中断voidEXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0)== SET){/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)==0){if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0){
                Encoder_Count --;}}EXTI_ClearITPendingBit(EXTI_Line0);}}//EXTI1中断voidEXTI1_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line1)== SET){/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0){if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)==0){
                Encoder_Count ++;}}EXTI_ClearITPendingBit(EXTI_Line1);}}
#include"stm32f10x.h"// Device header#include"Delay.h"#include"OLED.h"#include"Encoder.h"int16_t Num;intmain(void){OLED_Init();Encoder_Init();OLED_ShowString(1,1,"Num:");while(1){
        Num +=Encoder_Get();OLED_ShowSignedNum(1,5, Num,5);}}

总结:中断尽量用变量、标志位,不要用来控制外部设备


本文转载自: https://blog.csdn.net/qq_25743167/article/details/132576499
版权归原作者 AI从入门到实践 所有, 如有侵权,请联系我们删除。

“【STM32】学习笔记(EXTI)-江科大”的评论:

还没有评论