异常类型
系统异常和外部中断可以在标准库文件stm32f10x.h这个头文件中可以查询到,在IRQn_Type这个结构体里面包含了F103系列全部的异常声明。
F103系统异常清单
编号 | 优先级 | 优先级类型 | 名称 | 说明 | 地址 |
---|
| — | — | — | 保留(MSP起始地址) | 0X0000 0000 | | -3 | 固定 | Reset | 复位 | 0X0000 0004 | | -2 | 固定 | NMI | 不可屏蔽中断。RCC时钟安全系统(CSS)连接到NMI向量 | 0X0000 0008 | | -1 | 固定 | HardFault | 所有类型的错误 | 0X0000 000C | | 0 | 可编程 | MemManage | 存储器管理 | 0X0000 0010 | | 1 | 可编程 | BusFault | 预取值失败,存储器访问失败 | 0X0000 0014 | | 2 | 可编程 | UsageFault | 未定义的指令或非法状态 | 0X0000 0018 | | — | — | — | 保留 | 0X0000 001C~0X0000 002B | | 3 | 可编程 | SVCall | 通过SWI指令调用的系统服务 | 0X0000 002C | | 4 | 可编程 | DebugMonitor | 调试监控器 | 0X0000 0030 | | — | — | — | 保留 | 0X0000 0034 | | 5 | 可编程 | PendSV | 可挂起的系统服务 | 0X0000 0038 | | 6 | 可编程 | SysTick | 系统嘀嗒定时器 | 0X0000 003C |
F103外部中断清单
编号 | 优先级 | 优先级类型 | 名称 | 说明 | 地址 |
---|
0 | 7 | 可编程 | WWDG | 窗口看门狗中断 | 0X0000 0040 | 1 | 8 | 可编程 | PVD | 连到EXT1的电源电压检测中断 | 0X0000 0044 | 2 | 9 | 可编程 | TAMPER | 侵入检测中断 | 0X0000 0048 | … | … | … | … | … | … | 57 | 64 | 可编程 | DMA2通道2 | DMA2通道2中断 | 0X0000 0124 | 58 | 65 | 可编程 | DMA2通道3 | DMA2通道3中断 | 0X0000 0128 | 59 | 66 | 可编程 | DMA2通道4_5 | DMA2通道4和DMA2通道5中断 | 0X0000 012C |
NVIC寄存器
NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能。
NVIC结构体定义
typedef struct {
__IO uint32_t ISER[8];
uint32_t RESERVED0[24];
__IO uint32_t ICER[8];
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8];
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8];
uint32_t RESERVED3[24];
__IO uint32_t IABR[8];
uint32_t RESERVED4[56];
__IO uint8_t IP[240];
uint32_t RESERVED5[644];
__O uint32_t STIR;
}NVIC_Type;
我们经常使用的有ISER,ICER和IP这个寄存器,ISER用来使能中断,ICER用来清除中断,IP用来设置中断优先级。
NVIC中断配置固件库
NVIC库函数 | 描述 |
---|
void NVIC_EnableIRQ(IRQn_Type IRQn) | 使能中断 | void NVIC_DisableIRQ(IRQn_Type IRQn) | 清除中断 | void NVIC_SetPendingIRQ(IRQn_Type IRQn) | 设置中断挂起位 | void NVIC_ClearPendingIRQ(IRQn_Type IRQn) | 清除中断挂起位 | uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) | 获取挂起中断编号 | void NVIC_SetPriority(IRQn_Type IRQn,uint32_t priority) | 设置中断优先级 | uint32 NVIC_GetPriority(IRQn_Type IRQn) | 获取中断优先级 | void NVIC_SystemReset(void) | 系统复位 |
中断优先级
中断优先级寄存器NVIC_IPRx,用来配置外部中断的优先级,用于表达优先级的有四位,又被分为抢占优先级和子优先级两组。如果两个中断同时响应,抢占优先级高的就会先于抢占优先级低的,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级相同,就比较它们的硬件编号。
中断编程
①使能某个中断。
②初始化NVIC_InitTypeDef结构体
配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求。NVIC_InitTypeDef结构体在固件库头文件misc.h中定义。
- NVIC_IROChannel:用来设置中断源,不同的中断有不同的中断源。具体成员配置可参考stm32f10x.h头文件里面的IRQn_Type结构体定义。
- NVIC_IRQChannelPreemptionPriority:抢占优先级,具体的值要根据优先级分组确定。
- NVIC_IRQChannelSubPriority:子优先级,具体的值要根据优先级分组确定。
- NVIC_IRQChannelCmd:中断使能(ENABLE)或者失能(DISABLE)。操作的是NVIC_ISER和NVIC_ICER这两个寄存器。
③编写中断服务函数。
在启动文件startup_stm32f10x_hd.s中。中断服务函数名必须与启动文件里面预先设置的一样。
|