牛卧堂MCU技术交流

标题: ma35d1中M4的gpio中断无法进入 [打印本页]

作者: 匿名    时间: 2023-12-14 14:06
标题: ma35d1中M4的gpio中断无法进入
gpio配置输入,输入电平变化可以正常读取,但是中断函数却无法进入,试了下好几个io口都不能进入中断函数,目前怀疑是linux里面已经申请了gpio中断了,所以导致m4无法触发中断。
作者: chrishu    时间: 2023-12-15 10:02
中断是否使能
作者: 匿名    时间: 2023-12-15 14:14
  1. void in_init(void)
  2. {
  3.         SYS_UnlockReg();
  4.         CLK_EnableModuleClock(GPA_MODULE);
  5.         CLK_EnableModuleClock(GPD_MODULE);
  6.         CLK_EnableModuleClock(GPH_MODULE);
  7.         CLK_EnableModuleClock(GPI_MODULE);
  8.         CLK_EnableModuleClock(GPK_MODULE);
  9.         CLK_EnableModuleClock(GPL_MODULE);
  10.         SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_PA15MFP_Msk);
  11.         SYS->GPD_MFPH &= ~(SYS_GPD_MFPH_PD15MFP_Msk);
  12.         SYS->GPH_MFPH &= ~(SYS_GPH_MFPH_PH12MFP_Msk);
  13.         SYS->GPH_MFPH &= ~(SYS_GPH_MFPH_PH14MFP_Msk);
  14.         SYS->GPH_MFPH &= ~(SYS_GPH_MFPH_PH15MFP_Msk);
  15.         SYS->GPI_MFPL &= ~(SYS_GPI_MFPL_PI6MFP_Msk);
  16.         SYS->GPK_MFPL &= ~(SYS_GPK_MFPL_PK1MFP_Msk);
  17.         SYS->GPL_MFPL &= ~(SYS_GPL_MFPL_PL1MFP_Msk);
  18.         SYS->GPL_MFPL &= ~(SYS_GPL_MFPL_PL3MFP_Msk);
  19.         SYS->GPL_MFPL &= ~(SYS_GPL_MFPL_PL5MFP_Msk);
  20.         SYS->GPL_MFPH &= ~(SYS_GPL_MFPH_PL9MFP_Msk);
  21.         SYS_LockReg();
  22.       
  23.         GPIO_SetMode(PD, BIT15, GPIO_MODE_INPUT);
  24.         #if (S_S1_PULL_UP==1)
  25.     GPIO_EnableInt(PD, 15, GPIO_INT_BOTH_EDGE);
  26.         #else
  27.         GPIO_EnableInt(PD, 15, GPIO_INT_RISING);
  28.         #endif
  29.     NVIC_EnableIRQ(GPD_IRQn);
  30.       
  31.         GPIO_SetMode(PI, BIT6, GPIO_MODE_INPUT);
  32.         #if (S_S2_PULL_UP==1)
  33.     GPIO_EnableInt(PI, 6, GPIO_INT_FALLING);
  34.         #else
  35.         GPIO_EnableInt(PI, 6, GPIO_INT_RISING);
  36.         #endif
  37.     NVIC_EnableIRQ(GPI_IRQn);
  38.       
  39.         GPIO_SetMode(PA, BIT15, GPIO_MODE_INPUT);
  40.         #if (S_S3_PULL_UP==1)
  41.     GPIO_EnableInt(PA, 15, GPIO_INT_FALLING);
  42.         #else
  43.         GPIO_EnableInt(PA, 15, GPIO_INT_RISING);
  44.         #endif
  45.     NVIC_EnableIRQ(GPA_IRQn);
  46.       
  47.         GPIO_SetMode(PK, BIT1, GPIO_MODE_INPUT);
  48.         #if (S_S4_PULL_UP==1)
  49.     GPIO_EnableInt(PK, 1, GPIO_INT_FALLING);
  50.         #else
  51.         GPIO_EnableInt(PK, 1, GPIO_INT_RISING);
  52.         #endif
  53.     NVIC_EnableIRQ(GPK_IRQn);
  54.       
  55.         GPIO_SetMode(PL, BIT1, GPIO_MODE_INPUT);
  56.         #if (S_S5_PULL_UP==1)
  57.     GPIO_EnableInt(PL, 1, GPIO_INT_FALLING);
  58.         #else
  59.         GPIO_EnableInt(PL, 1, GPIO_INT_RISING);
  60.         #endif
  61. //    NVIC_EnableIRQ(GPL_IRQn);
  62.       
  63.         GPIO_SetMode(PL, BIT9, GPIO_MODE_INPUT);
  64.         #if (S_S6_PULL_UP==1)
  65.     GPIO_EnableInt(PL, 9, GPIO_INT_FALLING);
  66.         #else
  67.         GPIO_EnableInt(PL, 9, GPIO_INT_RISING);
  68.         #endif
  69. //    NVIC_EnableIRQ(GPL_IRQn);
  70.       
  71.         GPIO_SetMode(PL, BIT3, GPIO_MODE_INPUT);
  72.         #if (S_S7_PULL_UP==1)
  73.     GPIO_EnableInt(PL, 3, GPIO_INT_FALLING);
  74.         #else
  75.         GPIO_EnableInt(PL, 3, GPIO_INT_RISING);
  76.         #endif
  77. //    NVIC_EnableIRQ(GPL_IRQn);
  78.       
  79.         GPIO_SetMode(PL, BIT5, GPIO_MODE_INPUT);
  80.         #if (S_S8_PULL_UP==1)
  81.     GPIO_EnableInt(PL, 5, GPIO_INT_FALLING);
  82.         #else
  83.         GPIO_EnableInt(PL, 5, GPIO_INT_RISING);
  84.         #endif
  85.     NVIC_EnableIRQ(GPL_IRQn);
  86.       
  87.         GPIO_SetMode(PH, BIT14, GPIO_MODE_INPUT);
  88.         #if (U_IN1_PULL_UP==1)
  89.     GPIO_EnableInt(PH, 14, GPIO_INT_FALLING);
  90.         #else
  91.         GPIO_EnableInt(PH, 14, GPIO_INT_RISING);
  92.         #endif
  93. //    NVIC_EnableIRQ(GPH_IRQn);
  94.       
  95.         GPIO_SetMode(PH, BIT12, GPIO_MODE_INPUT);
  96.         #if (U_IN2_PULL_UP==1)
  97.     GPIO_EnableInt(PH, 12, GPIO_INT_FALLING);
  98.         #else
  99.         GPIO_EnableInt(PH, 12, GPIO_INT_RISING);
  100.         #endif
  101. //    NVIC_EnableIRQ(GPH_IRQn);
  102.       
  103.         GPIO_SetMode(PH, BIT15, GPIO_MODE_INPUT);
  104.         #if (U_IN3_PULL_UP==1)
  105.     GPIO_EnableInt(PH, 15, GPIO_INT_FALLING);
  106.         #else
  107.         GPIO_EnableInt(PH, 15, GPIO_INT_RISING);
  108.         #endif
  109.     NVIC_EnableIRQ(GPH_IRQn);
  110.       
  111. //        GPIO_SET_DEBOUNCE_TIME(PD, GPIO_DBCTL_DBCLKSRC_HXT, GPIO_DBCTL_DBCLKSEL_32768);
  112. //         
  113. //        GPIO_ENABLE_DEBOUNCE(PD, BIT15);
  114. }
