发新帖我要提问
12
返回列表
打印
[牛人杂谈]

NUC970(ARM9)裸机串口驱动与中断控制器AIC

[复制链接]
楼主: zljiu
手机看帖
扫描二维码
随时随地手机跟帖
21
zljiu|  楼主 | 2021-6-6 10:51 | 只看该作者 回帖奖励 |倒序浏览
本帖最后由 zljiu 于 2021-6-6 10:52 编辑

//UART.h

/*************************************************************************************************************
* 文件名:                        uart.h
* 功能:                        NUC970 UART通讯支持
* 作者:                        cp1300@139.com
* 创建时间:                2020-08-29
* 最后修改时间:        2020-08-29
* 详细:                        串口通信底层支持
*************************************************************************************************************/
#ifndef _UART_H_  
#define _UART_H_
#include "nuc970_system.h"

/***********************配置相关************************/
#define UART_TX_TO_FIFI        1                        //1:数据发送到发送FIFO则认为发送完成; 0:数据从移位寄存器发送完成则认为发送完成
#define UART_ChMax                11                        //串口通道数量
#define UART_INT_PRIO        3                        //中断优先级,1-7

/*********************************************************/



//串口选择,串口1开始,到串口3
typedef enum
{
        UART_CH0        =                0,        //UART0
        UART_CH1        =                1,        //UART1-高速
        UART_CH2        =                2,        //UART2-高速
        UART_CH3        =                3,        //UART3
        UART_CH4        =                4,        //UART4-高速
        UART_CH5        =                5,        //UART5
        UART_CH6        =                6,        //UART6-高速
        UART_CH7        =                7,        //UART7
        UART_CH8        =                8,        //UART8-高速
        UART_CH9        =                9,        //UART9
        UART_CH10        =                10,        //UART10
}UART_CH_Type;


//UART配置相关结构定义
typedef struct
{
        u8 OddEvenVerify;        //奇偶校验,奇,偶,无
        u8 StopBitWidth;        //停止位位宽1,2
        u8 DataBitWidth;        //数据位宽度
} UART_Config_TypeDef;


//奇偶校验
#define UART_VERIFY_NULL        0        //无校验
#define UART_ODD                        1        //奇校验
#define UART_EVEN                        2        //偶校验
//停止位
#define UART_STOP_1BIT                0        //一个停止位
#define UART_STOP_2BIT                1        //2个停止位
//数据位数
#define UART_DATA_5BIT                0        //5位数据长度
#define UART_DATA_6BIT                1        //6位数据长度
#define UART_DATA_7BIT                2        //7位数据长度
#define UART_DATA_8BIT                3        //8位数据长度

//相关API
bool UARTx_Init(UART_CH_Type ch,u32 Speed, bool isEnableRx);                //串口初始化
void UARTx_SendByte(UART_CH_Type ch,u8 data);                                                //UART单字节发送
void UARTx_SendData(UART_CH_Type ch,u8 *pTxBuff,u16 DataLen);                //UART数据发送函数
void UARTx_WaitSendComplete(UART_CH_Type ch);                                                //等待数据发送完成-从串口发送完成
void UARTx_SendString(UART_CH_Type ch,char *pString);                                //UART发送字符串
bool UARTx_GetNewDataFlag(UART_CH_Type ch);                                                        //获取串口新数据标志
bool UARTx_GetRxBuffFullFlag(UART_CH_Type ch);                                                //获取串口接收缓冲区满标志
u8          UARTx_GetNewData(UART_CH_Type ch);                                                                //获取串口新数据
void UARTx_SetRxBuff(UART_CH_Type ch,u8 *RxBuff,u16 RxBuffSize);        //设置串口接收缓冲区
void UARTx_ClearRxInt(UART_CH_Type ch);                                                                //清除串口接收中断标志
u32  UARTx_GetRxCnt(UART_CH_Type ch);                                                                //获取串口接收数据计数器
void UARTx_ClearRxCnt(UART_CH_Type ch);                                                                //清除串口接收数据计数器

#endif //_UART_H_


使用特权

评论回复
22
zljiu|  楼主 | 2021-6-6 10:53 | 只看该作者
//AIC中断控制器

