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

[复制链接]
 楼主| yangjiaxu 发表于 2024-5-16 13:30 | 显示全部楼层 |阅读模式
正点原子的写法:
  1. void EXTIX_Init(void)
  2. {
  3.           GPIO_InitTypeDef GPIO_InitStructure;
  4.                 EXTI_InitTypeDef EXTI_InitStructure;
  5.                 NVIC_InitTypeDef NVIC_InitStructure;


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

  7.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

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

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

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

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

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

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

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

  48.           NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                        //使能按键所在的外部中断通道
  49.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
  50.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级1
  51.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  52.           NVIC_Init(&NVIC_InitStructure);
  53.   
  54.           NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                        //使能按键所在的外部中断通道
  55.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2
  56.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                                        //子优先级2
  57.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  58.           NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  59.                          
  60.                 NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键所在的外部中断通道
  61.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;        //抢占优先级2
  62.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                                        //子优先级2
  63.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  64.           NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  65. }
我这么写的:
  1. void IR_Init(void) //电源开关控制初始化
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure;
  4.     EXTI_InitTypeDef EXTI_InitStructure;
  5.     NVIC_InitTypeDef NVIC_InitStructure;

  6.     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

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


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

  25.     EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  26.     NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                        //使能按键所在的外部中断通道
  27.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;        //抢占优先级2,
  28.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级1
  29.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  30.     NVIC_Init(&NVIC_InitStructure);
  31. }
就是将中断线4,5,15并在一起的,这么写是否OK?
虚幻的是灵魂 发表于 2024-5-17 11:55 | 显示全部楼层
呐咯密密 发表于 2024-5-29 17:32 | 显示全部楼层
可以的,中断触发方式一样就行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

783

主题

3316

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:嵌入式技术专家
简介:擅长电路设计、物联网产品开发、射频产品开发,喜欢打篮球,技术交流,欢迎各位来聊~

783

主题

3316

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部