中断可简单理解为打断原程序,去执行另一项指令,然后再返回继续执行原程序,中断可以再加一个中断
本章主要针对EXTI中断,其他中断该不涉及
异常类型
系统异常 体现在内核水平
外部中断 体现在外设水平
中断向量表
EXTI中断源
NVIC
嵌套向量中断控制器,属于内核外设管理着包括内核和片上外设的中断相关功能
两个重要的库文件:core_cm3.h和misc.h
找内核相关的文件时,找上述两个文件
主要详解内容位于 STM32F10xxx Cortex-M3编程手册-英文版.pdf文件当中的4.Core peripherals/4.3NVIC
在core_cm3.h中132行有NVIC_Type的寄存器定义
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;
NVIC的固件库函数位于misc.c当中h196
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);
中断优先级寄存器 IP
优先级 设定NVIC-IPRx
优先级分组:SCR->AIRCR:PRIGROUP[10:8]
以组一为例,主优先级为0,无分配位数,因此四位均可用于子优先级所以是从0~15.
如果优先级相同的情况下,根据其在中断向量表中的硬件编号,编号越小,执行越早
中断的编程顺序
1-使能中断请求
有两个使能,首先是
__IO uint32_t ISER[8];
/中断使能寄存器/
另一个则取决于外设的使能寄存器使能
2-配置中断优先级分组
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
3-配置NVIC寄存器
初始化NVIC_InitTypeDef
typedef struct
{
uint8_t NVIC_IRQChannel; /*中断源,IRQ全部的列表位于stm32f10x.h找到中断enum IRQn先是内核的中断,再是外设中断,根据型号找到HD*/
uint8_t NVIC_IRQChannelPreemptionPriority; /*子优先级*/
uint8_t NVIC_IRQChannelSubPriority; /*抢占优先级*/
FunctionalState NVIC_IRQChannelCmd; /*使能或者失能*/
} NVIC_InitTypeDef;
利用固定件库调用初始化函数
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
4-编写中断服务函数
在startup_stm32f10x_hd.s中已经初始化和规定好了中断向量表的地址和名称,通过弱定义的形式,因此名称要相对应
为了在编程上方便管理中断,将所有的中断服务函数放在stm32f10x_it.h的头文件中,其中已经含有内核,外设的可以继续往下写