STM32中断、DMA通信原理和编程方法实例
文章目录
STM32中断、DMA通信原理和编程方法实例
1 中断的简介
1.1 概念
中断其实就是当 CPU 执行程序时,由于发生了某种随机的事件(外部或内部),引起 CPU 暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程就称为中断,引发中断地称为中断源。
比如:看电视时突然门铃响,那么门铃响就相当于中断源。有些中断还能够被其他高优先级的中断所中断,那么这种情况又叫做中断的嵌套。
中断的意义:可以节省CPU的内存。
中断满足条件:快进快出
1.1.1 中断优先级
- 多个中断同时提出中断申请时:先比较抢占优先级,抢占优先级高的中断先执行。如果抢占优先级相同,则比较子优先级。
- 二者都相同时,比较中断编号(中断编号位于芯片头文件中)。编号越小,优先级越高。
1.1.2 外部中断EXIT
外部中断程序设计思路:
中断初始化,主要是完善三个结构体:
①GPIO_InitTypeDef (功能:IO配置)
②EXTI_InitTypeDef (功能:中断配置)
③NVIC_InitTypeDef (功能:中断优先级配置)
1.2 中断的控制
NVIC 英文全称是 Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,它属于 M3 内核的一个外设,控制着芯片的中断相关功能。
ST 公司的 STM32F103 芯片内部中断数量就是 NVIC 裁剪后的结果。
在固件库 core_cm3.h 文件内定义了一个 NVIC 结构体,里面定义了相关寄存器,
1 typedef struct
2 {
3 __IO uint32_t ISER[8]; /*!< Offset: 0x000 Interrupt Set Enable Register */
4 uint32_t RESERVED0[24];
5 __IO uint32_t ICER[8]; /*!< Offset: 0x080 Interrupt Clear Enable Register */
6 uint32_t RSERVED1[24];
7 __IO uint32_t ISPR[8]; /*!< Offset: 0x100 Interrupt Set Pending Register */
8 uint32_t RESERVED2[24];
9 __IO uint32_t ICPR[8]; /*!< Offset: 0x180 Interrupt Clear Pending Register */
10 uint32_t RESERVED3[24];
11 __IO uint32_t IABR[8]; /*!< Offset: 0x200 Interrupt Active bit Register */
12 uint32_t RESERVED4[56];
13 __IO uint8_t IP[240]; /*!< Offset: 0x300 Interrupt Priority Register (8Bit wide) */
14 uint32_t RESERVED5[644];
15 __O uint32_t STIR; /*!< Offset: 0xE00 Software Trigger Interrupt Register */
16 } NVIC_Type;
在配置中断时,我们通常使用的只有 ISER、 ICER 和 IP 这三个寄存器,ISER 是中断使能寄存器,ICER 是中断清除寄存器,IP 是中断优先级寄存器。
1.3 中断的配置
(1)使能外设某个中断
(2)设置中断优先级分组
(3)编写中断服务函数
2 DMA通信原理和编程方法
2.1 串口中断
- 串口中断就是串口的数据寄存器不为空时进入他的中断。
- 串口通信分类