/*************************************************************************************************************
* 文件名:                        irq_aic.c
* 功能:                        NUC970 中断控制器
* 作者:                        cp1300@139.com
* 创建时间:                2020-08-30
* 最后修改时间:        2020-08-30
* 详细:                        中断控制器驱动
*************************************************************************************************************/
#include "nuc970_system.h"
#include "irq_aic.h"
#include "typedef.h"

static void NULL_IRQHandler(void){};                                //一个空的中断服务程序
static void *sg_IRQHandlerTable[NUMBER_OF_INT_VECTORS];             //中断服务程序入口列表
static bool sg_AIC_InitStatus = FALSE;                                                                //AIC初始化状态,防止重复初始化
       

/*************************************************************************************************************************
* 函数                        :        void AIC_Init(void)
* 功能                        :        AIC中断控制器初始化(在系统初始化中调用,请勿重复调用)
* 参数                        :        无
* 返回                        :        无
* 依赖                        :        底层
* 作者                        :        cp1300@139.com
* 时间                        :        2020-08-30
* 最后修改时间         :         2020-08-30
* 说明                        :        初始化屏蔽所有中断,设置所有中断优先级为最低,并初始化所有中断服务程序入口
                                        请不要重复初始化
*************************************************************************************************************************/
void AIC_Init(void)
{
        u32 i;
       
        if(sg_AIC_InitStatus == TRUE)        return;
        for(i = 0;i < NUMBER_OF_INT_VECTORS;i ++)
        {
                sg_IRQHandlerTable = NULL_IRQHandler;                                //设置默认的中断函数
                AIC_ClearIrqActive((AIC_IRQ_Typedef) i);                                //AIC软件中断激活状态清除
                AIC_IrqEnable((AIC_IRQ_Typedef)i, FALSE);                                //设置一个中断使能状态-关闭
                AIC_SetIrqTriggered((AIC_IRQ_Typedef)i, AIC_LOW_LEVEL);        //设置一个中断触发方式-低电平触发
                AIC_SetIrqPriority((AIC_IRQ_Typedef)i, 7);                                //设置一个中断优先级-最低优先级
        }
        sg_AIC_InitStatus = TRUE;                                                                        //已经初始化了
        AIC->EOSCR = 1;                //写入任何值,告诉AIC中断执行完毕了,防止之前有未退出的中断
}



使用特权

评论回复
23
zljiu|  楼主 | 2021-6-6 10:54 | 只看该作者
/*************************************************************************************************************************
* 函数                        :        void AIC_RegisterIRQHandler(AIC_IRQ_Typedef AIC_IRQ_n, void (*pIRQHandler)(void))
* 功能                        :        注册中断服务程序
* 参数                        :        AIC_IRQ_n:中断源;pIRQHandler:中断服务程序
* 返回                        :        无
* 依赖                        :        底层
* 作者                        :        cp1300@139.com
* 时间                        :        2020-08-30
* 最后修改时间         :         2020-08-30
* 说明                        :       
*************************************************************************************************************************/
void AIC_RegisterIRQHandler(AIC_IRQ_Typedef AIC_IRQ_n, void (*pIRQHandler)(void))
{
    if(AIC_IRQ_n >= NUMBER_OF_INT_VECTORS) return;
    if(pIRQHandler == NULL) //无效的,则使用默认的替代,防止为空
    {
        sg_IRQHandlerTable[AIC_IRQ_n] = (void *)NULL_IRQHandler;
    }
    else
    {
        sg_IRQHandlerTable[AIC_IRQ_n] = (void *)pIRQHandler;
    }
}



使用特权

评论回复
24
zljiu|  楼主 | 2021-6-6 10:55 | 只看该作者
/*************************************************************************************************************************
* 函数                        :        void AIC_SetIrqTriggered(AIC_IRQ_Typedef AIC_IRQ_n, AIC_IntType AIC_INT_Triggered)
* 功能                        :        设置一个中断触发方式
* 参数                        :        AIC_IRQ_n:中断源;AIC_INT_Triggered:触发方式,见AIC_IntType
* 返回                        :        无
* 依赖                        :        底层
* 作者                        :        cp1300@139.com
* 时间                        :        2020-08-30
* 最后修改时间         :         2020-08-30
* 说明                        :       
*************************************************************************************************************************/
void AIC_SetIrqTriggered(AIC_IRQ_Typedef AIC_IRQ_n, AIC_IntType AIC_INT_Triggered)
{
        u8 n,i;
        u32 temp;
       
        if(AIC_IRQ_n >= NUMBER_OF_INT_VECTORS) return;
        n = AIC_IRQ_n / 4;
        i = AIC_IRQ_n % 4;

        temp = AIC->SCR[n];
        temp &= ~(0x03 << (i*8 + 6));                                                        //清除之前配置
        temp |= (AIC_INT_Triggered & 0x03) << (i*8 + 6);                //重新配置
        AIC->SCR[n] = temp;
}



