[开发工具] 关于MCC生成的库函数的意思

[复制链接]
4759|40
zhenykun 发表于 2021-8-13 23:43 | 显示全部楼层
不明白写这么复杂干什么?
chuxh 发表于 2021-8-13 23:45 | 显示全部楼层
设置中断处理函数实际就是给函数指针赋值,指向具体函数
spark周 发表于 2021-8-13 23:47 | 显示全部楼层
然后驱动就会在合适的时候调用那个函数
supernan 发表于 2021-8-13 23:48 | 显示全部楼层
请问楼主问题解决了吗?我也遇到和你一样的问题了
huangchui 发表于 2021-8-13 23:50 | 显示全部楼层
MCC生成有一个默认的中断函数,你可以在里面直接添加自己的代码
wyjie 发表于 2021-8-13 23:51 | 显示全部楼层
它所有的中断都是用的指针指向所调用的函数
juventus9554 发表于 2021-8-13 23:53 | 显示全部楼层
但是个人感觉也是有点复杂,递归调用了好几层
supernan 发表于 2021-8-13 23:55 | 显示全部楼层
我一般直接在主中断函数调用的第一层里添加自己的代码,系统生成的递归的函数直接删除不用。
yszong 发表于 2021-8-13 23:57 | 显示全部楼层
比喻上面提到的TMR0_ISR()。直接在里面加自己的函数,然后它所指向的下一层函数以后的函数全部删除了。
 楼主| zhaoxqi 发表于 2021-8-13 23:58 | 显示全部楼层

嗯,我再好好缕一缕吧,有了好消息及时通知大家
klz198327 发表于 2021-8-17 15:34 | 显示全部楼层
这个是用到回调函数,用分层管理的时候比较有用,我只会最简单的C~~
奔波儿熊 发表于 2021-8-18 15:37 | 显示全部楼层
这是回调函数,好处是你不需要修改MCC生成的代码,直接在main.c里调用就能设置你自定义的中断操作了。
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这个函数这里添加。


WESTBR00K 发表于 2021-8-20 20:02 | 显示全部楼层
hjl2832 发表于 2021-8-19 09:02
首先,仔细跟踪到中断总函数interrupt_manager.c中看中断影响的函数名称,比喻我的是这样: if(PIE1bits.RC ...

学习了,厉害。
私藏人间 发表于 2025-9-8 16:17 | 显示全部楼层
MCC 生成的库函数是封装了芯片底层操作的代码,对应外设初始化、配置及功能控制。如UART_Initialize()完成串口初始化,SPI_Write()实现 SPI 数据发送。函数名直观反映功能,参数对应配置项,无需手动操作寄存器,简化开发,需结合芯片手册理解具体实现逻辑。
芯路例程 发表于 2025-9-9 11:05 | 显示全部楼层
我打算帮助解答关于单片机、电机、传感器和电路的问题。你想了解哪方面的知识呢?
哪吒哪吒 发表于 2025-9-9 14:45 | 显示全部楼层
设置定时器中断,定时器溢出时翻转LED引脚电平。
V853 发表于 2025-9-10 16:21 | 显示全部楼层
在需要延时的地方调用,通常在程序中需要等待特定时间时使用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部