zoukankan      html  css  js  c++  java
  • (stm32f103学习总结)—stm32中断系统

    一、NVIC 介绍

      NVIC 英文全称是 Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器它属于 M3 内核的一个外设控制着芯片的中断相关功能。由于 ARM 给 NVIC 预留了非常多的功能,但对于使用 M3 内核设计芯片的公司可能就不需要这么多功能,于是就需要在 NVIC 上裁剪。ST 公司的 STM32F103 芯片内部中断数量就是 NVIC 裁剪后的结果。上面说到 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)使能外设某个中断,这个具体是由外设相关中断使能位来控制,比如定时器有溢出中断,这个可由定时器的控制寄存器中相应中断使能位来控制。
    (2)设置中断优先级分组,初始化 NVIC_InitTypeDef 结构体,设置抢占优先级和响应优先级,使能中断请求。
    (3)编写中断服务函数
      配置好中断后如果有触发,即会进入中断服务函数,那么中断服务函数也有固定的函数名,可以在 startup_stm32f10x_hd.s 启动文件查看,启动文件提供的只是一个中断服务函数名,具体实现什么功能还需要我们自己编写,可以将中断服务函数放在 stm32f10x_it.c 文件内,也可以放在自己的应用程序中。通常我们把中断函数放在应用程序中。这里提醒一下大家,不要任意修改中断服务函数名,因为启动文件内中断服务函数名已经固定,如果要修改,你还必须在启动文件内把原中断函数修改。
      这里对第二步进行解释:  
    NVIC_InitTypeDef 结构体如下:
     1 typedef struct
     2 {
     3   uint8_t NVIC_IRQChannel;    
     4   uint8_t NVIC_IRQChannelPreemptionPriority;  
     5   uint8_t NVIC_IRQChannelSubPriority;      
     6   FunctionalState NVIC_IRQChannelCmd;          
     7 } NVIC_InitTypeDef;
      
      下面我们对 NVIC_InitTypeDef 结构体成员进行一下简单介绍。
    1.NVIC_IRQChannel:中断源的设置,不同的外设中断,中断源不一样,自然名字也不一样,所以名字不能写错,否则不会进入中断。中断源放在stm32f10x.h 文件的 IRQn_Type 结构体内,由于内容太多,这里就不复制所有中断源,只截取一部分,如下:
     1 typedef enum IRQn
     2 {
     3 //Cortex-M3 处理器异常编号
     4 NonMaskableInt_IRQn = -14,
     5 MemoryManagement_IRQn = -12,
     6 BusFault_IRQn = -11,
     7 UsageFault_IRQn = -10,
     8 SVCall_IRQn = -5,
     9 DebugMonitor_IRQn = -4,
    10 PendSV_IRQn = -2
    11 。。。。。
    12 }IRQn_Type;
    2.NVIC_IRQChannelPreemptionPriority:抢占优先级,具体的值要根据优先级分组来确定,可以参考前面中断优先级分组内容。
    3.NVIC_IRQChannelSubPriority:响应优先级,具体的值要根据优先级分组来确定,可以参考前面中断优先级分组内容。
    4.NVIC_IRQChannelCmd:中断使能/失能设置,使能配置为 ENABLE,失能配置为 DISABLE。
     
  • 相关阅读:
    调试常用命令
    android获取手机机型、厂商、deviceID基本信息
    融云即时通讯 添加地理位置信息的功能
    Linux centOS下搭建RTMP服务器的具体步骤
    数组与字符串 1.4
    数组与字符串 1.5
    数组与字符串 1.3
    数组与字符串 1.2
    数组与字符串 1.1
    笔记本自开wifi设置
  • 原文地址:https://www.cnblogs.com/zhj868/p/12626379.html
Copyright © 2011-2022 走看看