使用特权

评论回复
25
zljiu|  楼主 | 2021-6-6 10:56 | 只看该作者

/*************************************************************************************************************************
* 函数                        :        void AIC_SetIrqPriority(AIC_IRQ_Typedef AIC_IRQ_n, u8 AIC_INT_Prio)
* 功能                        :        设置一个中断优先级
* 参数                        :        AIC_IRQ_n:中断源;AIC_INT_Prio:优先级0-7
* 返回                        :        无
* 依赖                        :        底层
* 作者                        :        cp1300@139.com
* 时间                        :        2020-08-30
* 最后修改时间         :         2020-08-30
* 说明                        :        优先级0会变为快速中断
*************************************************************************************************************************/
void AIC_SetIrqPriority(AIC_IRQ_Typedef AIC_IRQ_n, u8 AIC_INT_Prio)
{
        u8 n,i;
        u32 temp;

        if(AIC_IRQ_n >= NUMBER_OF_INT_VECTORS) return;
        n = AIC_IRQ_n / 4;
        i = AIC_IRQ_n % 4;
       
        if(AIC_INT_Prio > 7) AIC_INT_Prio = 7;                                        //优先级限制最低为7
        temp = AIC->SCR[n];
        temp &= ~(0x07 << (i*8 + 0));                                                        //清除之前配置
        temp |= (AIC_INT_Prio & 0x07) << (i*8 + 0);                                //重新配置
        AIC->SCR[n] = temp;
}



使用特权

评论回复
26
zljiu|  楼主 | 2021-6-6 10:57 | 只看该作者
/*************************************************************************************************************************
* 函数                        :        bool AIC_GetIrqRawStatus(AIC_IRQ_Typedef AIC_IRQ_n)
* 功能                        :        获取中断原始触发状态
* 参数                        :        AIC_IRQ_n:中断源
* 返回                        :        TRUE:中断已经触发;FALSE:中断未触发
* 依赖                        :        底层
* 作者                        :        cp1300@139.com
* 时间                        :        2020-08-30
* 最后修改时间         :         2020-08-30
* 说明                        :        获取的是每个中断通道内的内部状态,不受中断屏蔽影响
*************************************************************************************************************************/
bool AIC_GetIrqRawStatus(AIC_IRQ_Typedef AIC_IRQ_n)
{
        if(AIC_IRQ_n >= NUMBER_OF_INT_VECTORS) return FALSE;
        if(AIC->IRSR[AIC_IRQ_n/32] & (1 << (AIC_IRQ_n%32)))
        {
                return TRUE;
        }
        else
        {
                return FALSE;
        }
}



使用特权

评论回复
27
zljiu|  楼主 | 2021-6-6 10:58 | 只看该作者
/*************************************************************************************************************************
* 函数                        :        bool AIC_GetIrqActiveStatus(AIC_IRQ_Typedef AIC_IRQ_n)
* 功能                        :        获取中断活动状态
* 参数                        :        AIC_IRQ_n:中断源
* 返回                        :        TRUE:中断已经激活;FALSE:中断未激活
* 依赖                        :        底层
* 作者                        :        cp1300@139.com
* 时间                        :        2020-08-30
* 最后修改时间         :         2020-08-30
* 说明                        :        不受中断屏蔽影响
*************************************************************************************************************************/
bool AIC_GetIrqActiveStatus(AIC_IRQ_Typedef AIC_IRQ_n)
{
        if(AIC_IRQ_n >= NUMBER_OF_INT_VECTORS) return FALSE;
        if(AIC->IASR[AIC_IRQ_n/32] & (1 << (AIC_IRQ_n%32)))
        {
                return TRUE;
        }
        else
        {
                return FALSE;
        }
}



