发新帖我要提问
12
返回列表
打印
[STM32F4]

STM32F4xx 中断机制

[复制链接]
楼主: 梅花香自123
手机看帖
扫描二维码
随时随地手机跟帖
21
梅花香自123|  楼主 | 2023-10-18 15:51 | 只看该作者 回帖奖励 |倒序浏览
例子:


EXTI_InitTypeDef e;
e.EXTI_Line = EXTI_Line0|EXTI_Line2|EXTI_Line3|EXTI_Line4; //要出事后的外部中断编号
e.EXTI_LineCmd = ENABLE;
e.EXTI_Mode = EXTI_Mode_Interrupt; //指定外部中短线的模式 中断模式
e.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //双边沿
EXTI_Init(&e);

使用特权

评论回复
22
梅花香自123|  楼主 | 2023-10-18 15:52 | 只看该作者
IT: InTerrupt中断

EXTI_GetITStatus用来获取EXTI_Line指定的外部中断的中断状态

SET:产生了中断 1

RESET:没产生中断 0

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

EXTI_ClearITPendingBit用来清掉相应的外部中断的Pending标记

在用户中断处理函数末尾(中断处理后)要把相应的中断pending标识给清掉,否则会一直产生中断。

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

使用特权

评论回复
23
梅花香自123|  楼主 | 2023-10-18 15:52 | 只看该作者
另外:

FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);

void EXTI_ClearFlag(uint32_t EXTI_Line);

使用特权

评论回复
24
梅花香自123|  楼主 | 2023-10-18 15:52 | 只看该作者
NVIC的控制
NVIC_PriorityGroupConfig:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
/** @defgroup MISC_Preemption_Priority_Group 
  * @{
  */
#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                            4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                            3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                            2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                            1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                            0 bits for subpriority */

使用特权

评论回复
25
梅花香自123|  楼主 | 2023-10-18 15:56 | 只看该作者
NVIC_Init 初始化一个指定的中断:void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

使用特权

评论回复
26
梅花香自123|  楼主 | 2023-10-18 15:56 | 只看该作者
NVIC_InitStruct: 指向初始化的结构体
typedef struct
{
  uint8_t NVIC_IRQChannel;                    /*!< Specifies the IRQ channel to be enabled or disabled.
                                                   This parameter can be an enumerator of @ref IRQn_Type
                                                   enumeration (For the complete STM32 Devices IRQ Channels
                                                   list, please refer to stm32f4xx.h file) */

  uint8_t NVIC_IRQChannelPreemptionPriority;  /*!< Specifies the pre-emption priority for the IRQ channel
                                                   specified in NVIC_IRQChannel. This parameter can be a value
                                                   between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table
                                                   A lower priority value indicates a higher priority */

  uint8_t NVIC_IRQChannelSubPriority;         /*!< Specifies the subpriority level for the IRQ channel specified
                                                   in NVIC_IRQChannel. This parameter can be a value
                                                   between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table
                                                   A lower priority value indicates a higher priority */

  FunctionalState NVIC_IRQChannelCmd;         /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel
                                                   will be enabled or disabled.
                                                   This parameter can be set either to ENABLE or DISABLE */   
} NVIC_InitTypeDef;

使用特权

评论回复
27
梅花香自123|  楼主 | 2023-10-18 15:57 | 只看该作者
例子:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
NVIC_InitTypeDef n;
n.NVIC_IRQChannel = EXTI0_IRQn;    // PPP_IRQn
n.NVIC_IRQChannelCmd = ENABLE;
n.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级
n.NVIC_IRQChannelSubPriority = 2;   //中断子优先级
NVIC_Init(&n);

使用特权

评论回复
28
梅花香自123|  楼主 | 2023-10-18 15:57 | 只看该作者
作业(按键点灯)
1. key.h
#ifndef _KEY_H_
#define _KEY_H_

#include "stm32f4xx.h"
#include "rj_led.h"

void key_init(void);

#endif

使用特权

评论回复
29
梅花香自123|  楼主 | 2023-10-18 15:58 | 只看该作者
key.c

#include "key.h"
void key_init()
{
//0.clk_enable
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_EXTIT, ENABLE);
//1.GPIO PA0 PE2 PE3 PE4
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode  =GPIO_Mode_IN;      //输入模式
GPIO_InitStruct.GPIO_Pin  =GPIO_Pin_0;
GPIO_InitStruct.GPIO_PuPd  =GPIO_PuPd_NOPULL;     //无上拉 无下拉
GPIO_InitStruct.GPIO_Speed  =GPIO_Speed_50MHz;     //输出速率为50MHz
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin  =GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_Init(GPIOE,&GPIO_InitStruct);

//2.PA0-EXTI Line0 PE2-EXTI2 PE3-EXTI3 PE4-EXTI4
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);  //用来指定中断/事件线的输入源
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);

//3.EXTI CFG
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line   =EXTI_Line0|EXTI_Line2|EXTI_Line3|EXTI_Line4;
EXTI_InitStruct.EXTI_LineCmd =ENABLE;
EXTI_InitStruct.EXTI_Mode  =EXTI_Mode_Interrupt;  //中断模式
EXTI_InitStruct.EXTI_Trigger =EXTI_Trigger_Falling;  //下降沿
EXTI_Init(&EXTI_InitStruct);

//4.NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//2 bits for pre-emption priority
    //2 bits for subpriority
   NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel      =EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd     =ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =2;    //设置抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority   =2;    //设置子优先级
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel      =EXTI2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =3;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel      =EXTI3_IRQn;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel      =EXTI4_IRQn;
NVIC_Init(&NVIC_InitStruct);


}

void EXTI0_IRQHandler(void)
{
//IRQ?
if(EXTI_GetITStatus(EXTI_Line0)==SET)  //如果中断产生
{
  //do
  if(Bit_RESET==GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))  //确定是由于对应的按键按下
  {
   delay(100);
   GPIO_ToggleBits(GPIOF, GPIO_Pin_9);  
  }
  //clear
  EXTI_ClearITPendingBit(EXTI_Line0);
}
}
void EXTI2_IRQHandler(void)
{
//IRQ?
if(EXTI_GetITStatus(EXTI_Line2)==SET)
{
  //do
  if(Bit_RESET==GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2))
  {
   delay(100);
   GPIO_ToggleBits(GPIOF, GPIO_Pin_10);
  }
  //clear
  EXTI_ClearITPendingBit(EXTI_Line2);
}
}
void EXTI3_IRQHandler(void)
{
//IRQ?
if(EXTI_GetITStatus(EXTI_Line3)==SET)
{
  //do
  if(Bit_RESET==GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3))
  {
   delay(100);
   GPIO_ToggleBits(GPIOE, GPIO_Pin_13);
  }
  //clear
  EXTI_ClearITPendingBit(EXTI_Line3);
}
}

void EXTI4_IRQHandler(void)
{
//IRQ?
if(EXTI_GetITStatus(EXTI_Line4)==SET)
{
  //do
  if(Bit_RESET==GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4))
  {
   delay(100);
   GPIO_ToggleBits(GPIOE, GPIO_Pin_14);
  }
  //clear
  EXTI_ClearITPendingBit(EXTI_Line4);
}
}

使用特权

评论回复
30
Jacquetry| | 2023-10-18 19:36 | 只看该作者
中断触发机制是怎么实现的啊

使用特权

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

本版积分规则