上一次封装了IO的基本功能,既然是IO,那肯定有O也有I,这次就把I也封装了。输入很简单,IO的功能里已经有了,剩下的就是中断的实现,先来看下结构体和函数的声明。
- #ifdef HW_INT
- typedef enum
- {
- NONE = 0,
- RISE = EXti_Trigger_Rising,
- FALL = EXTI_Trigger_Falling,
- BOTH = EXTI_Trigger_Rising_Falling,
- } TEDGE;
- typedef struct _INT CINT;
- typedef void (*TISR_INT)(CINT* INTx, bool Level);
- typedef struct _INT
- {
- CIO* IOx;
- TEDGE Edge;
- EXTI_InitType _hEXTI;
- IRQn_Type _IRQn;
- TISR_INT _OnINT;
- } CINT;
- extern void INT_InitCM(CINT* INTx, TISR_INT OnINT);
- extern void INT_Enable(CINT* INTx);
- extern void INT_Disable(CINT* INTx);
- extern bool INT_GetHL(CINT* INTx);
- #endif
帖子里直接粘贴代码格式就乱了,缩进也没有了,凑合看吧。同样还是定义了一个结构体,每个INT创建一次。
- void INT_InitCM(CINT* INTx, TISR_INT OnINT)
- {
- IO_Config(INTx->IOx, 0);
- INTx->_OnINT = OnINT;
- _INTx[INTx->IOx->IndexPin] = INTx;
- RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE);
- GPIO_ConfigEXTILine(INTx->IOx->_IndexPort, INTx->IOx->IndexPin); //GPIOA_PORT_SOURCE, GPIO_PIN_SOURCE0
- INTx->_hEXTI.EXTI_Line = EXTI_GPIO | INTx->IOx->IndexPin; //EXTI_LINE0
- INTx->_hEXTI.EXTI_Mode = EXTI_Mode_Interrupt;
- INTx->_hEXTI.EXTI_Trigger = INTx->Edge; //EXTI_Trigger_Rising;
- ECLIC_SetCfgNlbits(1);
- switch (INTx->IOx->IndexPin)
- {
- case 0: INTx->_IRQn = EXTI0_IRQn; break;
- case 1: INTx->_IRQn = EXTI1_IRQn; break;
- case 2: INTx->_IRQn = EXTI2_IRQn; break;
- case 3: INTx->_IRQn = EXTI3_IRQn; break;
- case 4: INTx->_IRQn = EXTI4_IRQn; break;
- case 5: case 6: case 7: case 8: case 9:
- INTx->_IRQn = EXTI9_5_IRQn; break;
- default: INTx->_IRQn = EXTI15_10_IRQn; break;
- }
- ECLIC_SetLevelIRQ(INTx->_IRQn, 1);
- ECLIC_SetPriorityIRQ(INTx->_IRQn, 2);
- ECLIC_SetTrigIRQ(INTx->_IRQn, ECLIC_LEVEL_TRIGGER);
- }
- void INT_Enable(CINT* INTx)
- {
- __disable_irq();
- INTx->_hEXTI.EXTI_LineCmd = (INTx->_OnINT != NULL);
- EXTI_Init(&INTx->_hEXTI);
- ECLIC_EnableIRQ(INTx->_IRQn);
- __enable_irq();
- }
- void INT_Disable(CINT* INTx)
- {
- INTx->_hEXTI.EXTI_LineCmd = DISABLE;
- EXTI_Init(&INTx->_hEXTI);
- ECLIC_DisableIRQ(INTx->_IRQn);
- }
- bool INT_GetHL(CINT* INTx)
- {
- return GPIO_ReadInputDataBit(INTx->IOx->Port, INTx->IOx->_hIO.Pin);
- }
- static void INT_HandlerIRQ(CINT* INTx)
- {
- EXTI_ClrITPendBit(INTx->_hEXTI.EXTI_Line);
- INTx->_OnINT(INTx, INT_GetHL(INTx));
- }
- void EXTI0_IRQHandler(void)
- {
- if (EXTI_GetITStatus(EXTI_LINE0)) INT_HandlerIRQ(_INTx[0]);
- }
- void EXTI1_IRQHandler(void)
- {
- if (EXTI_GetITStatus(EXTI_LINE1)) INT_HandlerIRQ(_INTx[1]);
- }
- void EXTI2_IRQHandler(void)
- {
- if (EXTI_GetITStatus(EXTI_LINE2)) INT_HandlerIRQ(_INTx[2]);
- }
- void EXTI3_IRQHandler(void)
- {
- if (EXTI_GetITStatus(EXTI_LINE3)) INT_HandlerIRQ(_INTx[3]);
- }
- void EXTI4_IRQHandler(void)
- {
- if (EXTI_GetITStatus(EXTI_LINE4)) INT_HandlerIRQ(_INTx[4]);
- }
- void EXTI9_5_IRQHandler(void)
- {
- if (EXTI_GetITStatus(EXTI_LINE5)) INT_HandlerIRQ(_INTx[5]);
- else if (EXTI_GetITStatus(EXTI_LINE6)) INT_HandlerIRQ(_INTx[6]);
- else if (EXTI_GetITStatus(EXTI_LINE7)) INT_HandlerIRQ(_INTx[7]);
- else if (EXTI_GetITStatus(EXTI_LINE8)) INT_HandlerIRQ(_INTx[8]);
- else if (EXTI_GetITStatus(EXTI_LINE9)) INT_HandlerIRQ(_INTx[9]);
- }
- void EXTI15_10_IRQHandler(void)
- {
- if (EXTI_GetITStatus(EXTI_LINE10)) INT_HandlerIRQ(_INTx[10]);
- else if (EXTI_GetITStatus(EXTI_LINE11)) INT_HandlerIRQ(_INTx[11]);
- else if (EXTI_GetITStatus(EXTI_LINE12)) INT_HandlerIRQ(_INTx[12]);
- else if (EXTI_GetITStatus(EXTI_LINE13)) INT_HandlerIRQ(_INTx[13]);
- else if (EXTI_GetITStatus(EXTI_LINE14)) INT_HandlerIRQ(_INTx[14]);
- else if (EXTI_GetITStatus(EXTI_LINE15)) INT_HandlerIRQ(_INTx[15]);
- }
SDK把Init函数给用了,大小写也和我的习惯一样,所以在Init后面加了个CM以示区分。
代码没什么,很简单是吧,这样改造后就和我其他的
单片机通用了。