使用特权

评论回复
28
zljiu|  楼主 | 2021-6-6 10:59 | 只看该作者
/*************************************************************************************************************************
* 函数                        :        bool AIC_GetIrqStatus(AIC_IRQ_Typedef AIC_IRQ_n)
* 功能                        :        获取中断状态(中断使能并有效的状态)
* 参数                        :        AIC_IRQ_n:中断源
* 返回                        :        TRUE:中断有效;FALSE:中断无效
* 依赖                        :        底层
* 作者                        :        cp1300@139.com
* 时间                        :        2020-08-30
* 最后修改时间         :         2020-08-30
* 说明                        :        会受到中断屏蔽影响
*************************************************************************************************************************/
bool AIC_GetIrqStatus(AIC_IRQ_Typedef AIC_IRQ_n)
{
        if(AIC_IRQ_n >= NUMBER_OF_INT_VECTORS) return FALSE;
        if(AIC->ISR[AIC_IRQ_n/32] & (1 << (AIC_IRQ_n%32)))
        {
                return TRUE;
        }
        else
        {
                return FALSE;
        }
}



使用特权

评论回复
29
zljiu|  楼主 | 2021-6-6 11:00 | 只看该作者
/*************************************************************************************************************************
* 函数                        :        u8 AIC_GetThisIntIRQorFIQ(void)
* 功能                        :        获取当前的中断是IRQ还是FIQ
* 参数                        :        无
* 返回                        :        0:无中断;1:IRQ;2:FIQ
* 依赖                        :        底层
* 作者                        :        cp1300@139.com
* 时间                        :        2020-08-30
* 最后修改时间         :         2020-08-30
* 说明                        :       
*************************************************************************************************************************/
u8 AIC_GetThisIntIRQorFIQ(void)
{
        if(AIC->OISR & BIT1) return 1;
        else if(AIC->OISR & BIT0) return 2;
        else return 0;
}



使用特权

评论回复
30
zljiu|  楼主 | 2021-6-6 11:01 | 只看该作者

/*************************************************************************************************************************
* 函数                        :        bool AIC_GetIrqEnableStatus(AIC_IRQ_Typedef AIC_IRQ_n)
* 功能                        :        获取中断使能状态
* 参数                        :        AIC_IRQ_n:中断源
* 返回                        :        TRUE:中断使能;FALSE:中断关闭
* 依赖                        :        底层
* 作者                        :        cp1300@139.com
* 时间                        :        2020-08-30
* 最后修改时间         :         2020-08-30
* 说明                        :        获取对应中断开关状态
*************************************************************************************************************************/
bool AIC_GetIrqEnableStatus(AIC_IRQ_Typedef AIC_IRQ_n)
{
        if(AIC_IRQ_n >= NUMBER_OF_INT_VECTORS) return FALSE;
        if(AIC->IMR[AIC_IRQ_n/32] & (1 << (AIC_IRQ_n%32)))
        {
                return TRUE;
        }
        else
        {
                return FALSE;
        }
}



使用特权

评论回复
31
zljiu|  楼主 | 2021-6-6 11:02 | 只看该作者

/*************************************************************************************************************************
* 函数                        :        void AIC_IrqEnable(AIC_IRQ_Typedef AIC_IRQ_n, bool isEnable)
* 功能                        :        设置一个中断使能状态
* 参数                        :        AIC_IRQ_n:中断源;isEnable:是否使能中断
* 返回                        :        无
* 依赖                        :        底层
* 作者                        :        cp1300@139.com
* 时间                        :        2020-08-30
* 最后修改时间         :         2020-08-30
* 说明                        :       
*************************************************************************************************************************/
void AIC_IrqEnable(AIC_IRQ_Typedef AIC_IRQ_n, bool isEnable)
{
        if(AIC_IRQ_n >= NUMBER_OF_INT_VECTORS) return;
        if(isEnable)        //使能对应中断
        {
                AIC->MECR[AIC_IRQ_n/32] = 1 << (AIC_IRQ_n%32);        //写1开启对应中断
        }
        else //关闭对应中断
        {
                AIC->MDCR[AIC_IRQ_n/32] = 1 << (AIC_IRQ_n%32);        //写1关闭对应中断
        }
}



