打印

如何应用这几个函数?

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

使用特权

评论回复
沙发
chenjunt| | 2021-8-8 18:15 | 只看该作者

第一个是发送,第二个是接收处理,第三个是中断

使用特权

评论回复
板凳
zyf部长|  楼主 | 2021-8-8 18:18 | 只看该作者
接收与发送中断函数需要自己写,然后通过EUSART2_SetRxInterruptHandler来设置具体的函数

使用特权

评论回复
地板
kangzj| | 2021-8-8 18:20 | 只看该作者
就是自己写函数

使用特权

评论回复
5
juventus9554| | 2021-8-8 18:22 | 只看该作者
对,系统就会调用这个函数

使用特权

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

使用特权

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

使用特权

评论回复
8
jlyuan| | 2021-8-8 18:29 | 只看该作者
比如我需要调用延时函数,去哪里调用呀?

使用特权

评论回复
评论
AINZGOWN 2021-8-10 10:32 回复TA
PIC系列的延时在delay.h里面,直接用的话是是__delay_ms(int ms); 
9
pengf| | 2021-8-8 18:31 | 只看该作者
你好!我刚开始学习PIC单片机C语言,刚开始用MPLAB X IDE,现在学习XC8.请多多指教!

使用特权

评论回复
10
zyf部长|  楼主 | 2021-8-8 18:33 | 只看该作者
我还是没搞明白这中断函数部分的意义。

使用特权

评论回复
11
wenfen| | 2021-8-8 18:35 | 只看该作者


楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
12
zyf部长|  楼主 | 2021-8-8 18:39 | 只看该作者
中断管理:
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
    }
}

使用特权

评论回复
13
zyf部长|  楼主 | 2021-8-8 18:41 | 只看该作者
这是定时器部分生成的函数:
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()
}

使用特权

评论回复
14
pangb| | 2021-8-8 18:43 | 只看该作者
如何实现定时1秒让LED灯的状态进行翻转?

使用特权

评论回复
15
zyf部长|  楼主 | 2021-8-8 18:46 | 只看该作者
真不知道该怎么去调用,怎么去写中断函数,还请教一下。

使用特权

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

使用特权

评论回复
17
jlyuan| | 2021-8-8 18:53 | 只看该作者
但每个中断具体要做什么,写驱动的人是不可能知道的

使用特权

评论回复
18
llljh| | 2021-8-8 18:57 | 只看该作者
这取决于应用,所以通过回调函数的形式来控制,通过初始化完成这些

使用特权

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

使用特权

评论回复
20
zyf部长|  楼主 | 2021-8-8 19:01 | 只看该作者
那我是否应该在TMR0_ISR()里去执行我要执行的操作呢?

使用特权

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

本版积分规则

694

主题

7102

帖子

8

粉丝