打印
[开发工具]

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

[复制链接]
3326|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhaoxqi|  楼主 | 2021-8-13 22:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在用MPLAB X IDE的MCC工具,生成库函数来直接调用,但是看了下是串口生成的库函数,对于其函数的名称和意义不是很清楚,在此请教大神们给予帮助和支持。我想实现的功能是通过调试助手发送数据,串口收到数据后,再将其发给调试助手进行显示,功能很简单,想通过中断函数来实现,但是对于生产的中断函数意义搞不明白。函数名称如下:
void EUSART2_SetRxInterruptHandler(void (* interruptHandler)(void));
void EUSART2_SetTxInterruptHandler(void (* interruptHandler)(void));
void interrupt INTERRUPT_InterruptManager(void);   
如何应用这几个函数?

使用特权

评论回复
沙发
zhenykun| | 2021-8-13 22:56 | 只看该作者
第一个是发送,第二个是接收处理,第三个是中断

使用特权

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

使用特权

评论回复
地板
llljh| | 2021-8-13 23:00 | 只看该作者
说实话,MCC生产的代码,只有串口的没有用过,因为有点复杂,都是自己重写了,别的还好,

使用特权

评论回复
5
dengdc| | 2021-8-13 23:02 | 只看该作者
刚开始学习PIC单片机C语言,MPLAB X IDE的XC8,请问XC8如何调用函数库呀?

使用特权

评论回复
6
dengdc| | 2021-8-13 23:04 | 只看该作者
比如我需要调用延时函数,去哪里调用呀?

使用特权

评论回复
评论
橘子阿小 2021-8-16 15:35 回复TA
你可以自己写一个延时函数 
7
yszong| | 2021-8-13 23:06 | 只看该作者
你好!我刚开始学习PIC单片机C语言,刚开始用MPLAB X IDE,现在学习XC8.请多多指教!

使用特权

评论回复
8
zhaoxqi|  楼主 | 2021-8-13 23:08 | 只看该作者
你好,我还是没搞明白这中断函数部分的意义。
这是中断管理:
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()
}

使用特权

评论回复
9
dingy| | 2021-8-13 23:14 | 只看该作者

你有什么打算呢?或者你想知道什么?

使用特权

评论回复
10
heweibig| | 2021-8-13 23:17 | 只看该作者
我如何实现定时1秒让LED灯的状态进行翻转?

使用特权

评论回复
11
午夜粪车| | 2021-8-13 23:18 | 只看该作者
真不知道该怎么去调用,怎么去写中断函数,还请教一下

使用特权

评论回复
12
yszong| | 2021-8-13 23:20 | 只看该作者
这个型号应该只有一个中断向量
void interrupt INTERRUPT_InterruptManager
这个就是所有的中断函数集合,

使用特权

评论回复
13
chuxh| | 2021-8-13 23:22 | 只看该作者
但每个中断具体要做什么,写驱动的人是不可能知道的,这取决于应用,所以通过回调函数的形式来控制,通过初始化完成这些

使用特权

评论回复
14
zhaoxqi|  楼主 | 2021-8-13 23:24 | 只看该作者
我知道这是中断管理,我是想问假设要做定时器的中断,当满足如下条件的时候,就会调用 TMR0_ISR();
if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
    {
        TMR0_ISR();
    }

使用特权

评论回复
评论
MianQi 2021-8-19 20:53 回复TA
关于中断服务子程序,你可以参考一下我今天发的帖子“【CuriosityNano测评报告】- 5:ADCC”(https://bbs.21ic.com/icview-3149760-1-1.html) 
15
zhaoxqi|  楼主 | 2021-8-13 23:26 | 只看该作者
那我是否应该在TMR0_ISR()里去执行我要执行的操作呢?

使用特权

评论回复
16
zhaoxqi|  楼主 | 2021-8-13 23:29 | 只看该作者
这个函数已经执行了清除中断标志,自动重载初值,我就将我要执行的函数添加在后面就可以了吗?

使用特权

评论回复
17
liliang9554| | 2021-8-13 23:32 | 只看该作者
好多地方都可以添加自己代码
代码都有提示了
// add your TMR0 interrupt custom code
// Add your custom callback code here

使用特权

评论回复
18
chuxh| | 2021-8-13 23:34 | 只看该作者
或者在初始化时配置回调函数
void TMR0_SetInterruptHandler(void (* InterruptHandler)(void)){
    TMR0_InterruptHandler = InterruptHandler;
}
调用这个API TMR0_SetInterruptHandler

使用特权

评论回复
19
午夜粪车| | 2021-8-13 23:36 | 只看该作者
我刚开始学习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
请问需要怎么处理呀?

使用特权

评论回复
评论
MianQi 2021-8-19 20:54 回复TA
就是说你当前的硬件库不支持,你可能需要更新一下库。 
20
huangchui| | 2021-8-13 23:39 | 只看该作者
我就是不明白这个地方,到底什么意思呢

使用特权

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

本版积分规则

808

主题

10636

帖子

4

粉丝