目录
6.03 BSP, MB_CommRxTxISR_x_Handler()
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
}