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
|
|
|
|
}
|