This commit is contained in:
2026-03-20 21:19:04 +08:00
parent 90c3d919df
commit 9d3b4b836f
247 changed files with 22127 additions and 30305 deletions

174
user/MCU/lhl_exti.c Executable file → Normal file
View File

@@ -1,16 +1,13 @@
#include "../main/SystemInclude.h"
/**------------------------------------------------------------------------
* @brief <20><EFBFBD><EFBFBD><EFBFBD> GPIO <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>ⲿ<EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
* @param EXTI_GPIOx: GPIO <20>˿<EFBFBD> (pGPIO0/pGPIO1/pGPIO2)
* @param EXTI_PINx: GPIO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA3AC> GPIO_PIN_3
* @param EXTI_LINEx: EXTI <20>ߺţ<DFBA><C5A3><EFBFBD> EXTI_LINE_3
* @param EXTI_IRQx: <20><>Ӧ<EFBFBD><D3A6><EFBFBD>ж<EFBFBD> IRQ <20>ţ<EFBFBD><C5A3><EFBFBD> EXTI2_3_IRQn
* @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>ʩ<EFBFBD><CAA9><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD>ӵ<EFBFBD> EXTI <20>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF>޸Ĵ<DEB8><C4B4><EFBFBD><EBA3A9>
* ע<><EFBFBD>жϵ<D0B6> NVIC ʹ<>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD>͡<EFBFBD>
* @example
* GPIO_EXTI_Init(pGPIO0, GPIO_PIN_3, EXTI_LINE_3, EXTI2_3_IRQn);
* @brief <20>ⲿ<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);
**/
void GPIO_EXTI_Init(GPIO_TypeDef* EXTI_GPIOx ,uint16_t EXTI_PINx ,EXTI_LINE_t EXTI_LINEx,IRQn_Type EXTI_IRQx)
{
@@ -30,124 +27,53 @@ void GPIO_EXTI_Init(GPIO_TypeDef* EXTI_GPIOx ,uint16_t EXTI_PINx ,EXTI_LINE_t EX
/* 2. <20><><EFBFBD><EFBFBD>EXTI<54><49><EFBFBD><EFBFBD> */
EXTI_InitStructure.Line = EXTI_LINEx;
EXTI_InitStructure.Mode = EXTI_MODE_INTERRUPT; // EXTI<54>ж<EFBFBD>ģʽ
EXTI_InitStructure.Trigger = EXTI_TRIGGER_RISING; // <20><><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD> EXTI_TRIGGER_RISING EXTI_TRIGGER_FALLING EXTI_TRIGGER_RISING_FALLING
EXTI_InitStructure.Trigger = EXTI_TRIGGER_RISING_FALLING; // <20><><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD>
EXTI_InitStructure.LineCmd = ENABLE; // ʹ<><CAB9>EXTI
LHL_EXTI_Init(&EXTI_InitStructure); // <20><><EFBFBD><EFBFBD>EXTI
// NVIC_EnableIRQ(EXTI_IRQx); // <20><><EFBFBD><EFBFBD>NVIC<49>ж<EFBFBD>
// NVIC_SetPriority(EXTI_IRQx, 0); // <20><><EFBFBD><EFBFBD>EXIT<49><54><EFBFBD>ȼ<EFBFBD>
NVIC_EnableIRQ(EXTI_IRQx); // <20><><EFBFBD><EFBFBD>NVIC<49>ж<EFBFBD>
NVIC_SetPriority(EXTI_IRQx, 0); // <20><><EFBFBD><EFBFBD>EXIT3<EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
}
/**------------------------------------------------------------------------
* @brief <20><><EFBFBD><EFBFBD> LPTIM <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>Ϊ EXTI <20>ж<EFBFBD>Դ
* @param lptimer: LPTIM1 <20><> LPTIM2
* @note LPTIM1 <20><>Ӧ EXTI_LINE_10<31><30>LPTIM2 <20><>Ӧ EXTI_LINE_11<31><31>
* <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>ж<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD> LPTIM <20>¼<EFBFBD><C2BC><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>
* @example LPTIM_EXTI_Init(LPTIM2);
**/
void LPTIM_EXTI_Init(LPTIM_TypeDef *lptimer)
{
EXTI_InitTypeDef EXTI_InitStructure;
if(lptimer == pLPTIM1) EXTI_InitStructure.Line = EXTI_LINE_10;
else EXTI_InitStructure.Line = EXTI_LINE_11;
EXTI_InitStructure.Mode = EXTI_MODE_INTERRUPT;
EXTI_InitStructure.Trigger = EXTI_TRIGGER_RISING;
EXTI_InitStructure.LineCmd = ENABLE;
LHL_EXTI_Init(&EXTI_InitStructure);
}
/**------------------------------------------------------------------------
* @brief <20><><EFBFBD><EFBFBD> ADC <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD>ݾ<EFBFBD><DDBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ EXTI <20>ж<EFBFBD>Դ
* @note ADC0 <20><> ADC1 <20>Ĺ<EFBFBD><C4B9><EFBFBD> EXTI_LINE_12<31><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>ж<EFBFBD>ģʽ<C4A3><CABD>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC ת<><D7AA><EFBFBD><EFBFBD><EFBFBD>ɻ<EFBFBD><C9BB><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>жϡ<D0B6>
* @example ADC_EXTI_Init();
**/
void ADC_EXTI_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.Line = EXTI_LINE_12;
EXTI_InitStructure.Mode = EXTI_MODE_INTERRUPT; // EXTI_MODE_EVENT
EXTI_InitStructure.Trigger = EXTI_TRIGGER_RISING;
EXTI_InitStructure.LineCmd = ENABLE;
LHL_EXTI_Init(&EXTI_InitStructure);
}
/* (PVD<56><44>RTC<54><43>DMA <20><> EXTI <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>) */
// EXTI_LINE_8 = 0x0100u, /*!< External interrupt line 8 PVD<56><44><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD> */
// EXTI_LINE_9 = 0x0200u, /*!< External interrupt line 9 RTC<54><43><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD> */
// EXTI_LINE_13 = 0x2000u, /*!< External interrupt line 13 DMA<4D><41><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>жϵĻ<CFB5> */
//(void)PVD_EXTI_Init(void)
//(void)RTC_EXTI_Init(void)
//(void)DMA_EXTI_Init(void)
/*-=====================================================================================================
//<2F>ⲿ<EFBFBD>жϻص<EFBFBD>
//<2F>ж<EFBFBD>
-=====================================================================================================*/
static exti_irq_callback_t exti_callbacks[EXTI_MAX_LINES] = {NULL};
/**------------------------------------------------------------------------
* @brief ע<EFBFBD><EFBFBD> EXTI <20>ж<EFBFBD><D0B6>ߵĻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param exti_linex: EXTI <20>ߺţ<DFBA><C5A3><EFBFBD> EXTI_LINE_3
* @param exti_irq_callback: <20>û<EFBFBD><C3BB>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>޲<EFBFBD><DEB2><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD>ֵ<EFBFBD><D6B5>
* @note ͬһ EXTI <20><>ֻ<EFBFBD><D6BB>ע<EFBFBD><D7A2>һ<EFBFBD><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>ظ<EFBFBD>ע<EFBFBD><EFBFBD><E1BDAB><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>ߺ<EFBFBD><DFBA>Զ<EFBFBD>ʹ<EFBFBD>ܶ<EFBFBD>Ӧ<EFBFBD><D3A6> NVIC <20>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><20><>
* @example
* void my_exti_callback(void) { ... }
* Exti_register_irq_callback(EXTI_LINE_3, my_exti_callback);
**/
* @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>
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>
if(index >= EXTI_MAX_LINES) return;
if(exti_callbacks[index] != NULL) return;
exti_callbacks[index] = exti_irq_callback;
switch (index) { //<2F><>ȡ EXTI <20>߶<EFBFBD>Ӧ<EFBFBD><D3A6> IRQ <20><>
if (index >= EXTI_MAX_LINES) return;
exti_callbacks[index] = exti_irq_callback;
switch (index) { //<2F><>ȡ EXTI <20>߶<EFBFBD>Ӧ<EFBFBD><D3A6> IRQ <20><>
case 0:
case 1:
NVIC_EnableIRQ(EXTI0_1_IRQn); NVIC_SetPriority(EXTI0_1_IRQn,0);
NVIC_EnableIRQ(EXTI0_1_IRQn);
break;
case 2:
case 3:
NVIC_EnableIRQ(EXTI2_3_IRQn); NVIC_SetPriority(EXTI2_3_IRQn,0);
NVIC_EnableIRQ(EXTI2_3_IRQn);
break;
case 4:
case 5:
case 6:
case 7:
NVIC_EnableIRQ(EXTI4_7_IRQn); NVIC_SetPriority(EXTI4_7_IRQn,0);
NVIC_EnableIRQ(EXTI4_7_IRQn);
break;
case 10:
case 11:
NVIC_EnableIRQ(EXTI10_11_IRQn); NVIC_SetPriority(EXTI10_11_IRQn,0);
break;
case 12:
case 13:
NVIC_EnableIRQ(EXTI12_13_IRQn); NVIC_SetPriority(EXTI12_13_IRQn,0);
break;
default:
// <20><>֧<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD> <20><><EFBFBD><EFBFBD> 8 9
// <20><>֧<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>
break;
}
}
/**------------------------------------------------------------------------
* @brief EXTI0 <20><> EXTI1 <20><><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <20>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD> EXTI0 <20><> EXTI1 <20><><EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**/
void EXTI0_1_IRQHandler(void)
{
// <20><><EFBFBD><EFBFBD> EXTI0 <20><> EXTI1
@@ -160,10 +86,7 @@ void EXTI0_1_IRQHandler(void)
if (exti_callbacks[1]) exti_callbacks[1]();
}
}
/**------------------------------------------------------------------------
* @brief EXTI2 <20><> EXTI3 <20><><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <20>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD> EXTI2 <20><> EXTI3 <20><><EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**/
void EXTI2_3_IRQHandler(void)
{
if (LHL_EXTI_GetPending(EXTI_LINE_2) == SET) {
@@ -175,10 +98,7 @@ void EXTI2_3_IRQHandler(void)
if (exti_callbacks[3]) exti_callbacks[3]();
}
}
/**------------------------------------------------------------------------
* @brief EXTI4 <20><> EXTI7 <20><><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EXTI4~7 <20><><EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**/
void EXTI4_7_IRQHandler(void)
{
for (int i = 4; i <= 7; i++) {
@@ -188,38 +108,4 @@ void EXTI4_7_IRQHandler(void)
if (exti_callbacks[i]) exti_callbacks[i]();
}
}
}
/**------------------------------------------------------------------------
* @brief EXTI10 <20><> EXTI11 <20><><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <20>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD> EXTI10 <20><> EXTI11 <20><><EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**/
void EXTI10_11_IRQHandler(void)
{
// <20><><EFBFBD><EFBFBD> EXTI0 <20><> EXTI1
if (LHL_EXTI_GetPending(EXTI_LINE_10) == SET) {
LHL_EXTI_ClearPending(EXTI_LINE_10);
if (exti_callbacks[10]) exti_callbacks[10]();
}
if (LHL_EXTI_GetPending(EXTI_LINE_11) == SET) {
LHL_EXTI_ClearPending(EXTI_LINE_11);
if (exti_callbacks[11]) exti_callbacks[11]();
}
}
/**------------------------------------------------------------------------
* @brief EXTI12 <20><> EXTI13 <20><><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <20>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD> EXTI12 <20><> EXTI13 <20><><EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**/
void EXTI12_13_IRQHandler(void)
{
// <20><><EFBFBD><EFBFBD> EXTI0 <20><> EXTI1
if (LHL_EXTI_GetPending(EXTI_LINE_12) == SET) {
if (exti_callbacks[12]) exti_callbacks[12]();
LHL_EXTI_ClearPending(EXTI_LINE_12);
}
else if (LHL_EXTI_GetPending(EXTI_LINE_13) == SET) {
LHL_EXTI_ClearPending(EXTI_LINE_13);
if (exti_callbacks[13]) exti_callbacks[13]();
}
}
}