发新帖我要提问
12
返回列表
打印
[应用相关]

STM32的外部中断

[复制链接]
楼主: 键盘手没手
手机看帖
扫描二维码
随时随地手机跟帖
21
键盘手没手|  楼主 | 2022-3-29 16:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览

使用特权

评论回复
22
键盘手没手|  楼主 | 2022-3-29 16:47 | 只看该作者

使用特权

评论回复
23
键盘手没手|  楼主 | 2022-3-29 16:48 | 只看该作者
所以,在这里我们只需设置SCB的AIRCR的 bit10-8即可;查看SCB的结构体,得知:

使用特权

评论回复
24
键盘手没手|  楼主 | 2022-3-29 16:49 | 只看该作者

使用特权

评论回复
25
键盘手没手|  楼主 | 2022-3-29 16:50 | 只看该作者
typedef struct
{
  __I  uint32_t CPUID;                   /*!< Offset: 0x000 (R/ )  CPUID Base Register                                   */
  __IO uint32_t ICSR;                    /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register                  */
  __IO uint32_t VTOR;                    /*!< Offset: 0x008 (R/W)  Vector Table Offset Register                          */
  __IO uint32_t AIRCR;                   /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register      */
  __IO uint32_t SCR;                     /*!< Offset: 0x010 (R/W)  System Control Register                               */
  __IO uint32_t CCR;                     /*!< Offset: 0x014 (R/W)  Configuration Control Register                        */
  __IO uint8_t  SHP[12];                 /*!< Offset: 0x018 (R/W)  System Handlers Priority Registers (4-7, 8-11, 12-15) */
  __IO uint32_t SHCSR;                   /*!< Offset: 0x024 (R/W)  System Handler Control and State Register             */
  __IO uint32_t CFSR;                    /*!< Offset: 0x028 (R/W)  Configurable Fault Status Register                    */
  __IO uint32_t HFSR;                    /*!< Offset: 0x02C (R/W)  HardFault Status Register                             */
  __IO uint32_t DFSR;                    /*!< Offset: 0x030 (R/W)  Debug Fault Status Register                           */
  __IO uint32_t MMFAR;                   /*!< Offset: 0x034 (R/W)  MemManage Fault Address Register                      */
  __IO uint32_t BFAR;                    /*!< Offset: 0x038 (R/W)  BusFault Address Register                             */
  __IO uint32_t AFSR;                    /*!< Offset: 0x03C (R/W)  Auxiliary Fault Status Register                       */
  __I  uint32_t PFR[2];                  /*!< Offset: 0x040 (R/ )  Processor Feature Register                            */
  __I  uint32_t DFR;                     /*!< Offset: 0x048 (R/ )  Debug Feature Register                                */
  __I  uint32_t ADR;                     /*!< Offset: 0x04C (R/ )  Auxiliary Feature Register                            */
  __I  uint32_t MMFR[4];                 /*!< Offset: 0x050 (R/ )  Memory Model Feature Register                         */
  __I  uint32_t ISAR[5];                 /*!< Offset: 0x060 (R/ )  Instruction Set Attributes Register                   */
       uint32_t RESERVED0[5];
  __IO uint32_t CPACR;                   /*!< Offset: 0x088 (R/W)  Coprocessor Access Control Register                   */
} SCB_Type;

使用特权

评论回复
26
键盘手没手|  楼主 | 2022-3-29 16:50 | 只看该作者
所以,在这里,我们把这条语句写成了SCB->AIRCR |= 0x5 << 8;
亦即设置成了101,也就是抢占优先级占2位,响应优先级占2位;

注:抢占优先级和响应优先级一样,其值越低则表示其优先级越高;

上述说的子优先级也就是我们说的响应优先级;

使用特权

评论回复
27
键盘手没手|  楼主 | 2022-3-29 16:52 | 只看该作者
6. NVIC->IP[9] |= 0;

有上条语句,我们可以得知:IP寄存器由240个8bit的寄存器组成,每个可屏蔽中断占用8bit,这样总共可以表示240个可屏蔽中断,

而STM32F4只用到了其中的82个。IP[81]~IP[0]分别对应中断81~0.而每个可屏蔽中断占用的8bit并没有全部使用,而是只用了高4位;

这4位,又分为抢占优先级和响应优先级;抢占优先级在前,响应优先级在后;也就是说,抢占优先级在高位,响应优先级在低位;

使用特权

评论回复
28
键盘手没手|  楼主 | 2022-3-29 16:54 | 只看该作者
我们又知道:我们这个中断是外部中断3,所以查看中断向量表可知:

使用特权

评论回复
29
键盘手没手|  楼主 | 2022-3-29 16:54 | 只看该作者

使用特权

评论回复
30
键盘手没手|  楼主 | 2022-3-29 16:56 | 只看该作者

使用特权

评论回复
31
键盘手没手|  楼主 | 2022-3-29 16:57 | 只看该作者

使用特权

评论回复
32
键盘手没手|  楼主 | 2022-3-29 16:57 | 只看该作者

使用特权

评论回复
33
键盘手没手|  楼主 | 2022-3-29 16:58 | 只看该作者

使用特权

评论回复
34
键盘手没手|  楼主 | 2022-3-29 17:01 | 只看该作者
由此可知,EXTI3在中断的位置为9,所以我们只需要设置NVIC->IP[9] 即可;

在这里我们把NVIC->IP[9] |= 0;则表示,我们设置外部中断3的抢占优先级为0,响应优先级也为0,其各占2位;

使用特权

评论回复
35
键盘手没手|  楼主 | 2022-3-29 17:02 | 只看该作者
7. NVIC->ISER[0] |= 1 << 9;

这一步的作用就是使能中断;

ISER是一个中断使能寄存器组;这里用8个32位寄存器来控制,每个位控制一个中断;但是STM32F4的可屏蔽中断

最多只有82个,所以对我们来说,有用的就是三个(ISER[0~2]),总共可以表示96个中断;而STM32F4只用了其中的

前82个中断,ISER[0]的0bit~31分别对应中断0~31;ISER[1]的bit0~32对应中断32~63;ISER[2]的bit0~32对应中断64~81;

使用特权

评论回复
36
键盘手没手|  楼主 | 2022-3-29 17:02 | 只看该作者
在这里,我们知道:我们的EXTI3对应的中断的位置是9,所以我们只需设置ISER[0]的第9位即可;所以我们在这里就将这条

语句写成了:NVIC->ISER[0] |= 1 << 9;

使用特权

评论回复
37
键盘手没手|  楼主 | 2022-3-29 17:06 | 只看该作者
8.至于外部中断函数的名称如何编写,我们可以从启动文件中去找到;

当我们设置的外部中断函数与启动文件中定义的名称一致时,

那么当这个中断条件满足时,就会去中断函数里边执行其函数体;

我们只需要在中断发生后,记得清中断,防止中断重复发生;

使用特权

评论回复
38
键盘手没手|  楼主 | 2022-3-29 17:07 | 只看该作者
注意事项:

在本实验中,关于按键处理那一块,处理不是很到位,

主要应该是处在连按这一块,暂时没去整它,待我需要时,再去整整

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则