中断——外部中断EXIT

终端可以分成外部中断和内部中断吗


前言

野火中断章节有这样一句话

【F103在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。 其中系统异常有8个(如果把Reset和HardFault也算上的话就是10个), 外部中断有60个。】

所以可以理解为STM32外部中断是包含在异常响应系统中的。这个异常响应系统是包含10个系统异常。还有60个外部中断。


一、中断知识

按照教程,所有的系统异常和外部中断都定义在stm32f10x.h文件中,定义在IRQn_Type结构体中。

可以查阅文档《1-STM32F10x-中文参考手册》

二、中断编程

中断编程主要有3个编程要点:

1、使能外设某个中断,这个具体由每个外设的相关中断使能位控制。比如串口有发送完成中断,接收完成中断,这两个中断都由串口控制寄存器的相关中断使能位控制。

2、初始化NVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和子优先级, 使能中断请求。NVIC_InitTypeDef结构体在固件库头文件misc.h中定义。

3、编写中断服务函数

在启动文件startup_stm32f10x_hd.s中我们预先为每个中断都写了一个中断服务函数,只是这些中断函数都是为空,为的只是初始化中断向量表。

三、EXIT外部中断/事件控制器

3.1 中断事件线

标准库函数对每个外设都建立了一个初始化结构体,外部中断是EXTI_InitTypeDef。EXTI_InitTypeDef宏定义在stm32f10x_exit.h文件中。

教程中说EXTI有20个中断/事件线,但是在IRQn_Type中一开始只看到了EXTI0到EXTI5,然后研究了下看到了其他的中断/事件线。如图

然后其中每一个中断/事件线,都可以选择输入源。比如EXTI0可以选择PA0、PB0......PI0其中一个输入源。这个怎么配置呢。用AFIO的外部中断配置寄存器1,AFIO_EXTICR1的EXTI0[3:0]位配置。

3.2 EXTI初始化结构体详解

标准库函数对每个外设都建立了一个初始化结构体,比如EXTI_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数, 比如EXTI_Init()调用,这些设定参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。

EXTI_InitTypeDef宏定义在stm32f10x_exit.h文件中。

四、软件设计

4.1 编程要点

1、初始化用来产生中断的GPIO端口

2、初始化EXTI

3、初始化NVIC

4、编写中断服务函数

4.2 编写代码

目的,之前是在裸机程序while循环中读取GPIO引脚电平来对Led更改亮灭效果。

现在代码是通过将按键设置成EXTI输入源,通过中断来控制led亮灭效果。

设计电路图如下图

实现,真不容易啊!

回顾代码实现

4.2.1 GPIO初始化

GPIO初始化
GPIO_InitTypeDef结构体GPIO_initTypeDef
RCC_APB2PeriphClockCmd成员1:RCC_APB2Periph_GPIOA

使能外设时钟总线

这个设计涉及到PA1和PB0,所以要使能RCC_APB2Periph_GPIOA、RCC_APB2Periph_GPIOB

另外还要使能RCC_APB2Periph_AFIO,这个具体要看stm32手册文档第八章AFIO

GPIO_initTypeDef初始化GPIO_initTypeDef.GPIO_Pin
GPIO_initTypeDef.Mode

led灯:GPIO_Mode_Out_PP

按键:GPIO_Mode_IN_FLOATING

GPIO_initTypeDef.SpeedGPIO_Speed_50MHz,原因是什么?
GPIO_InitType

4.2.2 NVIC初始化

NVIC初始化
NVIC_InitTypeDef结构体NVIC_initTypeDef
NVIC_PriorityGroupConfig

成员:NVIC_PriorityGroup_x

分成五组x:0-4

NVIC_initTypeDef

NVIC_initTypeDef.

NVIC_IRQChannel

成员EXTI1_IRQn;

中断源EXTI1,因为这次代码终端输入源GPIO是PA1

中断函数对应EXTI1_Handler

NVIC_initTypeDef.

NVIC_IRQChannelPreemptionPriority

NVIC_initTypeDef.

NVIC_IRQChannelSubPriority

NVIC_initTypeDef.

NVIC_IRQChannelCmd

使能
NVIC_InitType

 这边就是有一个优先级分组没记清了。NVIC_PriorityGroup_0到底是抢占优先级是0,子优先级是16。还是抢占优先级是16,子优先级是0个优先级呢?

4.3.3 EXTI初始化

EXTI初始化
EXTI_InitTypeDefEXTI_initTypeDef
GOIO_EXTILineConfig

成员1:GPIO_PortSourceGPIOx

成员2:GPIO_PinSourcex

这边感觉很陌生啊,形参也很陌生

比如key的引脚是PA1

portSource即为GPIO_PortSourceGPIOA

pinSource即为

GPIO_PinSource1

EXTI_initTypeDefEXTI_initTypeDef.EXTI_Line

EXTI_Line1

共二十个输入源,EXTI0-EXTI19

EXTI0对应PA0...PI0等引脚,所以PA1就是EXTI1

EXTI_initTypeDef.EXTI_Mode

没想起来,看一下

事件/中断

EXTI_Mode_Interrupt

EXTI_initTypeDef.EXTI_Trigger分为上升沿和下降沿和上升沿和下降沿皆触发
EXTI_initTypeDef.EXTI_LineCmdENABLE
EXTI_InitType

4.3.4 中断服务函数

EXTI1_Handle(),这个函数是预定义好的

函数中需要用到两个成员

void EXTI1_Handle()
{
	if(EXTI_GetITStauts(EXTI_Line1) != RESET)
	{
	    //动作,比如控制灯开关

		EXTI_ClearITPendingBit(EXTI_Line1);
	}
}

以上就是EXTI外部中断的所有配置方法了。并且得到验证。虽然过程很曲折,甚至很离奇,但是确实是成功了。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值