#include "Bsp.h" INTERRUPT_ST Interrupt[INTERRUPT_NUM]; /** * @brief 中断回调函数初始化为空 * @param void * @retval void * @note 初始化系统中断 * @example void */ void SystemInterruptInit(void) { //设定系统中断组 NVIC_PriorityGroupConfig(NVIC_GROUP_LEVEL); //清空结构体 for (uint8_t i = 0;i < INTERRUPT_NUM;i++) { Interrupt[i].CallBack = NULL; } } /** * @brief 中断回调函数注册 * @param Vector:中断号 void(*Func)(uint32_t):回调函数 * @retval void * @note 将外部传入的函数地址关联到INTERRUPT_ST表中 * @example void */ void InterruptRegister(uint32_t Irqn, void(*Func)(uint32_t)) { Interrupt[Irqn].CallBack = Func; } /** * @brief 中断NVIC配置 * @param Vector:中断号 NvicPrePriority:主优先级 NvicSubPriority:抢占优先级 * @retval void * @note 设定一个中断的优先级 * @example void */ void InterruptSetLevel(uint32_t Vector, uint8_t NvicPrePriority, uint8_t NvicSubPriority) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = Vector; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NvicPrePriority; NVIC_InitStructure.NVIC_IRQChannelSubPriority = NvicSubPriority; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /** * @brief 关闭中断 * @param Vector:中断号 * @retval void * @note void * @example void */ void InterruptDisable(uint32_t Vector) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = Vector; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void USART1_IRQHandler(void) { if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) == SET) { USART_ClearFlag(USART1, USART_FLAG_ORE); } (*Interrupt[USART1_IRQn].CallBack)((uint32_t)USART1); } void USART2_IRQHandler(void) { if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) == SET) { USART_ClearFlag(USART2, USART_FLAG_ORE); } (*Interrupt[USART2_IRQn].CallBack)((uint32_t)USART2); } void USART3_IRQHandler(void) { if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) == SET) { USART_ClearFlag(USART3, USART_FLAG_ORE); } (*Interrupt[USART3_IRQn].CallBack)((uint32_t)USART3); } void USART4_IRQHandler(void) { if (USART_GetFlagStatus(UART4, USART_FLAG_ORE) == SET) { USART_ClearFlag(UART4, USART_FLAG_ORE); } (*Interrupt[UART4_IRQn].CallBack)((uint32_t)UART4); } void USART5_IRQHandler(void) { if (USART_GetFlagStatus(UART5, USART_FLAG_ORE) == SET) { USART_ClearFlag(UART5, USART_FLAG_ORE); } (*Interrupt[UART5_IRQn].CallBack)((uint32_t)UART5); }