打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、 主体不同

  1. 内部中断:断是一个算法指令,是由软中断指令启动的中断。

  2. 外部中断:是单片机实时地处理外部事件的一种内部机制。

二、机制不同

  1. 内部中断:执行除法指令时,出现除数为0或商超过寄存器所能表达的范围,则产生类型为0 的内部中断。是优先级最高的内部中断。

  2. 外部中断:当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去。

/********************************************************************************
* @file    bsp_exti.c
* @author  jianqiang.xue
* @version V1.0.0
* @date    2021-04-09
* @brief   NULL
********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

#include "RTE_Components.h"
#include CMSIS_device_header

#include "cx32l003_hal_def.h"
#include "cx32l003_hal_conf.h"

#include "sys_api.h"
/* Private Includes ----------------------------------------------------------*/

/* Private Define ------------------------------------------------------------*/
/* Private Variables ---------------------------------------------------------*/
bool bsp_exti_init = false;

typedef void(*bsp_gpio_exti_callback)(void *gpiox, uint16_t gpio_pin);
static bsp_gpio_exti_callback g_irq_callback;
/* Public Function Prototypes ------------------------------------------------*/

void HAL_GPIO_EXTI_Callback(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
    if (g_irq_callback)
    {
        g_irq_callback(GPIOx, GPIO_Pin);
    }
}

/**
 * @brief  设置外部中断NVIC
 * @note   NULL
 * @param  irqn: 中断号(在typedef enum IRQn中,例如:USART1_IRQn)
 * @param  priority: 中断优先级
 * @retval None
 */
void bsp_exit_set(uint8_t irqn, uint32_t priority)
{
    bsp_exti_init = true;
    HAL_NVIC_SetPriority((IRQn_Type)(irqn), priority);
    HAL_NVIC_EnableIRQ((IRQn_Type)(irqn));
}

/**
 * @brief  清除外部中断设置
 * @note   NULL
 * @param  irqn: 中断号(在typedef enum IRQn中,例如:USART1_IRQn)
 * @retval None
 */
void bsp_exit_clear_set(uint8_t irqn)
{
    HAL_NVIC_DisableIRQ((IRQn_Type)(irqn));
}

/**
 * @brief  清除外部中断标志位
 * @note   NULL
 * @param  *gpiox: 预留
 * @param  pin: 引脚号
 * @retval None
 */
void bsp_exit_clear_flag(void *gpiox, uint8_t pin)
{
    GPIO_TypeDef *gpiox_t = gpiox;

    __HAL_GPIO_EXTI_CLEAR_FLAG(gpiox_t, pin);
}

/**
 * @brief  注册外部中事件回调函数
 * @note   NULL
 * @param  *event: 事件函数
 * @retval None
 */
bool bsp_gpio_exit_irq_register_callback(void *event)
{
    if (g_irq_callback != NULL)
    {
        return false;
    }
    else
    {
        g_irq_callback = (bsp_gpio_exti_callback)event;
    }
    return true;
}

/********************************************************************************
* @file    bsp_exti.h
* @author  jianqiang.xue
* @version V1.0.0
* @date    2021-04-09
* @brief   NULL
********************************************************************************/

#ifndef __BSP_EXTI_H
#define __BSP_EXTI_H

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>

/* Public Function Prototypes ------------------------------------------------*/

void bsp_exit_set(uint8_t irqn, uint32_t priority);
void bsp_exit_clear_set(uint8_t irqn);
void bsp_exit_clear_flag(void *gpiox, uint8_t pin);

// 引脚外部中断回调

bool bsp_gpio_exit_irq_register_callback(void *event);

#endif

posted on 2022-08-13 11:00  xuejianqiang  阅读(40)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033