Files
CHJ/user/MCU/lhl_exti.c

111 lines
4.0 KiB
C
Raw Normal View History

2026-03-20 21:16:58 +08:00
#include "../main/SystemInclude.h"
2026-03-20 21:19:04 +08:00
2026-03-20 21:16:58 +08:00
/**------------------------------------------------------------------------
2026-03-20 21:19:04 +08:00
* @brief <EFBFBD>ⲿ<EFBFBD>жϳ<EFBFBD>ʼ<EFBFBD><EFBFBD>
* @note
* @param
* @example:
GPIO_EXTI_Init(GPIO1,GPIO_PIN_7,EXTI_LINE_7,EXTI4_7_IRQn);
GPIO_EXTI_Init(GPIO0,GPIO_PIN_3,EXTI_LINE_3,EXTI2_3_IRQn);
GPIO_EXTI_Init(GPIO1,GPIO_PIN_0,EXTI_LINE_0,EXTI0_1_IRQn);
2026-03-20 21:16:58 +08:00
**/
void GPIO_EXTI_Init(GPIO_TypeDef* EXTI_GPIOx ,uint16_t EXTI_PINx ,EXTI_LINE_t EXTI_LINEx,IRQn_Type EXTI_IRQx)
{
GPIO_InitTypeDef GPIO_InitStructure;// GPIO<49><4F><EFBFBD>ýṹ<C3BD><E1B9B9>
EXTI_InitTypeDef EXTI_InitStructure;// EXTI<54><49><EFBFBD>ýṹ<C3BD><E1B9B9>
/* 1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD> */
GPIO_InitStructure.Pin = EXTI_PINx; // Pinx
GPIO_InitStructure.Mode = GPIO_MODE_INPUT; // <20><><EFBFBD><EFBFBD>ģʽ
// GPIO_InitStructure.Pull = GPIO_NOPULL; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GPIO_NOPULL
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.SchmittTrigger = ENABLE; // <20><><EFBFBD><EFBFBD>ʩ<EFBFBD><CAA9><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_InitStructure.Alternate = GPIOx_AF_GPIO;
LHL_GPIO_Init(EXTI_GPIOx, &GPIO_InitStructure); // <20><>ʼ<EFBFBD><CABC>PinΪ<6E><CEAA><EFBFBD><EFBFBD>
LHL_GPIO_SetEXTILine(EXTI_GPIOx, EXTI_PINx); // <20><><EFBFBD><EFBFBD>PinΪEXTI0
/* 2. <20><><EFBFBD><EFBFBD>EXTI<54><49><EFBFBD><EFBFBD> */
EXTI_InitStructure.Line = EXTI_LINEx;
EXTI_InitStructure.Mode = EXTI_MODE_INTERRUPT; // EXTI<54>ж<EFBFBD>ģʽ
2026-03-20 21:19:04 +08:00
EXTI_InitStructure.Trigger = EXTI_TRIGGER_RISING_FALLING; // <20><><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD>
2026-03-20 21:16:58 +08:00
EXTI_InitStructure.LineCmd = ENABLE; // ʹ<><CAB9>EXTI
LHL_EXTI_Init(&EXTI_InitStructure); // <20><><EFBFBD><EFBFBD>EXTI
2026-03-20 21:19:04 +08:00
NVIC_EnableIRQ(EXTI_IRQx); // <20><><EFBFBD><EFBFBD>NVIC<49>ж<EFBFBD>
NVIC_SetPriority(EXTI_IRQx, 0); // <20><><EFBFBD><EFBFBD>EXIT3<54><33><EFBFBD>ȼ<EFBFBD>
2026-03-20 21:16:58 +08:00
}
/*-=====================================================================================================
2026-03-20 21:19:04 +08:00
//<2F>ж<EFBFBD>
2026-03-20 21:16:58 +08:00
-=====================================================================================================*/
/**------------------------------------------------------------------------
2026-03-20 21:19:04 +08:00
* @brief <EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>
* @note
* @param
* @example: void Exti_irq_callback(void){} Exti_register_irq_callback(EXTI_LINE_7,Exti_irq_callback);
**/
static exti_irq_callback_t exti_callbacks[EXTI_MAX_LINES] = {NULL};
// ע<><D7A2><EFBFBD>ص<EFBFBD>
2026-03-20 21:16:58 +08:00
void Exti_register_irq_callback(EXTI_LINE_t exti_linex, exti_irq_callback_t exti_irq_callback)
{
if (exti_linex == 0) return;//<2F><>ֹ<EFBFBD><D6B9>0 <20><><EFBFBD>߲<EFBFBD><DFB2><EFBFBD>EXTI_LINE_t<5F>IJ<EFBFBD><C4B2><EFBFBD>
uint8_t index = (uint8_t)__builtin_ctz((unsigned int)exti_linex); //<2F><>ȡexti_linex <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2026-03-20 21:19:04 +08:00
if (index >= EXTI_MAX_LINES) return;
exti_callbacks[index] = exti_irq_callback;
switch (index) { //<2F><>ȡ EXTI <20>߶<EFBFBD>Ӧ<EFBFBD><D3A6> IRQ <20><>
2026-03-20 21:16:58 +08:00
case 0:
case 1:
2026-03-20 21:19:04 +08:00
NVIC_EnableIRQ(EXTI0_1_IRQn);
2026-03-20 21:16:58 +08:00
break;
case 2:
case 3:
2026-03-20 21:19:04 +08:00
NVIC_EnableIRQ(EXTI2_3_IRQn);
2026-03-20 21:16:58 +08:00
break;
case 4:
case 5:
case 6:
case 7:
2026-03-20 21:19:04 +08:00
NVIC_EnableIRQ(EXTI4_7_IRQn);
2026-03-20 21:16:58 +08:00
break;
default:
2026-03-20 21:19:04 +08:00
// <20><>֧<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>
2026-03-20 21:16:58 +08:00
break;
}
}
2026-03-20 21:19:04 +08:00
2026-03-20 21:16:58 +08:00
void EXTI0_1_IRQHandler(void)
{
// <20><><EFBFBD><EFBFBD> EXTI0 <20><> EXTI1
if (LHL_EXTI_GetPending(EXTI_LINE_0) == SET) {
LHL_EXTI_ClearPending(EXTI_LINE_0);
if (exti_callbacks[0]) exti_callbacks[0]();
}
if (LHL_EXTI_GetPending(EXTI_LINE_1) == SET) {
LHL_EXTI_ClearPending(EXTI_LINE_1);
if (exti_callbacks[1]) exti_callbacks[1]();
}
}
2026-03-20 21:19:04 +08:00
2026-03-20 21:16:58 +08:00
void EXTI2_3_IRQHandler(void)
{
if (LHL_EXTI_GetPending(EXTI_LINE_2) == SET) {
LHL_EXTI_ClearPending(EXTI_LINE_2);
if (exti_callbacks[2]) exti_callbacks[2]();
}
if (LHL_EXTI_GetPending(EXTI_LINE_3) == SET) {
LHL_EXTI_ClearPending(EXTI_LINE_3);
if (exti_callbacks[3]) exti_callbacks[3]();
}
}
2026-03-20 21:19:04 +08:00
2026-03-20 21:16:58 +08:00
void EXTI4_7_IRQHandler(void)
{
for (int i = 4; i <= 7; i++) {
EXTI_LINE_t line = (EXTI_LINE_t)(1U << i);
if (LHL_EXTI_GetPending(line) == SET) {
LHL_EXTI_ClearPending(line);
if (exti_callbacks[i]) exti_callbacks[i]();
}
}
2026-03-20 21:19:04 +08:00
}