STM32F1 - 中断系统

news/2024/11/24 14:13:21/

Interrupt

  • 1> 硬件框图
  • 2> NVIC 中断管理
  • 3> EXTI 中断管理
    • 3.1> EXTI与NVIC
    • 3.2> EXTI内部框图
  • 4> 外部中断实验
    • 4.1> 实验概述
    • 4.2> 程序设计
  • 5> 中断向量表
  • 6> 总结


1> 硬件框图

1

NVIC:Nested Vectored Interrupt Controller【嵌套向量中断控制器】

管理内核外设和片上外设的所有中断功能;

EXTI:External Interrupt 【外部中断控制器】

管理GPIO的中断;


2> NVIC 中断管理

2


3> EXTI 中断管理

3.1> EXTI与NVIC

31
STM32F103ZET6总共19个外部中断

PA0~PG0,7个引脚中只有一个可以映射到EXTI0;

外部中断EXTI 9 ~ 5 合并为EXTI9_5中断;
外部中断EXT 15~10 合并为EXT15_10中断;


3.2> EXTI内部框图

1


4> 外部中断实验


4.1> 实验概述

用2个按键控制2个LED状态翻转,用外部中断方式


4.2> 程序设计

main.c: 主程序

int main(void)
{ LED_Init();KEY_Init();LED_Off();while(1) /* stop */;//return 0;		
}

bsp_led.c: LED灯初始化及开关函数

void LED_Init(void)
{GPIO_InitTypeDef gpio_Struct_tmp = {0};// 使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);// PB5gpio_Struct_tmp.GPIO_Pin = GPIO_Pin_5;gpio_Struct_tmp.GPIO_Speed = GPIO_Speed_50MHz;gpio_Struct_tmp.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出GPIO_Init(GPIOB, &gpio_Struct_tmp); 	// PE5gpio_Struct_tmp.GPIO_Pin = GPIO_Pin_5;gpio_Struct_tmp.GPIO_Speed = GPIO_Speed_50MHz;gpio_Struct_tmp.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出GPIO_Init(GPIOE, &gpio_Struct_tmp);
}void LED_On(void)
{GPIO_ResetBits(GPIOB, GPIO_Pin_5);GPIO_ResetBits(GPIOE, GPIO_Pin_5);
}void LED_Off(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_5);GPIO_SetBits(GPIOE, GPIO_Pin_5);
}

bsp_key.c: 按键初始化

void KEY_Init(void)
{GPIO_InitTypeDef GPIO_tmp;EXTI_InitTypeDef EXTI_tmp;NVIC_InitTypeDef NVIC_tmp;/*-------------Step 1> 配置GPIO ---------------*/// 2话不说开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);GPIO_tmp.GPIO_Mode = GPIO_Mode_IPU;GPIO_tmp.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_3;	// PE4, PE3GPIO_tmp.GPIO_Speed = GPIO_Speed_50MHz; // PE4, PE3 上拉输入GPIO_Init(GPIOE, &GPIO_tmp);/*------------- Step 2> 配置AFIO  ------------*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4); // EXTI_Line4GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3); // EXTI_Line3/*------------- Step 3> 配置EXTI  ------------*/EXTI_tmp.EXTI_Line = EXTI_Line4;EXTI_tmp.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_tmp.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_tmp.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_tmp);	// EXTI_Line4EXTI_tmp.EXTI_Line = EXTI_Line3;EXTI_tmp.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_tmp.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_tmp.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_tmp);	// EXTI_Line3/*------------- Step 4> 配置NVIC  ------------*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);		// 中断优先级分组NVIC_tmp.NVIC_IRQChannel = EXTI4_IRQn;NVIC_tmp.NVIC_IRQChannelPreemptionPriority = 0;NVIC_tmp.NVIC_IRQChannelSubPriority = 0;NVIC_tmp.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_tmp);	NVIC_tmp.NVIC_IRQChannel = EXTI3_IRQn;NVIC_tmp.NVIC_IRQChannelPreemptionPriority = 0;NVIC_tmp.NVIC_IRQChannelSubPriority = 0;NVIC_tmp.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_tmp);
}

4步配置GPIO的外部中断:

Step 1> 配置GPIO
Step 2> 配置AFIO
Step 3> 配置EXTI
Step 4> 配置NVIC


stm32f10x_it.c: 中断处理函数

// EXTI3 处理函数, key1;
void EXTI3_IRQHandler(void)
{EXTI_ClearITPendingBit(EXTI_Line3);LED_On();
}// EXTI4 处理函数, key0;
void EXTI4_IRQHandler(void)
{EXTI_ClearITPendingBit(EXTI_Line4);LED_Off();
}

5> 中断向量表

1

中断数量:70个

STM32F103ZET6有70个中断 = 60外设中断 + 10个系统中断;


6> 总结

GPIO, AFIO, EXTI, NVIC等功能模块,学习它们们时各个击破;
了解他们内部结构,内部寄存器,找点感觉,
重点看看每个模块的函数如何使用,
会使用后,看看内部如何编写的,非常能提高编程技能;


http://www.ppmy.cn/news/1353725.html

相关文章

完成端口的看法

很早之前使用过完成端口,当时觉得是很不错的技术。但是后来发现用的地方并不多,对它也有些自己的想法,仁者见仁智者见智。 应用场景上, 个人觉得,iocp有些鸡肋,一般的应用用不上,复杂的程序…

探讨:工业物联网,纯上报设备的数采

事情是这样的,有一台设备是modbus-tcp协议,手工操作测量,自动发送测量结果,就这,没别的了。 开始看起来挺简单,连接上去就等着收数据嘛,多简单!后来发现麻烦得很啊,关键的…

SP1:基于Plonky3构建的zkVM

1. 引言 SP1为SuccictLab开源的,基于Plonky3构建的zkVM。 开源代码见: https://github.com/succinctlabs/sp1(Rust) 当前暂未实现onchain-verifier,但会采用标准的STARK->SNARK verifier。 SP1 zkVM基于的指令…

【杂谈】裁我?我是研发,我是研发啊!

闲谈 这两年互联网是越来越不太平了,前有国外互联网裁员的妖风四起,后来寒气又传到国内,让我们这群打工人叫苦连天。最近有部电影蛮火的,叫《年会不能停》,感觉跟我前司很相似,不过好像由于今年业绩不太行…

OpenAI首个文生视频模型亮相,你觉得咋样?

2月16日凌晨,OpenAI再次扔出一枚深水炸弹,发布了首个文生视频模型Sora。据介绍,Sora可以直接输出长达60秒的视频,并且包含高度细致的背景、复杂的多角度镜头,以及富有情感的多个角色。 目前官网上已经更新了48个视频d…

云计算基础-快照与克隆

快照及克隆 什么是快照 快照是数据存储的某一时刻的状态记录,也就是把虚拟机当前的状态保存下来(快照不是备份,快照保存的是状态,备份保存的是副本) 快照优点 速度快,占用空间小 快照工作原理 在了解快照原理前,…

autojs通过正则表达式获取带有数字的text内容

视频连接 视频连接 参考 参考 var ctextMatches(/\d/).findOne()console.log("当前金币"c.text()) // 获取当前金币UiSelector.textMatches(reg) reg {string} | {Regex} 要满足的正则表达式。 为当前选择器附加控件"text需要满足正则表达式reg"的条件。 …

python系统学习Day2

section3 python Foudamentals part one:data types and variables 数据类型:整数、浮点数、字符串、布尔值、空值 #整型,没有大小限制 >>>9 / 3 #3.0 >>>10 // 3 #3 地板除 >>>10 % 3 #1 取余#浮点型&#xff…