如何应用这几个函数?

[复制链接]
 楼主| zyf部长 发表于 2020-3-21 13:07 | 显示全部楼层 |阅读模式
最近在用MPLAB X IDE的MCC工具,生成库函数来直接调用,但是看了下是串口生成的库函数,对于其函数的名称和意义不是很清楚,在此请教大神们给予帮助和支持。我想实现的功能是通过调试助手发送数据,串口收到数据后,再将其发给调试助手进行显示,功能很简单,想通过中断函数来实现,但是对于生产的中断函数意义搞不明白。函数名称如下:
void EUSART2_SetRxInterruptHandler(void (* interruptHandler)(void));
void EUSART2_SetTxInterruptHandler(void (* interruptHandler)(void));
void interrupt INTERRUPT_InterruptManager(void);   
chenjunt 发表于 2020-3-21 13:08 | 显示全部楼层
第一个是发送,第二个是接收处理,第三个是中断
 楼主| zyf部长 发表于 2020-3-21 13:11 | 显示全部楼层
接收与发送中断函数需要自己写,然后通过EUSART2_SetRxInterruptHandler来设置具体的函数
kangzj 发表于 2020-3-21 13:13 | 显示全部楼层
就是自己写函数
juventus9554 发表于 2020-3-21 13:15 | 显示全部楼层
对,系统就会调用这个函数
zwll 发表于 2020-3-21 13:16 | 显示全部楼层
说实话,MCC生产的代码,只有串口的没有用过,因为有点复杂,都是自己重写了,别的还好,
stly 发表于 2020-3-21 13:17 | 显示全部楼层
我刚开始学习PIC单片机C语言,MPLAB X IDE的XC8,请问XC8如何调用函数库呀?
stly 发表于 2020-3-21 13:19 | 显示全部楼层
比如我需要调用延时函数,去哪里调用呀?
pengf 发表于 2020-3-21 13:20 | 显示全部楼层
你好!我刚开始学习PIC单片机C语言,刚开始用MPLAB X IDE,现在学习XC8.请多多指教!
 楼主| zyf部长 发表于 2020-3-21 13:23 | 显示全部楼层
我还是没搞明白这中断函数部分的意义。
liuzaiy 发表于 2020-3-21 13:25 | 显示全部楼层

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
 楼主| zyf部长 发表于 2020-3-21 13:26 | 显示全部楼层
中断管理:
void interrupt INTERRUPT_InterruptManager (void)
{
    // interrupt handler
    if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
    {
        TMR0_ISR();
    }
    else if(INTCONbits.PEIE == 1)
    {
        if(PIE1bits.RCIE == 1 && PIR1bits.RCIF == 1)
        {
            EUSART_RxDefaultInterruptHandler();
        }
        else if(PIE2bits.BCL1IE == 1 && PIR2bits.BCL1IF == 1)
        {
            I2C1_BusCollisionISR();
        }
        else if(PIE1bits.SSP1IE == 1 && PIR1bits.SSP1IF == 1)
        {
            I2C1_ISR();
        }
        else if(PIE1bits.ADIE == 1 && PIR1bits.ADIF == 1)
        {
            ADC_ISR();
        }
        else if(PIE1bits.TXIE == 1 && PIR1bits.TXIF == 1)
        {
            EUSART_TxDefaultInterruptHandler();
        }
        else
        {
            //Unhandled Interrupt
        }
    }      
    else
    {
        //Unhandled Interrupt
    }
}
 楼主| zyf部长 发表于 2020-3-21 13:30 | 显示全部楼层
这是定时器部分生成的函数:
void TMR0_Initialize(void)
{
    // Set TMR0 to the options selected in the User Interface
        
    // PSA assigned; PS 1:256; TMRSE Increment_hi_lo; mask the nWPUEN and INTEDG bits
    OPTION_REG = (uint8_t)((OPTION_REG & 0xC0) | 0xD7 & 0x3F);
        
    // TMR0 100;
    TMR0 = 0x64;
        
    // Load the TMR value to reload variable
    timer0ReloadVal= 100;

    // Clear Interrupt flag before enabling the interrupt
    INTCONbits.TMR0IF = 0;

    // Enabling TMR0 interrupt
    INTCONbits.TMR0IE = 1;

    // Set Default Interrupt Handler
    TMR0_SetInterruptHandler(TMR0_DefaultInterruptHandler);
}

uint8_t TMR0_ReadTimer(void)
{
    uint8_t readVal;

    readVal = TMR0;

    return readVal;
}

void TMR0_WriteTimer(uint8_t timerVal)
{
    // Write to the Timer0 register
    TMR0 = timerVal;
}

void TMR0_Reload(void)
{
    // Write to the Timer0 register
    TMR0 = timer0ReloadVal;
}

void TMR0_ISR(void)
{
    static volatile uint16_t CountCallBack = 0;

    // Clear the TMR0 interrupt flag
    INTCONbits.TMR0IF = 0;

    TMR0 = timer0ReloadVal;

    // callback function - called every 100th pass
    if (++CountCallBack >= TMR0_INTERRUPT_TICKER_FACTOR)
    {
        // ticker function call
        TMR0_CallBack();

        // reset ticker counter
        CountCallBack = 0;
    }

    // add your TMR0 interrupt custom code
}

void TMR0_CallBack(void)
{
    // Add your custom callback code here

    if(TMR0_InterruptHandler)
    {
        TMR0_InterruptHandler();
    }
}

void TMR0_SetInterruptHandler(void (* InterruptHandler)(void)){
    TMR0_InterruptHandler = InterruptHandler;
}

void TMR0_DefaultInterruptHandler(void){
    // add your TMR0 interrupt custom code
    // or set custom function using TMR0_SetInterruptHandler()
}
pangb 发表于 2020-3-21 13:31 | 显示全部楼层
如何实现定时1秒让LED灯的状态进行翻转?
 楼主| zyf部长 发表于 2020-3-21 13:33 | 显示全部楼层
真不知道该怎么去调用,怎么去写中断函数,还请教一下。
ousj 发表于 2020-3-21 13:34 | 显示全部楼层
这个型号应该只有一个中断向量
void interrupt INTERRUPT_InterruptManager
这个就是所有的中断函数集合,
morrisk 发表于 2020-3-21 13:36 | 显示全部楼层
但每个中断具体要做什么,写驱动的人是不可能知道的
morrisk 发表于 2020-3-21 13:37 | 显示全部楼层
这取决于应用,所以通过回调函数的形式来控制,通过初始化完成这些
 楼主| zyf部长 发表于 2020-3-21 13:39 | 显示全部楼层
我知道这是中断管理,我是想问假设要做定时器的中断,当满足如下条件的时候,就会调用 TMR0_ISR();
if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
    {
        TMR0_ISR();
    }
 楼主| zyf部长 发表于 2020-3-21 13:40 | 显示全部楼层
那我是否应该在TMR0_ISR()里去执行我要执行的操作呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

694

主题

7102

帖子

8

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