使用特权

评论回复
32
zljiu|  楼主 | 2021-6-6 11:03 | 只看该作者
/*************************************************************************************************************************
*函数                :        void AIC_SetIrqActive(AIC_IRQ_Typedef AIC_IRQ_n)
*功能                :        AIC中断设置为激活状态(软件触发某个中断)
*参数                :        AIC_IRQ_n:中断源
*返回                :        无
*依赖                        :         底层宏定义
*作者               :        cp1300@139.com
*时间                     :        2020-08-30
*最后修改时间        :        2020-08-30
*说明                :        相当于软件触发某个中断
*************************************************************************************************************************/
void AIC_SetIrqActive(AIC_IRQ_Typedef AIC_IRQ_n)
{
        if(AIC_IRQ_n >= NUMBER_OF_INT_VECTORS) return;
        AIC->SSCR[AIC_IRQ_n/32] = 1 << (AIC_IRQ_n%32);        //写1软件触发对应中断
}



使用特权

评论回复
33
zljiu|  楼主 | 2021-6-6 11:04 | 只看该作者

/*************************************************************************************************************************
*函数                :        void AIC_ClearIrqActive(AIC_IRQ_Typedef AIC_IRQ_n)
*功能                :        AIC软件中断激活状态清除
*参数                :        V3S_IRQ_n:中断编号
*返回                :        无
*依赖                        :         底层宏定义
*作者               :        cp1300@139.com
*时间                     :        2020-08-30
*最后修改时间        :        2020-08-30
*说明                :        相当于清除1个已经触发软件中断的状态
*************************************************************************************************************************/
void AIC_ClearIrqActive(AIC_IRQ_Typedef AIC_IRQ_n)
{
        if(AIC_IRQ_n >= NUMBER_OF_INT_VECTORS) return;
        AIC->SCCR[AIC_IRQ_n/32] = 1 << (AIC_IRQ_n%32);        //写1清除软件触发对应中断
}



使用特权

评论回复
34
zljiu|  楼主 | 2021-6-6 11:04 | 只看该作者
#if(UCOS_II_EN) //使能了操作系统

#else
/*************************************************************************************************************************
* 函数                        :        void SystemIrqHandler(void)
* 功能                        :        系统中断处理(无操作系统接口)
* 参数                        :        无
* 返回                        :        无
* 依赖                        :        需要在中断程序汇编中编写保护现场,并调用
* 作者                        :        cp1300@139.com
* 时间                        :        2020-08-21
* 最后修改时间         :         2020-08-21
* 说明                        :        用于非OS情况下调用,会直接在startup.s中调用
*************************************************************************************************************************/
void SystemIrqHandler(void)
{
        u32 mISNR;       
        u32 intNum;

        mISNR = AIC->IPER;        //需要先读取IPER,否则ISNR可能没更新,IPER的值>>2位是等于ISNR的,必须先读取IPRE
        mISNR >>= 2;
        //mISNR = AIC->ISNR;        //这个寄存器只能读取一次,下次读取会被清零的,ISNR有时候没有及时更新
        intNum = mISNR & 0X3F;
        if ((intNum == 0) || (intNum>=NUMBER_OF_INT_VECTORS))   
        {
                AIC->EOSCR = 1;        //写入任何值,告诉AIC中断执行完毕了
                return;
        }
        //执行中断服务程序
        ((void (*)(void)) sg_IRQHandlerTable[intNum])();     //执行中断服务程序
        AIC->EOSCR = 1;                //写入任何值,告诉AIC中断执行完毕了
}

#endif //UCOS_II_EN


使用特权

评论回复
35
zljiu|  楼主 | 2021-6-6 11:07 | 只看该作者

/*************************************************************************************************************
* 文件名:                        irq_aic.h
* 功能:                        NUC970 中断控制器
* 作者:                        cp1300@139.com
* 创建时间:                2020-08-30
* 最后修改时间:        2020-08-30
* 详细:                        中断控制器驱动
*************************************************************************************************************/
#ifndef _IRQ_AIC_H_  
#define _IRQ_AIC_H_
#include "nuc970_system.h"



