打印
[STM32]

在中断使用的时候,这两种写法是否均可以?

[复制链接]
415|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yangjiaxu|  楼主 | 2024-5-16 13:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
正点原子的写法:
void EXTIX_Init(void)
{
          GPIO_InitTypeDef GPIO_InitStructure;
                EXTI_InitTypeDef EXTI_InitStructure;
                NVIC_InitTypeDef NVIC_InitStructure;


          GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);        //关闭jtag

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

  //初始化 KEY0-->GPIOA.13,KEY1-->GPIOA.15  上拉输入
//          GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13|GPIO_Pin_15;
//          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//          GPIO_Init(GPIOA, &GPIO_InitStructure);
// 初始化 WK_UP-->GPIOA.0          下拉输入
          GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
          GPIO_Init(GPIOA, &GPIO_InitStructure);
       
          GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_11|GPIO_Pin_12;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
          GPIO_Init(GPIOB, &GPIO_InitStructure);
  //GPIOA.11 中断线以及中断初始化配置
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource11);

          EXTI_InitStructure.EXTI_Line=EXTI_Line11;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

//GPIOA.12          中断线以及中断初始化配置
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);

          EXTI_InitStructure.EXTI_Line=EXTI_Line12;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

  //GPIOA.0          中断线以及中断初始化配置
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

                EXTI_InitStructure.EXTI_Line=EXTI_Line0;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  //GPIOA.1          中断线以及中断初始化配置
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);

                EXTI_InitStructure.EXTI_Line=EXTI_Line1;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

          NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                        //使能按键所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级1
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);
  
          NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                        //使能按键所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                                        //子优先级2
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
                         
                NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;        //抢占优先级2
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                                        //子优先级2
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}
我这么写的:
void IR_Init(void) //电源开关控制初始化
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

    GPIO_InitStructure.GPIO_Pin  = IR_PIN;                                                //PB3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);
    EXTI_InitStructure.EXTI_Line = EXTI_Line3;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器


    GPIO_InitStructure.GPIO_Pin  = ITR_PIN | IRL_PIN | IRR_PIN;        //PA4,PA5,PA15
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4 | GPIO_PinSource5 | GPIO_PinSource15);
    EXTI_InitStructure.EXTI_Line = EXTI_Line4 | EXTI_Line5 | EXTI_Line15;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;

    EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                        //使能按键所在的外部中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;        //抢占优先级2,
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);
}
就是将中断线4,5,15并在一起的,这么写是否OK?

使用特权

评论回复

相关帖子

沙发
虚幻的是灵魂| | 2024-5-17 11:55 | 只看该作者

使用特权

评论回复
板凳
呐咯密密| | 2024-5-29 17:32 | 只看该作者
可以的,中断触发方式一样就行

使用特权

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

本版积分规则

认证:嵌入式技术专家
简介:擅长电路设计、物联网产品开发、射频产品开发,喜欢打篮球,技术交流,欢迎各位来聊~

508

主题

2178

帖子

5

粉丝