发新帖我要提问
12
返回列表
打印
[开发工具]

关于MCC生成的库函数的意思

[复制链接]
楼主: zhaoxqi
手机看帖
扫描二维码
随时随地手机跟帖
21
zhenykun| | 2021-8-13 23:43 | 只看该作者 回帖奖励 |倒序浏览
不明白写这么复杂干什么?

使用特权

评论回复
22
chuxh| | 2021-8-13 23:45 | 只看该作者
设置中断处理函数实际就是给函数指针赋值,指向具体函数

使用特权

评论回复
23
spark周| | 2021-8-13 23:47 | 只看该作者
然后驱动就会在合适的时候调用那个函数

使用特权

评论回复
24
supernan| | 2021-8-13 23:48 | 只看该作者
请问楼主问题解决了吗?我也遇到和你一样的问题了

使用特权

评论回复
25
huangchui| | 2021-8-13 23:50 | 只看该作者
MCC生成有一个默认的中断函数,你可以在里面直接添加自己的代码

使用特权

评论回复
26
wyjie| | 2021-8-13 23:51 | 只看该作者
它所有的中断都是用的指针指向所调用的函数

使用特权

评论回复
27
juventus9554| | 2021-8-13 23:53 | 只看该作者
但是个人感觉也是有点复杂,递归调用了好几层

使用特权

评论回复
28
supernan| | 2021-8-13 23:55 | 只看该作者
我一般直接在主中断函数调用的第一层里添加自己的代码,系统生成的递归的函数直接删除不用。

使用特权

评论回复
29
yszong| | 2021-8-13 23:57 | 只看该作者
比喻上面提到的TMR0_ISR()。直接在里面加自己的函数,然后它所指向的下一层函数以后的函数全部删除了。

使用特权

评论回复
30
zhaoxqi|  楼主 | 2021-8-13 23:58 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
31
klz198327| | 2021-8-17 15:34 | 只看该作者
这个是用到回调函数,用分层管理的时候比较有用,我只会最简单的C~~

使用特权

评论回复
32
奔波儿熊| | 2021-8-18 15:37 | 只看该作者
这是回调函数,好处是你不需要修改MCC生成的代码,直接在main.c里调用就能设置你自定义的中断操作了。

使用特权

评论回复
33
hjl2832| | 2021-8-19 09:02 | 只看该作者
首先,仔细跟踪到中断总函数interrupt_manager.c中看中断影响的函数名称,比喻我的是这样: if(PIE1bits.RCIE == 1 && PIR1bits.RCIF == 1)        {
            EUSART_RxDefaultInterruptHandler();      //调用串口接收中断函数。
        }
        else if(PIE1bits.TMR1IE == 1 && PIR1bits.TMR1IF == 1)
        {
            TMR1_ISR();
        }
        else
        {
            //Unhandled Interrupt
        }

然后,在UART.c中查看上面红字中断入口函数的定义:
void EUSART_SetRxInterruptHandler(void (* interruptHandler)(void)){
    EUSART_RxDefaultInterruptHandler = interruptHandler;
}

这里定义默认中断函数入口名称,是不是与上面名称对应了?
然后再看uartinit函数里初始化中断函数赋值:
void EUSART_Initialize(void)
{
    // disable interrupts before changing states
    PIE1bits.RCIE = 0;
    EUSART_SetRxInterruptHandler(EUSART_Receive_ISR);   //在这里递归赋值命名接收中断函数的名称为“EUSART_Receive_ISR”。即EUSART_RxDefaultInterruptHandler = EUSART_Receive_ISR。

    // Set the EUSART module to the options selected in the user interface.

    // ABDOVF no_overflow; SCKP Non-Inverted; BRG16 16bit_generator; WUE enabled; ABDEN disabled;
    BAUD1CON = 0x0A;

    // SPEN enabled; RX9 8-bit; CREN enabled; ADDEN disabled; SREN disabled;
    RC1STA = 0x90;

    // TX9 8-bit; TX9D 0; SENDB sync_break_complete; TXEN enabled; SYNC asynchronous; BRGH hi_speed; CSRC slave;
    TX1STA = 0x24;

    // SP1BRGL 103;
    SP1BRGL = 0x67;

    // SP1BRGH 0;
    SP1BRGH = 0x00;


    EUSART_SetFramingErrorHandler(EUSART_DefaultFramingErrorHandler);
    EUSART_SetOverrunErrorHandler(EUSART_DefaultOverrunErrorHandler);
    EUSART_SetErrorHandler(EUSART_DefaultErrorHandler);

    RxLastError.status = 0;

    // initializing the driver state
    TxHead = 0;
    TxTail = 0;
    TxBufferRemaining = sizeof(TxBuffer);

    RxHead = 0;
    RxTail = 0;
    RxCount = 0;

    // enable receive interrupt
    PIE1bits.RCIE = 1;
}

然后在接收中断中处理中断状态:
void EUSART_Receive_ISR(void)
{   
    RxStatusBuffer[RxHead].status = 0;

    if(RC1STAbits.FERR){
        RxStatusBuffer[RxHead].ferr = 1;
        EUSART_FramingErrorHandler();    //错误?
    }

    if(RC1STAbits.OERR){
        RxStatusBuffer[RxHead].oerr = 1;
        EUSART_OverrunErrorHandler();    // 溢出错误?
    }

    if(RxStatusBuffer[RxHead].status){
        EUSART_ErrorHandler();      // 接收错误?跳转错误处理。
    } else {
       EUSART_RxDataHandler();   // 如果正常?则接收数据。
    }
    // or set custom function using EUSART_SetRxInterruptHandler()
}

看到这,就知道了,实际跳转的接收中断函数名称是EUSART_RxDataHandler();所以,个人代码实际是在EUSART_RxDataHandler这个函数这里添加。


使用特权

评论回复
34
WESTBR00K| | 2021-8-20 20:02 | 只看该作者
hjl2832 发表于 2021-8-19 09:02
首先,仔细跟踪到中断总函数interrupt_manager.c中看中断影响的函数名称,比喻我的是这样: if(PIE1bits.RC ...

学习了,厉害。

使用特权

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

本版积分规则