当前位置: 首页 > article >正文

stm32——EXTI外部中断

NVIC优先级分组

  1. 抢占优先级
    可以进行中断嵌套的优先级,即可以不等上一个中断执行完成就进入下一个中断

  2. 响应优先级
    决定中断发生的顺序,但不可嵌套

程序实现

对射式红外传感计次

#include "stm32f10x.h"                  // Device header
#include "delay.h" 
#include "oled.h"
#include "countsensor.h"uint8_t key_val, key_old, key_up;
int main(){ OLED_Init();CountSensorInit();OLED_ShowString(1, 1, "Count:");while(1){OLED_ShowNum(1, 7, CountSenorGet(), 5);}
}
/*
countsensor.c
*/
#include "stm32f10x.h"                  // Device header
#include "delay.h"uint16_t count_sensor_count;void CountSensorInit(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitTypeDef gpio_struc;gpio_struc.GPIO_Mode = GPIO_Mode_IPU;gpio_struc.GPIO_Pin = GPIO_Pin_14;gpio_struc.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &gpio_struc);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);EXTI_InitTypeDef exti_init_struc;exti_init_struc.EXTI_Line = EXTI_Line14;exti_init_struc.EXTI_LineCmd = ENABLE;exti_init_struc.EXTI_Mode = EXTI_Mode_Interrupt;exti_init_struc.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_Init(&exti_init_struc); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef nvic_init_struc;nvic_init_struc.NVIC_IRQChannel = EXTI15_10_IRQn;nvic_init_struc.NVIC_IRQChannelCmd = ENABLE;nvic_init_struc.NVIC_IRQChannelPreemptionPriority = 1;nvic_init_struc.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&nvic_init_struc);
}uint16_t CountSenorGet(void){return count_sensor_count;
}void EXTI15_10_IRQHandler(void){// 该中断通道10~15共用,需判断Line14if(EXTI_GetITStatus(EXTI_Line14) == SET){if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0){  // 再次检验电平// 1 遮挡时计数 0 拿开时计数count_sensor_count ++;EXTI_ClearITPendingBit(EXTI_Line14);}			}// 注意,该处数据乱跳很正常,光敏电阻变化导致PB14口的高低电平变化// 但是由于存在抖动,电平在很短时间变化多次,从而产生了多次计数
}

旋转编码器计次

#include "stm32f10x.h"                  // Device header
#include "delay.h" 
#include "oled.h"
#include "encoder.h"uint8_t key_val, key_old, key_up;
int16_t num;
int main(){ OLED_Init();EncoderInit();OLED_ShowString(1, 1, "num:");while(1){num += EncoderGet();OLED_ShowSignedNum(1, 5, num, 5);}
}
/*
encoder.c
*/#include "stm32f10x.h"                  // Device headerint16_t encoder_count;void EncoderInit(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitTypeDef gpio_struc;gpio_struc.GPIO_Mode = GPIO_Mode_IPU;gpio_struc.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;gpio_struc.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &gpio_struc);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);EXTI_InitTypeDef exti_init_struc;exti_init_struc.EXTI_Line = EXTI_Line0 | EXTI_Line1;exti_init_struc.EXTI_LineCmd = ENABLE;exti_init_struc.EXTI_Mode = EXTI_Mode_Interrupt;exti_init_struc.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_Init(&exti_init_struc); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef nvic_init_struc;nvic_init_struc.NVIC_IRQChannel = EXTI0_IRQn;nvic_init_struc.NVIC_IRQChannelCmd = ENABLE;nvic_init_struc.NVIC_IRQChannelPreemptionPriority = 1;nvic_init_struc.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&nvic_init_struc);nvic_init_struc.NVIC_IRQChannel = EXTI1_IRQn;nvic_init_struc.NVIC_IRQChannelCmd = ENABLE;nvic_init_struc.NVIC_IRQChannelPreemptionPriority = 1;nvic_init_struc.NVIC_IRQChannelSubPriority = 2;NVIC_Init(&nvic_init_struc);
}int16_t EncoderGet(void){int16_t temp;temp = encoder_count;encoder_count = 0;return temp;
}void EXTI0_IRQHandler(void){if(EXTI_GetFlagStatus(EXTI_Line0) == SET){  // 检查中断标志if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){encoder_count --;}EXTI_ClearITPendingBit(EXTI_Line0);  // 清除中断标志}
}void EXTI1_IRQHandler(void){if(EXTI_GetFlagStatus(EXTI_Line1) == SET){if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0){encoder_count ++;}EXTI_ClearITPendingBit(EXTI_Line1);}
}
http://www.lryc.cn/news/2380197.html

相关文章:

  • Python:操作Excel按行写入
  • Redis进阶知识
  • Python机器学习笔记(二十三 模型评估与改进-网格搜索)
  • 12.vue整合springboot首页显示数据库表-实现按钮:【添加修改删除查询】
  • bisheng系列(一)- 本地部署(Docker)
  • 如何用Python批量解压ZIP文件?快速解决方案
  • DriveGenVLM:基于视觉-语言模型的自动驾驶真实世界视频生成
  • JavaScript 中的五种继承方式进行深入对比
  • 企业标准信息公共服务平台已开放标准通编辑器访问入口
  • [Linux]安装吧!我的软件包管理器!
  • Spring Boot 与 RabbitMQ 的深度集成实践(三)
  • 进阶-数据结构部分:1、数据结构入门
  • React 19中useContext不需要Provider了。
  • Json schema校验json字符串(networknt/json-schema-validator库)
  • 交易所开发:构建功能完备的金融基础设施全流程指南
  • Windows_Vs2022 C#语言开发环境构建
  • Axure疑难杂症:统计分析页面引入Echarts示例动态效果
  • 展锐Android14及更新版本split_build编译方法
  • 青少年ctf平台应急响应-应急响应2
  • k8s监控方案实践补充(二):使用kube-state-metrics获取资源状态指标
  • WEB安全--SQL注入--Oracle注入
  • 基于SpringBoot的小型民营加油站管理系统
  • 每日一道leetcode(新学数据结构版)
  • 深入掌握MyBatis:连接池、动态SQL、多表查询与缓存
  • Bootstrap 5 容器与网格系统详解
  • Java反射机制详解:原理、应用与实战
  • 技术架构缺乏灵活性,如何应对变化需求?
  • 【AI时代】Java程序员大模型应用开发详细教程(上)
  • 虚拟网络编辑器
  • 102. 二叉树的层序遍历递归法:深度优先搜索的巧妙应用