对于STM32的中断首先需要用到的文件是startup_stm32f10x_hd.s和stm32f10x_it.c这两个文件,其中startup_stm32f10x_hd.s是启动文件,stm32f10x_it.c是中断响应函数。对于外部中断,它的过程是外部的IO口监测到电平的变化,触发外部中断,所以它又涉及到3个库文件,stm32f10x_gpio.c、stm32f10x_exti.c和misc.c,misc.c包含中断库,stm32f10x_exti.c是外部的IO口中断,stm32f10x_gpio.c是IO口的配置。还有一个我们上一篇中说的所有的外设都要用到的库文件时钟stm32f10x_rcc.c。
一、启动文件
说外部中断之前,先了解下启动文件,也就是startup_stm32f10x_hd.s,它是用汇编语言写的,主要的作用是在上电启动的时候,建立C语言的运行环境。它主要的功能如下:
初始化堆栈指针SP
初始化程序计数器指针PC
设置堆、栈的大小
设置中断向量的入口地址
配置外部SRAM作为数据存储器
调用SystemInit()函数配置STM32的系统时钟
设置C库的分支入口”_main”(最终用来调用main函数)
这些就是我们要的中断函数的入口地址,当发生中断时,是哪种中断就进入相应地址。
二、中断
中断是指当出现需要时,CPU暂时停止当前程序的执行而执行处理新情况,大体的框图如下:
在STM32中还有一个中断优先级的问题,当出现多个中断时,他们执行的顺序是什么,如下图所示:3的优先级高于2的优先级高于1的优先级。
三、外部中断的程序流程
四、具体的做法
STM32口的外部中断映射如下,首先看那个叫要设置为外部中断,则看是EXTI几。
第一步:当然是设置系统时钟,调用的函数之前说过了,不说了。
第二步:设置一个口PA0为外部中端口,首先就是设置PA0为普通的输入口,在GPIO库文件中找,这里也不说了。
其次是设置IO口为外部中断。
接下来是设置外部中断,在.exti文件中进行设置。
根据这些函数配置外部中断
这个时候外部中断已经配置好了,但是还得配置中断和设置中断优先级,在misc.c文件中
根据库函数表就可以对应的找到设置。
这样中断就设置完成了。
接下来写中断服务函数。
但是还是不够,这时还需要把中断服务函数和我们启动文件中的中断响应函数连接起来,最后当发生中断时直接进入中断服务函数,这时再在启动文件中找到这个中断发生的函数入口
在stm32f10x_it.h中添加
在stm32f10x_it.c的文件中添加如下:
这样对于外部中断的驱动就完成了。