stm32 exti 5~9 中断源区分

void EXTI9_5_IRQHandler(void)
{

  u32 Temp = 0x00; 

  PEout(2) = ~PEout(2);
  Temp = EXTI->PR;       //取读是那个引脚的中断
  switch(Temp)
  {
    case Exti_From_Pin8:
      EXTI_ClearITPendingBit(EXTI_Line8);
      break;
    case Exti_From_Pin9:
      if(Sys_Status < MAX_STATUS)
      {
        Sys_Status ++;
      }
      EXTI_ClearITPendingBit(EXTI_Line9);
      break;
    default:break;
  }
}

=========================================分割线=========================================

中断处理程序说明,由于外部中断EXTI5——EXTI9公用了一个中断(EXTI10——EXTI15类似)所以要

区分不同的中断源需要进行相应的判断。如上EXTI9_5_IRQHandler中,通过取读EXTI->PR寄存器来判

断中断的来源。


具体如下:




  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是基于标准库的stm32f103c8t6的5个按键中断代码: ```c #include "stm32f10x.h" void EXTI0_IRQHandler(void) { // 对应PA0 if (EXTI_GetITStatus(EXTI_Line0) == SET) { // 在这里添加按键0的处理代码 EXTI_ClearITPendingBit(EXTI_Line0); } } void EXTI1_IRQHandler(void) { // 对应PA1 if (EXTI_GetITStatus(EXTI_Line1) == SET) { // 在这里添加按键1的处理代码 EXTI_ClearITPendingBit(EXTI_Line1); } } void EXTI2_IRQHandler(void) { // 对应PA2 if (EXTI_GetITStatus(EXTI_Line2) == SET) { // 在这里添加按键2的处理代码 EXTI_ClearITPendingBit(EXTI_Line2); } } void EXTI3_IRQHandler(void) { // 对应PA3 if (EXTI_GetITStatus(EXTI_Line3) == SET) { // 在这里添加按键3的处理代码 EXTI_ClearITPendingBit(EXTI_Line3); } } void EXTI4_IRQHandler(void) { // 对应PA4 if (EXTI_GetITStatus(EXTI_Line4) == SET) { // 在这里添加按键4的处理代码 EXTI_ClearITPendingBit(EXTI_Line4); } } void EXTI9_5_IRQHandler(void) { // 对应PB5~PB9 if (EXTI_GetITStatus(EXTI_Line5) == SET) { // 在这里添加按键5的处理代码 EXTI_ClearITPendingBit(EXTI_Line5); } if (EXTI_GetITStatus(EXTI_Line6) == SET) { // 在这里添加按键6的处理代码 EXTI_ClearITPendingBit(EXTI_Line6); } if (EXTI_GetITStatus(EXTI_Line7) == SET) { // 在这里添加按键7的处理代码 EXTI_ClearITPendingBit(EXTI_Line7); } if (EXTI_GetITStatus(EXTI_Line8) == SET) { // 在这里添加按键8的处理代码 EXTI_ClearITPendingBit(EXTI_Line8); } if (EXTI_GetITStatus(EXTI_Line9) == SET) { // 在这里添加按键9的处理代码 EXTI_ClearITPendingBit(EXTI_Line9); } } void EXTI15_10_IRQHandler(void) { // 对应PB10~PB15 if (EXTI_GetITStatus(EXTI_Line10) == SET) { // 在这里添加按键10的处理代码 EXTI_ClearITPendingBit(EXTI_Line10); } if (EXTI_GetITStatus(EXTI_Line11) == SET) { // 在这里添加按键11的处理代码 EXTI_ClearITPendingBit(EXTI_Line11); } if (EXTI_GetITStatus(EXTI_Line12) == SET) { // 在这里添加按键12的处理代码 EXTI_ClearITPendingBit(EXTI_Line12); } if (EXTI_GetITStatus(EXTI_Line13) == SET) { // 在这里添加按键13的处理代码 EXTI_ClearITPendingBit(EXTI_Line13); } if (EXTI_GetITStatus(EXTI_Line14) == SET) { // 在这里添加按键14的处理代码 EXTI_ClearITPendingBit(EXTI_Line14); } if (EXTI_GetITStatus(EXTI_Line15) == SET) { // 在这里添加按键15的处理代码 EXTI_ClearITPendingBit(EXTI_Line15); } } int main(void) { // 初始化GPIO口和中断线 GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 使能GPIO和AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); // 配置按键引脚为输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_Init(GPIOB, &GPIO_InitStructure); // 配置中断线 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_Falling; // 下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1); EXTI_InitStructure.EXTI_Line = EXTI_Line1; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource2); EXTI_InitStructure.EXTI_Line = EXTI_Line2; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3); EXTI_InitStructure.EXTI_Line = EXTI_Line3; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4); EXTI_InitStructure.EXTI_Line = EXTI_Line4; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource5); EXTI_InitStructure.EXTI_Line = EXTI_Line5; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6); EXTI_InitStructure.EXTI_Line = EXTI_Line6; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7); EXTI_InitStructure.EXTI_Line = EXTI_Line7; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8); EXTI_InitStructure.EXTI_Line = EXTI_Line8; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9); EXTI_InitStructure.EXTI_Line = EXTI_Line9; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource10); EXTI_InitStructure.EXTI_Line = EXTI_Line10; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11); EXTI_InitStructure.EXTI_Line = EXTI_Line11; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12); EXTI_InitStructure.EXTI_Line = EXTI_Line12; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource13); EXTI_InitStructure.EXTI_Line = EXTI_Line13; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14); EXTI_InitStructure.EXTI_Line = EXTI_Line14; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource15); EXTI_InitStructure.EXTI_Line = EXTI_Line15; EXTI_Init(&EXTI_InitStructure); // 配置中断优先级 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_Init(&NVIC_InitStructure); while (1) { // 在这里添加程序的其他部分 } } ``` 需要注意的是,这里的按键引脚都是使用上拉输入的方式接入,因此在按下按键时,对应的引脚会变成低电平。另外,由于stm32f103c8t6只有一个EXTI中断线,因此需要将多个按键连接到同一个中断线上,然后在中断处理函数中根据不同的按键进行区分处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值