复制代码


作者: 匿名    时间: 2023-12-15 14:16
  1. void GPA_IRQHandler(void)
  2. {
  3.     /* To check if PA.2 interrupt occurred */
  4.     if(GPIO_GET_INT_FLAG(PA, BIT15))
  5.     {
  6.         GPIO_CLR_INT_FLAG(PA, BIT15);
  7.         printf("PA.15 INT occurred.\n");
  8.     }
  9.     else
  10.     {
  11.         /* Un-expected interrupt. Just clear all PA interrupts */
  12.         PA->INTSRC = PA->INTSRC;
  13.         printf("Un-expected A interrupts.\n");
  14.     }
  15. }
  16. void GPD_IRQHandler(void)
  17. {
  18.     /* To check if PD.15 interrupt occurred */
  19.     if(GPIO_GET_INT_FLAG(PD, BIT15))
  20.     {
  21.         GPIO_CLR_INT_FLAG(PD, BIT15);
  22.         printf("PD.15 INT occurred.\n");
  23.     }
  24.     else
  25.     {
  26.         /* Un-expected interrupt. Just clear all PA interrupts */
  27.         PD->INTSRC = PD->INTSRC;
  28.         printf("Un-expected D interrupts.\n");
  29.     }
  30. }
  31. void GPI_IRQHandler(void)
  32. {
  33.     /* To check if PA.2 interrupt occurred */
  34.     if(GPIO_GET_INT_FLAG(PI, BIT6))
  35.     {
  36.         GPIO_CLR_INT_FLAG(PI, BIT6);
  37.         printf("PI.6 INT occurred.\n");
  38.     }
  39.     else
  40.     {
  41.         /* Un-expected interrupt. Just clear all PA interrupts */
  42.         PI->INTSRC = PI->INTSRC;
  43.         printf("Un-expected I interrupts.\n");
  44.     }
  45. }
  46. void GPK_IRQHandler(void)
  47. {
  48.     /* To check if PA.2 interrupt occurred */
  49.     if(GPIO_GET_INT_FLAG(PK, BIT1))
  50.     {
  51.         GPIO_CLR_INT_FLAG(PK, BIT1);
  52.         printf("PK.1 INT occurred.\n");
  53.     }
  54.     else
  55.     {
  56.         /* Un-expected interrupt. Just clear all PA interrupts */
  57.         PK->INTSRC = PK->INTSRC;
  58.         printf("Un-expected K interrupts.\n");
  59.     }
  60. }
  61. void GPL_IRQHandler(void)
  62. {
  63.     /* To check if PA.2 interrupt occurred */
  64.     if(GPIO_GET_INT_FLAG(PL, BIT1))
  65.     {
  66.         GPIO_CLR_INT_FLAG(PL, BIT1);
  67.         printf("PL.1 INT occurred.\n");
  68.     }
  69.         else if(GPIO_GET_INT_FLAG(PL, BIT3))
  70.     {
  71.         GPIO_CLR_INT_FLAG(PL, BIT3);
  72.         printf("PL.3 INT occurred.\n");
  73.     }
  74.         else if(GPIO_GET_INT_FLAG(PL, BIT5))
  75.     {
  76.         GPIO_CLR_INT_FLAG(PL, BIT5);
  77.         printf("PL.5 INT occurred.\n");
  78.     }
  79.         else if(GPIO_GET_INT_FLAG(PL, BIT9))
  80.     {
  81.         GPIO_CLR_INT_FLAG(PL, BIT9);
  82.         printf("PL.9 INT occurred.\n");
  83.     }
  84.     else
  85.     {
  86.         /* Un-expected interrupt. Just clear all PA interrupts */
  87.         PL->INTSRC = PL->INTSRC;
  88.         printf("Un-expected L interrupts.\n");
  89.     }
  90. }
  91. void GPH_IRQHandler(void)
  92. {
  93.     /* To check if PA.2 interrupt occurred */
  94.     if(GPIO_GET_INT_FLAG(PH, BIT12))
  95.     {
  96.         GPIO_CLR_INT_FLAG(PH, BIT12);
  97.         printf("PH.12 INT occurred.\n");
  98.     }
  99.         else if(GPIO_GET_INT_FLAG(PH, BIT14))
  100.     {
  101.         GPIO_CLR_INT_FLAG(PH, BIT14);
  102.         printf("PH.14 INT occurred.\n");
  103.     }
  104.         else if(GPIO_GET_INT_FLAG(PH, BIT15))
  105.     {
  106.         GPIO_CLR_INT_FLAG(PH, BIT15);
  107.         printf("PH.15 INT occurred.\n");
  108.     }
  109.     else
  110.     {
  111.         /* Un-expected interrupt. Just clear all PA interrupts */
  112.         PH->INTSRC = PH->INTSRC;
  113.         printf("Un-expected H interrupts.\n");
  114.     }
  115. }
复制代码


作者: chrishu    时间: 2023-12-18 16:40

如果可以debug的话,可以按照下图去看一下GPIO中断的实际情况。

如果中断有被挂起,考虑是否还开了其他中断,中断优先级比GPIO中断高,并且对方一直有在产生中断导致没时间进GPIO中断。

作者: 匿名    时间: 2023-12-30 16:40
KEIL 工程能不能发一个DEMO 参考源码 ,亮一个LED指示灯
作者: 匿名    时间: 2023-12-30 16:41
chrishu 发表于 2023-12-18 16:40
如果可以debug的话,可以按照下图去看一下GPIO中断的实际情况。

如果中断有被挂起,考虑是否还开了其他中 ...

开发MA35D1 ,能提供一个KEIL 工程DEMO 参考源码 ,亮一个LED指示灯;具体用哪一个版本MDK?




欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/) Powered by Discuz! X3.2