EXTI中断和NVIC的应用总结

中断可简单理解为打断原程序,去执行另一项指令,然后再返回继续执行原程序,中断可以再加一个中断
本章主要针对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的头文件中,其中已经含有内核,外设的可以继续往下写

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值