//中断源
typedef enum
{
        AIC_NULL_INT        =        0,                        //无效的中断
        AIC_WDT_INT                =        1,                        //Watch Dog Timer Interrupt
        AIC_WWDT_INT        =        2,                        //Windowed-WDT Interrupt
        AIC_LVD_INT                =        3,                        //Low Voltage Detect Interrupt
        AIC_EXT0_INT        =        4,                        //外部中断0
        AIC_EXT1_INT        =        5,                        //外部中断1
        AIC_EXT2_INT        =        6,                        //外部中断2
        AIC_EXT3_INT        =        7,                        //外部中断3
        AIC_EXT4_INT        =        8,                        //外部中断4
        AIC_EXT5_INT        =        9,                        //外部中断5
        AIC_EXT6_INT        =        10,                        //外部中断6
        AIC_EXT7_INT        =        11,                        //外部中断7
        AIC_ACTL_INT        =        12,                        //Audio Controller Interrupt
        AIC_LCD_INT                =        13,                        //LCD Controller Interrupt
        AIC_CAP_INT                =        14,                        //Sensor Interface Controller Interrupt
        AIC_RTC_INT                =        15,                        //RTC Interrupt
        AIC_TMR0_INT        =        16,                        //Timer 0 Interrupt
        AIC_TMR1_INT        =        17,                        //Timer 1 Interrupt
        AIC_ADC_INT                =        18,                        //ADC Interrupt
        AIC_EMC0_RX_INT        =        19,                        //EMC 0 RX Interrupt
        AIC_EMC1_RX_INT        =        20,                        //EMC 1 RX Interrupt
        AIC_EMC0_TX_INT        =        21,                        //EMC 0 TX Interrupt
        AIC_EMC1_TX_INT        =        22,                        //EMC 1 TX Interrupt
        AIC_EHCI_INT        =        23,                        //USB 2.0 Host Controller Interrupt
        AIC_OHCI_INT        =        24,                        //USB 1.1 Host Controller Interrupt
        AIC_GDMA0_INT        =        25,                        //GDMA Channel 0 Interrupt
        AIC_GDMA1_INT        =        26,                        //GDMA Channel 1 Interrupt
        AIC_SDH_INT                =        27,                        //SD/SDIO Host Interrupt
        AIC_SIC_INT                =        28,                        //SIC Interrupt
        AIC_UDC_INT                =        29,                        //USB Device Controller Interrupt
        AIC_TMR2_INT        =        30,                        //Timer 2 Interrupt
        AIC_TMR3_INT        =        31,                        //Timer 3 Interrupt
        AIC_TMR4_INT        =        32,                        //Timer 4 Interrupt
        AIC_JPEG_INT        =        33,                        //JPEG Engine Interrupt
        AIC_GE2D_INT        =        34,                        //2D Graphic Engine Interrupt
        AIC_CRYPTO_INT        =        35,                        //CRYPTO Engine Interrupt
        AIC_UART0_INT        =        36,                        //UART 0 Interrupt
        AIC_UART1_INT        =        37,                        //UART 1 Interrupt
        AIC_UART2_INT        =        38,                        //UART 2 Interrupt
        AIC_UART4_INT        =        39,                        //UART 4 Interrupt
        AIC_UART6_INT        =        40,                        //UART 6 Interrupt
        AIC_UART8_INT        =        41,                        //UART 8 Interrupt
        AIC_UART10_INT        =        42,                        //UART 10 Interrupt
        AIC_UART3_INT        =        43,                        //UART 3 Interrupt
        AIC_UART5_INT        =        44,                        //UART 5 Interrupt
        AIC_UART7_INT        =        45,                        //UART 7 Interrupt
        AIC_UART9_INT        =        46,                        //UART 9 Interrupt
        AIC_ETMR0_INT        =        47,                        //Enhanced Timer 0 Interrupt
        AIC_ETMR1_INT        =        48,                        //Enhanced Timer 1 Interrupt
        AIC_ETMR2_INT        =        49,                        //Enhanced Timer 2 Interrupt
        AIC_ETMR3_INT        =        50,                        //Enhanced Timer 3 Interrupt
        AIC_USI0_INT        =        51,                        //USI 0 Interrupt
        AIC_USI1_INT        =        52,                        //USI 1 Interrupt
        AIC_I2C0_INT        =        53,                        //I2C 0 Interrupt
        AIC_I2C1_INT        =        54,                        //I2C 1 Interrupt
        AIC_SMC0_INT        =        55,                        //SmartCard 0 Interrupt
        AIC_SMC1_INT        =        56,                        //SmartCard 1 Interrupt
        AIC_GPIO_INT        =        57,                        //GPIO Interrupt
        AIC_CAN0_INT        =        58,                        //CAN 0 Interrupt
        AIC_CAN1_INT        =        59,                        //CAN 1 Interrupt
        AIC_PWM_INT                =        60,                        //PWM Interrupt
        AIC_KPI_INT                =        61,                        //KPI Interrupt
}AIC_IRQ_Typedef;
#define NUMBER_OF_INT_VECTORS   62       //中断数量


