uC/Modbus 用户手册——第六节 板级支持包(BSP)

目录

6.00 板级支持包(BSP)

6.01 BSP,MB_CommExit()

6.02 BSP, MB_CommPortCfg()

6.03 BSP, MB_CommRxTxISR_x_Handler()

6.04 BSP, MB_CommRxIntEn()

6.05 BSP, MB_CommRxIntDis()

6.06 BSP, MB_CommTx1()

6.07 BSP, MB_CommTxIntEn()

6.08 BSP, MB_CommTxIntDis()

6.09 BSP, MB_RTU_TmrInit()

6.10 BSP, MB_RTU_TmrExit()

6.11 BSP, MB_RTU_TmrISR_Handler()


6.00 板级支持包(BSP)

uC/Modbus几乎可以使用任何UART。需要提供一些简单接口函数来使用硬件。这些函数需要放置在mb_bsp.c文件中。Micrium提供了mb_bsp.c的示例作为uC/Modbus的一部分进行发布。

6.01 BSP,MB_CommExit()

该函数由MB_Exit()调用,关闭所有由uC/Modbus使用的串行接口。您的应用程序不需要调用该函数。该函数的伪代码如下:

void MB_CommExit (void)
{
    /* Disable all uC/Modbus Rx interrupts */
    /* Disable all uC/Modbus Tx interrupts */
    /* Remove interrupt vectors (if needed) */
}

6.02 BSP, MB_CommPortCfg()

该函数由MB_CfgCh()调用来配置UART通讯设置一个通道。MB_CommPortCfg()不允许被应用程序调用。函数原型如下:

void MB_CommPortCfg (MODBUS_CH  *pch,

                                        CPU_INT08U  port_nbr,

                                        CPU_INT32U  baud,

                                        CPU_INT08U  bits,

                                        CPU_INT08U  parity,

                                        CPU_INT08U  stops);

pch

指向待配置的通讯通道的指针。该指针在调用MB_CfgCh()时返回给应用程序。

port_nbr

与uC/Modbus通讯端口关联的物理端口号。例如,uC/Modbus通道#0可能关联到UART5。也就是uC/Modbus通道可以关联到您系统中的任何物理串口,不需要是一对一的通信。

baud

通道的波特率。所写的代码需要应该支持标准的波特率:9600,19200,38400,76800,115200,256000。

bits

UART使用的位数。通常是7或8。大多数是8位的。

parity

所用串口的奇偶校验类型。可选MODBUS_PARITY_NONE, MODBUS_PARITY_ODD和MODBUS_PARITY_EVEN。通常是MODBUS_PARITY_NONE。

stops

指定停止位的位数。通常可选1或2。1个停止位是最常见的。

6.03 BSP, MB_CommRxTxISR_x_Handler()

大多数串口在接收一个字节或发送一个字节的时候可以产生一个中断。如果UART接收或发送了一个字节后产生了中断,就需要一个函数来确定中断是由接收字节引起的还是由发送字节引起的。这种情况下,需要写一个名为MBS_CommRxTxISR_x_Handler()的函数,x表示物理UART(例如1,2,3…)。该函数的伪代码如下。红色的代码是您需要写的代码。您应该照常复制所有其他代码。

void MB_CommRxTxISR_x_Handler (void)

{

    CPU_INT08U c;

    CPU_INT08U ch;

    MODBUS_CH *pch;

   

    pch = &MB_ChTbl[0];

    for (ch = 0; ch < MODBUS_MAX_CH; ch++){

        if (pch->PortNbr == port_nbr){

            if (Rx Interrupt){

                c = Read byte from UART;

                Clear Rx Interrupt;

                pch->RxCtr++;

                MB_RxByte(pch, c); // Pass byte to Modbus to process

            }

            if (Tx Interrupt){

                pch->TxCtr++;

                MB_TxByte(pch); // Send next byte in response

                Clear Tx Interrupt;

            }

            break;

        }else{

            pch++;

        }

    }

    Clear spurious interrupts;

}

6.04 BSP, MB_CommRxIntEn()

该函数由uC/Modbus调用,使能UART的Rx中断。

void MB_CommRxIntEn(MODBUS_CH *pch)
{
    switch (pch->PortNbr) {
        /* Enable Rx interrupts for specified UART */
    }
}

​​​​​​​6.05 BSP, MB_CommRxIntDis()

该函数由uC/Modbus调用,禁用UART的Rx中断。

void MB_CommRxIntDis(MODBUS_CH *pch)
{
    switch (pch->PortNbr) {
        /* Disable Rx interrupts for specified UART */
    }
}

​​​​​​​6.06 BSP, MB_CommTx1()

该函数由uC/Modbus调用,向uC/Modbus通道关联的UART发送一个字节。

void MB_CommTx1 (MODBUS_CH  *pch,
                 CPU_INT08U  c)
{
    switch (pch->PortNbr) {
        /* Write byte ‘c’ to specified UART */
    }
}

​​​​​​​6.07 BSP, MB_CommTxIntEn()

该函数由uC/Modbus调用,使能UART的Tx中断。

void MB_CommTxIntEn(MODBUS_CH *pch)
{
    switch (pch->PortNbr) {
        /* Enable Tx interrupts from specified UART */
    }
}

​​​​​​​6.08 BSP, MB_CommTxIntDis()

该函数由uC/Modbus调用,禁用UART的Tx中断。

void MB_CommTxIntDis(MODBUS_CH *pch)
{
    switch (pch->PortNbr) {
        /* Disable Tx interrupts from specified UART */
    }
}

​​​​​​​6.09 BSP, MB_RTU_TmrInit()

该函数由MB_Init()调用初始化RTU定时器。Freq指定RTU定时器中断使用的频率。

void MB_RTU_TmrInit(CPU_INT32U freq);

​​​​​​​6.10 BSP, MB_RTU_TmrExit()

该函数由MB_Exit()调用停止RTU定时器中断。

void MB_RTU_TmrExit(void);

​​​​​​​6.11 BSP, MB_RTU_TmrISR_Handler()

该函数是RTU定时器中断的中断服务程序。该函数的伪代码如下:

void MB_RTU_TmrISR_Handler (void)
{
    Clear the RTU timer interrupt source;
    MB_RTU_TmrCtr++; // Indicate that we had activities on this interrupt
    MB_RTU_TmrUpdate(); // Check for RTU timers that have expired
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值