RISC-V技术william hill官网
直播中

jf_89761755

4年用户 141经验值
擅长:嵌入式技术
私信 关注
[经验]

【芯昇科技RISC-V生态开发板试用体验】2.中断的实现

    上一次封装了IO的基本功能,既然是IO,那肯定有O也有I,这次就把I也封装了。输入很简单,IO的功能里已经有了,剩下的就是中断的实现,先来看下结构体和函数的声明。

  1. #ifdef HW_INT
  2.         typedef enum
  3.         {
  4.                 NONE = 0,
  5.                 RISE = EXti_Trigger_Rising,
  6.                 FALL = EXTI_Trigger_Falling,
  7.                 BOTH = EXTI_Trigger_Rising_Falling,
  8.         } TEDGE;

  9.         typedef struct _INT CINT;
  10.         typedef void (*TISR_INT)(CINT* INTx, bool Level);

  11.         typedef struct _INT
  12.         {
  13.                 CIO* IOx;
  14.                 TEDGE Edge;

  15.                 EXTI_InitType _hEXTI;
  16.                 IRQn_Type _IRQn;
  17.                 TISR_INT _OnINT;
  18.         } CINT;

  19.         extern void INT_InitCM(CINT* INTx, TISR_INT OnINT);
  20.         extern void INT_Enable(CINT* INTx);
  21.         extern void INT_Disable(CINT* INTx);
  22.         extern bool INT_GetHL(CINT* INTx);
  23. #endif
   帖子里直接粘贴代码格式就乱了,缩进也没有了,凑合看吧。同样还是定义了一个结构体,每个INT创建一次。

  1. void INT_InitCM(CINT* INTx, TISR_INT OnINT)
  2. {
  3.         IO_Config(INTx->IOx, 0);

  4.         INTx->_OnINT = OnINT;
  5.         _INTx[INTx->IOx->IndexPin] = INTx;

  6.         RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE);
  7.         GPIO_ConfigEXTILine(INTx->IOx->_IndexPort, INTx->IOx->IndexPin); //GPIOA_PORT_SOURCE, GPIO_PIN_SOURCE0

  8.         INTx->_hEXTI.EXTI_Line    = EXTI_GPIO | INTx->IOx->IndexPin; //EXTI_LINE0
  9.         INTx->_hEXTI.EXTI_Mode    = EXTI_Mode_Interrupt;
  10.         INTx->_hEXTI.EXTI_Trigger = INTx->Edge; //EXTI_Trigger_Rising;

  11.         ECLIC_SetCfgNlbits(1);

  12.         switch (INTx->IOx->IndexPin)
  13.         {
  14.                 case 0: INTx->_IRQn = EXTI0_IRQn; break;
  15.                 case 1: INTx->_IRQn = EXTI1_IRQn; break;
  16.                 case 2: INTx->_IRQn = EXTI2_IRQn; break;
  17.                 case 3: INTx->_IRQn = EXTI3_IRQn; break;
  18.                 case 4: INTx->_IRQn = EXTI4_IRQn; break;
  19.                 case 5: case 6: case 7: case 8: case 9:
  20.                         INTx->_IRQn = EXTI9_5_IRQn; break;
  21.                 default: INTx->_IRQn = EXTI15_10_IRQn; break;
  22.         }
  23.         ECLIC_SetLevelIRQ(INTx->_IRQn, 1);
  24.         ECLIC_SetPriorityIRQ(INTx->_IRQn, 2);
  25.         ECLIC_SetTrigIRQ(INTx->_IRQn, ECLIC_LEVEL_TRIGGER);
  26. }

  27. void INT_Enable(CINT* INTx)
  28. {
  29.         __disable_irq();
  30.         INTx->_hEXTI.EXTI_LineCmd = (INTx->_OnINT != NULL);
  31.         EXTI_Init(&INTx->_hEXTI);
  32.         ECLIC_EnableIRQ(INTx->_IRQn);
  33.         __enable_irq();
  34. }

  35. void INT_Disable(CINT* INTx)
  36. {
  37.         INTx->_hEXTI.EXTI_LineCmd = DISABLE;
  38.         EXTI_Init(&INTx->_hEXTI);
  39.         ECLIC_DisableIRQ(INTx->_IRQn);
  40. }

  41. bool INT_GetHL(CINT* INTx)
  42. {
  43.         return GPIO_ReadInputDataBit(INTx->IOx->Port, INTx->IOx->_hIO.Pin);
  44. }

  45. static void INT_HandlerIRQ(CINT* INTx)
  46. {
  47.         EXTI_ClrITPendBit(INTx->_hEXTI.EXTI_Line);
  48.         INTx->_OnINT(INTx, INT_GetHL(INTx));
  49. }

  50. void EXTI0_IRQHandler(void)
  51. {
  52.         if (EXTI_GetITStatus(EXTI_LINE0)) INT_HandlerIRQ(_INTx[0]);
  53. }

  54. void EXTI1_IRQHandler(void)
  55. {
  56.         if (EXTI_GetITStatus(EXTI_LINE1)) INT_HandlerIRQ(_INTx[1]);
  57. }

  58. void EXTI2_IRQHandler(void)
  59. {
  60.         if (EXTI_GetITStatus(EXTI_LINE2)) INT_HandlerIRQ(_INTx[2]);
  61. }

  62. void EXTI3_IRQHandler(void)
  63. {
  64.         if (EXTI_GetITStatus(EXTI_LINE3)) INT_HandlerIRQ(_INTx[3]);
  65. }

  66. void EXTI4_IRQHandler(void)
  67. {
  68.         if (EXTI_GetITStatus(EXTI_LINE4)) INT_HandlerIRQ(_INTx[4]);
  69. }

  70. void EXTI9_5_IRQHandler(void)
  71. {
  72.         if (EXTI_GetITStatus(EXTI_LINE5)) INT_HandlerIRQ(_INTx[5]);
  73.         else if (EXTI_GetITStatus(EXTI_LINE6)) INT_HandlerIRQ(_INTx[6]);
  74.         else if (EXTI_GetITStatus(EXTI_LINE7)) INT_HandlerIRQ(_INTx[7]);
  75.         else if (EXTI_GetITStatus(EXTI_LINE8)) INT_HandlerIRQ(_INTx[8]);
  76.         else if (EXTI_GetITStatus(EXTI_LINE9)) INT_HandlerIRQ(_INTx[9]);
  77. }

  78. void EXTI15_10_IRQHandler(void)
  79. {
  80.         if (EXTI_GetITStatus(EXTI_LINE10)) INT_HandlerIRQ(_INTx[10]);
  81.         else if (EXTI_GetITStatus(EXTI_LINE11)) INT_HandlerIRQ(_INTx[11]);
  82.         else if (EXTI_GetITStatus(EXTI_LINE12)) INT_HandlerIRQ(_INTx[12]);
  83.         else if (EXTI_GetITStatus(EXTI_LINE13)) INT_HandlerIRQ(_INTx[13]);
  84.         else if (EXTI_GetITStatus(EXTI_LINE14)) INT_HandlerIRQ(_INTx[14]);
  85.         else if (EXTI_GetITStatus(EXTI_LINE15)) INT_HandlerIRQ(_INTx[15]);
  86. }
SDK把Init函数给用了,大小写也和我的习惯一样,所以在Init后面加了个CM以示区分。

    代码没什么,很简单是吧,这样改造后就和我其他的单片机通用了。

更多回帖

发帖
×
20
完善资料,
赚取积分