//中断类型
typedef enum
{
        AIC_LOW_LEVEL        =        0,        //低电平触发-注意:电平触发的中断会被自动清除,电平消失后就没了
        AIC_HIGHT_LEVEL        =        1,        //高电平触发-注意:电平触发的中断会被自动清除,电平消失后就没了
        AIC_LOW_EDGE        =        2,        //下降沿触发
        AIC_HIGHT_EDGE        =        3,        //上升沿触发
}AIC_IntType;

//相关API
void AIC_Init(void);                                                                                                                                //AIC中断控制器初始化(在系统初始化中调用,请勿重复调用)
void AIC_RegisterIRQHandler(AIC_IRQ_Typedef AIC_IRQ_n, void (*pIRQHandler)(void));        //注册中断服务程序
void AIC_IrqEnable(AIC_IRQ_Typedef AIC_IRQ_n, bool isEnable);                                                //设置一个中断使能状态
void AIC_SetIrqTriggered(AIC_IRQ_Typedef AIC_IRQ_n, AIC_IntType AIC_INT_Triggered);        //设置一个中断触发方式
void AIC_SetIrqPriority(AIC_IRQ_Typedef AIC_IRQ_n, u8 AIC_INT_Prio);                                //设置一个中断优先级
bool AIC_GetIrqRawStatus(AIC_IRQ_Typedef AIC_IRQ_n);                                                                //获取中断原始触发状态
bool AIC_GetIrqActiveStatus(AIC_IRQ_Typedef AIC_IRQ_n);                                                                //获取中断活动状态
bool AIC_GetIrqStatus(AIC_IRQ_Typedef AIC_IRQ_n);                                                                        //获取中断状态(中断使能并有效的状态)
u8 AIC_GetThisIntIRQorFIQ(void);                                                                                                        //获取当前的中断是IRQ还是FIQ
bool AIC_GetIrqEnableStatus(AIC_IRQ_Typedef AIC_IRQ_n);                                                                //获取中断使能状态
void AIC_SetIrqActive(AIC_IRQ_Typedef AIC_IRQ_n);                                                                        //AIC中断设置为激活状态(软件触发某个中断)
void AIC_ClearIrqActive(AIC_IRQ_Typedef AIC_IRQ_n);                                                                        //AIC软件中断激活状态清除


#endif //_IRQ_AIC_H_



使用特权

评论回复
36
zljiu|  楼主 | 2021-6-6 11:10 | 只看该作者
//测试代码

static u8 buff[1024];
u32 cnt1=0,cnt2 = 0;

UARTx_Init(UART_CH0, 115200, TRUE);                        //串口初始化
UARTx_SetRxBuff(UART_CH0, (u8 *)buff, 1024-1);
        SYS_EnableIrq();        //使能系统总中断
        while(1)
        {
                cnt1 = UARTx_GetRxCnt(UART_CH0);
                SYS_DelayMS(10);
                GPIOB->DATAOUT &= ~BIT1;
                cnt2 = UARTx_GetRxCnt(UART_CH0);
                if(cnt2 > 0 && cnt1 == cnt2)
                {
            //uart_printf("接收数据长度:%d\r\n", cnt1);
                        UARTx_SendData(UART_CH0, (u8 *)buff, cnt2);
                        UARTx_ClearRxCnt(UART_CH0);
                }
                SYS_DelayMS(20);
               
                GPIOB->DATAOUT |= BIT1;
               
        }


使用特权

评论回复
37
734774645| | 2021-6-6 21:36 | 只看该作者
这个太高级了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则