目录
一、固件库模板
二、准备资料
- 固件库模板
- MDK5开发环境
- UART串口协议
- 利用固件库模板点灯工程(下面第三行,手动狗头)
实验程序已经发布到百度网盘,本文末有链接可以自取
中断查看这篇博客STM32中断应用概括
三、 EXTI简介
EXTI-外部 中断/事件控制器,管理控制器20个中断/事件线。每一个中断/事件线都有对应的边沿触发器,用来判断信号的检测是上升沿还是下降沿。EXTI可以实现对每一个中断/事件进行单独的配置,可以配置为中断或者事件,以及触发事件的属性。
1. EXTI框图讲解
图中的斜线和20,表示控制器内部的信号线路有20个,这个与EXTI总共有20个,刚好EXTI有20个中断/事件线吻合的。
EXTI可以分为两部分,一部分是产生中断,另一部分是产生事件,
红色线路
是产生中断的线路,最终信号流入到NVIC控制器内,
编号1 是输入线,EXTI有19个中断/事件输入线,可以通过寄存器设置为任何一个GPIO,也可以是外设的事件,一般存在电平变化的信号。
编号2 是一个边缘检测电路,可以根据上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发的选择寄存器(EXTI_FTSR)对应的位置来控制信号触发。边沿检测电路以输入端为信号输入端,如果检测到边沿跳变就有输出有效信号给编号3电路,否则就输出无效信号0。而EXTI_RTSR和EXTI_FTSR可以控制器需要检测哪些类型的电平跳变过程,可以是只有上升沿触发或者下降沿触发,或者上升沿和下降沿都触发。
编号3 电路是一个或门电路,一个输入来自编号2电路,另外一个输入来自软件中断事件寄存器(EXTI_SWIER),EXTI_SWIER允许我们通过程序控制就可以开启中断/事件线,或门是有1为1,所以两个输入随便一个输入是有效信号1就可以输出1给编号4和编号6电路。
编号4 电路是一个与门电路,一个输入是编号3电路,另外一个输入来自中断屏蔽寄存器(EXTI_IMR),与门要求两个输入都是1才输出1,导致的结果就是如果EXTI_IMR设置为0时,那不管任意一个是1还是0,编号4输出的信号都是0;如果EXTI_IMR设置为1时,最终编号4输出的信号由编号3的电路输出信号决定,这样我们可以通过控制EXTI_IMR来实现是否产生中断的目的。编号4电路输出的信号会被保存到挂起寄存器(EXTI_PR)内,如果确定编号4电路输出是1,就会把EXTI_PR对应位置1.
编号 5 是将 EXTI_PR 寄存器内容输出到 NVIC 内,从而实现系统中断事件控制。
接下来我们来看看绿色虚线
指示的电路流程。它是一个产生事件的线路,最终输出一个脉冲信号。产生事件线路是在编号 3 电路之后与中断线路有所不同,之前电路都是共用的。
编号 6 电路是一个与门,它一个输入来自编号 3 电路,另外一个输入来自事件屏蔽寄存器 (EXTI_EMR) 。如果EXTI_EMR 设置为 0 时,那不管编号 3 电路的输出信号是 1 还是 0,最终编号 6 电路输出的信号都为 0;如果 EXTI_EMR 设置为 1 时,最终编号 6 电路输出的信号才由编号 3 电路的输出信号决定,这样我们可以简单的控制 EXTI_EMR 来实现是否产生事件的目的。
编号 7 是一个脉冲发生器电路,当它的输入端,即编号 6 电路的输出端,是一个有效信号 1 时就
会产生一个脉冲;如果输入端是无效信号就不会输出脉冲。
编号 8 是一个脉冲信号,就是产生事件的线路最终的产物,这个脉冲信号可以给其他外设电路使用,比如定时器 TIM、模拟数字转换器 ADC 等等,这样的脉冲信号一般用来触发 TIM 或者 ADC开始转换。产生中断线路目的是把输入信号输入到 NVIC,进一步会运行中断服务函数,实现功能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。
2. 中断事件线
EXTI0 至 EXTI15 用于 GPIO,通过编程控制可以实现任意一个 GPIO 作为 EXTI 的输入源。由表EXTI 中断 _ 事件线 可知, EXTI0 可以通过 AFIO 的外部中断配置寄存器1(AFIO_EXTICR1) 的EXTI0[3:0] 位选择配置为 PA0、 PB0、 PC0、 PD0、 PE0、 PF0、 PG0、 PH0 或者 PI0,见图 EXTI0 输入源选择 。其他 EXTI 线 (EXTI 中断/事件线) 使用配置都是类似的。
3. EXTI初始化结构体
标准库函数对每个外设都建立了一个初始化结构体,比如 EXTI_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如 EXTI_Init() 调用,这些设定参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。
初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个成员意义基本上就可以对该外设运用自如了。初始化结构体定义在 stm32f4xx_exti.h 文件中,初始化库函数定义在 stm32f4xx_exti.c 文件中,编程时我们可以结合这两个文件内注释使用。
typedef struct {
uint32_t EXTI_Line; // 中断/事件线
EXTIMode_TypeDef EXTI_Mode