优化中断

This commit is contained in:
2026-05-28 21:55:51 +08:00
parent 9f38c6ea75
commit 0516210c95
8 changed files with 219 additions and 311 deletions
+19 -20
View File
@@ -1,8 +1,8 @@
#include <stddef.h>
#include "Bsp.h"
#define IRQ_NULL ((void *)0)
IRQ_MAP_T IRQ_PERIPH[IRQ_NUM] = {0x00};
IRQ_MAP_T IRQ_PERIPH[IRQ_NUM];
/**
* @brief 中断回调函数初始化为空
@@ -15,19 +15,18 @@ void IrqInit(void)
//设定系统中断组
NVIC_PriorityGroupConfig(NVIC_GROUP_LEVEL);
for (uint8_t i = 0; i < IRQ_NUM; i++) {
IRQ_PERIPH[i].IrqCallback = IRQ_NULL;
IRQ_PERIPH[i].IrqCallback = NULL;
}
}
/**
* @brief 中断回调函数注册
* @note 将外部传入的函数地址关联到INTERRUPT_ST表中
* @param Vector:中断号 void(*Func)(uint32_t):回调函数
* @retval void
*/
void IrqRegister(unsigned int Irq, void(*Func)(void *Param))
{
IRQ_PERIPH[Irq].IrqCallback = Func;
void IrqRegister(unsigned char Irqn,void(*Func)(void *Param)) {
IRQ_PERIPH[Irqn].Irqn = Irqn;
IRQ_PERIPH[Irqn].IrqCallback = Func;
}
/**
@@ -36,7 +35,7 @@ void IrqRegister(unsigned int Irq, void(*Func)(void *Param))
* @param Vector:中断号 NvicPrePriority:主优先级 NvicSubPriority:抢占优先级
* @retval void
*/
void IrqConfig(uint32_t Irq, uint8_t NvicPrePriority, uint8_t NvicSubPriority)
void IrqEnable(uint32_t Irq, uint8_t NvicPrePriority, uint8_t NvicSubPriority)
{
NVIC_InitTypeDef NVIC_InitStructure;
@@ -59,17 +58,17 @@ void IrqDisable(uint32_t Irq)
NVIC_InitStructure.NVIC_IRQChannel = Irq;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
NVIC_Init(&NVIC_InitStructure);
}
void USART1_IRQHandler(void)
{
if (USART_GetFlagStatus(COM0->Periph.UartId, USART_FLAG_ORE) == SET)
{
USART_ClearFlag(COM0->Periph.UartId, USART_FLAG_ORE);
}
if (IRQ_PERIPH[COM0->Periph.Irqn].IrqCallback != IRQ_NULL) {
if (IRQ_PERIPH[COM0->Periph.Irqn].IrqCallback != NULL) {
if (USART_GetFlagStatus(COM0->Periph.UartId, USART_FLAG_ORE) == SET)
{
USART_ClearFlag(COM0->Periph.UartId, USART_FLAG_ORE);
}
IRQ_PERIPH[COM0->Periph.Irqn].IrqCallback(COM0);
}
}
@@ -80,7 +79,7 @@ void USART2_IRQHandler(void)
{
USART_ClearFlag(COM1->Periph.UartId, USART_FLAG_ORE);
}
if (IRQ_PERIPH[COM1->Periph.Irqn].IrqCallback != IRQ_NULL) {
if (IRQ_PERIPH[COM1->Periph.Irqn].IrqCallback != NULL) {
IRQ_PERIPH[COM1->Periph.Irqn].IrqCallback(COM1);
}
}
@@ -91,8 +90,8 @@ void USART3_IRQHandler(void)
{
USART_ClearFlag(COM2->Periph.UartId, USART_FLAG_ORE);
}
if (IRQ_PERIPH[COM2->Periph.Irqn].IrqCallback != IRQ_NULL) {
IRQ_PERIPH[COM2->Periph.Irqn].IrqCallback(COM1);
if (IRQ_PERIPH[COM2->Periph.Irqn].IrqCallback != NULL) {
IRQ_PERIPH[COM2->Periph.Irqn].IrqCallback(COM2);
}
}
@@ -103,7 +102,7 @@ void USART4_IRQHandler(void)
{
USART_ClearFlag(COM3->Periph.UartId, USART_FLAG_ORE);
}
if (IRQ_PERIPH[COM3->Periph.Irqn].IrqCallback != IRQ_NULL) {
if (IRQ_PERIPH[COM3->Periph.Irqn].IrqCallback != NULL) {
IRQ_PERIPH[COM3->Periph.Irqn].IrqCallback(COM3);
}
}
@@ -114,7 +113,7 @@ void USART5_IRQHandler(void)
{
USART_ClearFlag(COM4->Periph.UartId, USART_FLAG_ORE);
}
if (IRQ_PERIPH[COM4->Periph.Irqn].IrqCallback != IRQ_NULL) {
if (IRQ_PERIPH[COM4->Periph.Irqn].IrqCallback != NULL) {
IRQ_PERIPH[COM4->Periph.Irqn].IrqCallback(COM4);
}
}