打印
[开发工具]

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

[复制链接]
3950|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
skyfans000|  楼主 | 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);   
如何应用这几个函数?
沙发
mzb2012| | 2018-9-16 21:40 | 只看该作者
第一个是发送,第二个是接收处理,第三个是中断

WX:bigZbra
欢迎交流讨论pic单片机

使用特权

评论回复
板凳
ayb_ice| | 2018-9-17 13:52 | 只看该作者
接收与发送中断函数需要自己写,然后通过EUSART2_SetRxInterruptHandler来设置具体的函数(就是自己写函数),系统就会调用这个函数

使用特权

评论回复
地板
jinzhan0132| | 2018-9-19 17:39 | 只看该作者
说实话,MCC生产的代码,只有串口的没有用过,因为有点复杂,都是自己重写了,别的还好,

使用特权

评论回复
5
hyxstrive| | 2018-9-19 22:03 | 只看该作者
jinzhan0132 发表于 2018-9-19 17:39
说实话,MCC生产的代码,只有串口的没有用过,因为有点复杂,都是自己重写了,别的还好, ...

你好,我刚开始学习PIC单片机C语言,MPLAB X IDE的XC8,请问XC8如何调用函数库呀?比如我需要调用延时函数,去哪里调用呀?

使用特权

评论回复
6
hyxstrive| | 2018-9-19 22:06 | 只看该作者
ayb_ice 发表于 2018-9-17 13:52
接收与发送中断函数需要自己写,然后通过EUSART2_SetRxInterruptHandler来设置具体的函数(就是自己写函数 ...

你好!我刚开始学习PIC单片机C语言,刚开始用MPLAB X IDE,现在学习XC8.请多多指教!

使用特权

评论回复
7
skyfans000|  楼主 | 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灯的状态进行翻转?真不知道该怎么去调用,怎么去写中断函数,还请教一下。

使用特权

评论回复
8
ayb_ice| | 2018-9-20 08:39 | 只看该作者
这个型号应该只有一个中断向量
void interrupt INTERRUPT_InterruptManager
这个就是所有的中断函数集合,
但每个中断具体要做什么,写驱动的人是不可能知道的,这取决于应用,所以通过回调函数的形式来控制,通过初始化完成这些

使用特权

评论回复
9
ayb_ice| | 2018-9-20 08:39 | 只看该作者
skyfans000 发表于 2018-9-20 00:59
你好,我还是没搞明白这中断函数部分的意义。
这是中断管理:
void interrupt INTERRUPT_InterruptManage ...

这个型号应该只有一个中断向量
void interrupt INTERRUPT_InterruptManager
这个就是所有的中断函数集合,
但每个中断具体要做什么,写驱动的人是不可能知道的,这取决于应用,所以通过回调函数的形式来控制,通过初始化完成这些

使用特权

评论回复
10
skyfans000|  楼主 | 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()里去执行我要执行的操作呢?这个函数已经执行了清除中断标志,自动重载初值,我就将我要执行的函数添加在后面就可以了吗?

使用特权

评论回复
11
ayb_ice| | 2018-9-20 10:50 | 只看该作者
skyfans000 发表于 2018-9-20 10:45
谢谢你的回复!
我知道这是中断管理,我是想问假设要做定时器的中断,当满足如下条件的时候,就会调用 TM ...

好多地方都可以添加自己代码
代码都有提示了
// add your TMR0 interrupt custom code
// Add your custom callback code here

使用特权

评论回复
12
ayb_ice| | 2018-9-20 10:51 | 只看该作者
skyfans000 发表于 2018-9-20 10:45
谢谢你的回复!
我知道这是中断管理,我是想问假设要做定时器的中断,当满足如下条件的时候,就会调用 TM ...

或者在初始化时配置回调函数
void TMR0_SetInterruptHandler(void (* InterruptHandler)(void)){
    TMR0_InterruptHandler = InterruptHandler;
}
调用这个API TMR0_SetInterruptHandler

使用特权

评论回复
13
hyxstrive| | 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
请问需要怎么处理呀?

使用特权

评论回复
14
zhaor| | 2018-11-8 21:45 | 只看该作者
ayb_ice 发表于 2018-9-20 10:51
或者在初始化时配置回调函数
void TMR0_SetInterruptHandler(void (* InterruptHandler)(void)){
    TM ...

我就是不明白这个地方,到底什么意思呢

使用特权

评论回复
15
zhaor| | 2018-11-8 21:51 | 只看该作者
不明白写这么复杂干什么?

使用特权

评论回复
16
ayb_ice| | 2018-11-9 08:31 | 只看该作者
本帖最后由 ayb_ice 于 2018-11-9 08:33 编辑
zhaor 发表于 2018-11-8 21:45
我就是不明白这个地方,到底什么意思呢

设置中断处理函数实际就是给函数指针赋值,指向具体函数,然后驱动就会在合适的时候调用那个函数

使用特权

评论回复
17
flamer| | 2020-3-24 17:11 | 只看该作者
请问楼主问题解决了吗?我也遇到和你一样的问题了

使用特权

评论回复
18
hjl2832| | 2020-3-25 08:47 | 只看该作者
MCC生成有一个默认的中断函数,你可以在里面直接添加自己的代码,它所有的中断都是用的指针指向所调用的函数,但是个人感觉也是有点复杂,递归调用了好几层。我一般直接在主中断函数调用的第一层里添加自己的代码,系统生成的递归的函数直接删除不用。比喻上面提到的TMR0_ISR()。直接在里面加自己的函数,然后它所指向的下一层函数以后的函数全部删除了。

使用特权

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

本版积分规则

4

主题

13

帖子

2

粉丝