[MPLAB] 关于MCC生成的库函数的意思

[复制链接]
345|12
 楼主 | 2018-9-15 22:24 | 显示全部楼层 |阅读模式
最近在用MPLAB X IDE的MCC工具,生成库函数来直接调用,但是看了下是串口生成的库函数,对于其函数的名称和意义不是很清楚,在此请教大神们给予帮助和支持。我想实现的功能是通过调试助手发送数据,串口收到数据后,再将其发给调试助手进行显示,功能很简单,想通过中断函数来实现,但是对于生产的中断函数意义搞不明白。函数名称如下:
void EUSART2_SetRxInterruptHandler(void (* interruptHandler)(void));
void EUSART2_SetTxInterruptHandler(void (* interruptHandler)(void));
void interrupt INTERRUPT_InterruptManager(void);   
如何应用这几个函数?
| 2018-9-16 21:40 | 显示全部楼层
第一个是发送,第二个是接收处理,第三个是中断

WX:bigZbra
欢迎交流讨论pic单片机
| 2018-9-17 13:52 | 显示全部楼层
接收与发送中断函数需要自己写,然后通过EUSART2_SetRxInterruptHandler来设置具体的函数(就是自己写函数),系统就会调用这个函数
| 2018-9-19 17:39 | 显示全部楼层
说实话,MCC生产的代码,只有串口的没有用过,因为有点复杂,都是自己重写了,别的还好,
| 2018-9-19 22:03 | 显示全部楼层
jinzhan0132 发表于 2018-9-19 17:39
说实话,MCC生产的代码,只有串口的没有用过,因为有点复杂,都是自己重写了,别的还好, ...

你好,我刚开始学习PIC单片机C语言,MPLAB X IDE的XC8,请问XC8如何调用函数库呀?比如我需要调用延时函数,去哪里调用呀?
| 2018-9-19 22:06 | 显示全部楼层
ayb_ice 发表于 2018-9-17 13:52
接收与发送中断函数需要自己写,然后通过EUSART2_SetRxInterruptHandler来设置具体的函数(就是自己写函数 ...

你好!我刚开始学习PIC单片机C语言,刚开始用MPLAB X IDE,现在学习XC8.请多多指教!
 楼主 | 2018-9-20 00:59 | 显示全部楼层
ayb_ice 发表于 2018-9-17 13:52
接收与发送中断函数需要自己写,然后通过EUSART2_SetRxInterruptHandler来设置具体的函数(就是自己写函数 ...

你好,我还是没搞明白这中断函数部分的意义。
这是中断管理:
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
    }
}

这是定时器部分生成的函数:
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()
}

我如何实现定时1秒让LED灯的状态进行翻转?真不知道该怎么去调用,怎么去写中断函数,还请教一下。
| 2018-9-20 08:39 | 显示全部楼层
这个型号应该只有一个中断向量
void interrupt INTERRUPT_InterruptManager
这个就是所有的中断函数集合,
但每个中断具体要做什么,写驱动的人是不可能知道的,这取决于应用,所以通过回调函数的形式来控制,通过初始化完成这些
| 2018-9-20 08:39 | 显示全部楼层
skyfans000 发表于 2018-9-20 00:59
你好,我还是没搞明白这中断函数部分的意义。
这是中断管理:
void interrupt INTERRUPT_InterruptManage ...

这个型号应该只有一个中断向量
void interrupt INTERRUPT_InterruptManager
这个就是所有的中断函数集合,
但每个中断具体要做什么,写驱动的人是不可能知道的,这取决于应用,所以通过回调函数的形式来控制,通过初始化完成这些
 楼主 | 2018-9-20 10:45 | 显示全部楼层
ayb_ice 发表于 2018-9-20 08:39
这个型号应该只有一个中断向量
void interrupt INTERRUPT_InterruptManager
这个就是所有的中断函数集合 ...

谢谢你的回复!
我知道这是中断管理,我是想问假设要做定时器的中断,当满足如下条件的时候,就会调用 TMR0_ISR();
if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
    {
        TMR0_ISR();
    }
那我是否应该在TMR0_ISR()里去执行我要执行的操作呢?这个函数已经执行了清除中断标志,自动重载初值,我就将我要执行的函数添加在后面就可以了吗?
| 2018-9-20 10:50 | 显示全部楼层
skyfans000 发表于 2018-9-20 10:45
谢谢你的回复!
我知道这是中断管理,我是想问假设要做定时器的中断,当满足如下条件的时候,就会调用 TM ...

好多地方都可以添加自己代码
代码都有提示了
// add your TMR0 interrupt custom code
// Add your custom callback code here
| 2018-9-20 10:51 | 显示全部楼层
skyfans000 发表于 2018-9-20 10:45
谢谢你的回复!
我知道这是中断管理,我是想问假设要做定时器的中断,当满足如下条件的时候,就会调用 TM ...

或者在初始化时配置回调函数
void TMR0_SetInterruptHandler(void (* InterruptHandler)(void)){
    TMR0_InterruptHandler = InterruptHandler;
}
调用这个API TMR0_SetInterruptHandler
| 2018-9-23 23:25 | 显示全部楼层
楼主,你好!我刚开始学习MPLAB X IDE和XC8,
我今天试用MCC时出现了警告,请问你有碰到吗?
我安装完MCC后,点击Tools→Embedded→MPLAB Code Configurator v3:Open/Close时出现了如下警告
The project's device is not supported by the currently loaded libraries. All library versions are available for download on the MCC
请问需要怎么处理呀?
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

关闭

热门推荐上一条 /1 下一条

快速回复 返回顶部 返回列表