/* ** =================================================================== ** Method : InterruptTx (component Serial_LDD) ** ** Description : ** The method services the receive interrupt of the selected ** peripheral(s) and eventually invokes the bean's event(s). ** This method is internal. It is used by Processor Expert only. ** =================================================================== */ static void InterruptTx(MB_UART_TDeviceDataPtr DeviceDataPrv) { if (DeviceDataPrv->OutSentDataNum < DeviceDataPrv->OutDataNumReq) { /* Is number of sent characters less than the number of requested incoming characters? */ UART_PDD_PutChar8(UART2_BASE_PTR, *(DeviceDataPrv->OutDataPtr++)); /* Put a 8-bit character to the transmit register */ DeviceDataPrv->OutSentDataNum++; /* Increment the counter of sent characters. */ if (DeviceDataPrv->OutSentDataNum == DeviceDataPrv->OutDataNumReq) { DeviceDataPrv->OutDataNumReq = 0x00U; /* Clear the counter of characters to be send by SendBlock() */ } } else { UART_PDD_DisableInterrupt(UART2_BASE_PTR, UART_PDD_INTERRUPT_TRANSMITTER); /* Disable TX interrupt */ DeviceDataPrv->SerFlag &= (uint16_t)(~(uint16_t)ENABLED_TX_INT); /* Clear the flag ENABLED_TX_INT */ } }
/* ** =================================================================== ** Method : HWEnDi (component Serial_LDD) ** ** Description : ** Enables or disables the peripheral(s) associated with the ** component. The method is called automatically as a part of the ** Enable and Disable methods and several internal methods. ** This method is internal. It is used by Processor Expert only. ** =================================================================== */ static void HWEnDi(LDD_TDeviceData *DeviceDataPtr) { UART_SDA_TDeviceDataPtr DeviceDataPrv = (UART_SDA_TDeviceDataPtr)DeviceDataPtr; if (DeviceDataPrv->EnMode) { /* Enable device? */ UART_PDD_EnableFifo(UART0_BASE_PTR, (UART_PDD_TX_FIFO_ENABLE | UART_PDD_RX_FIFO_ENABLE)); /* Enable RX and TX FIFO */ UART_PDD_FlushFifo(UART0_BASE_PTR, (UART_PDD_TX_FIFO_FLUSH | UART_PDD_RX_FIFO_FLUSH)); /* Flush RX and TX FIFO */ UART_PDD_EnableTransmitter(UART0_BASE_PTR, PDD_ENABLE); /* Enable transmitter */ UART_PDD_EnableReceiver(UART0_BASE_PTR, PDD_ENABLE); /* Enable receiver */ UART_PDD_EnableInterrupt(UART0_BASE_PTR, ( UART_PDD_INTERRUPT_RECEIVER )); /* Enable interrupts */ } else { UART_PDD_DisableInterrupt(UART0_BASE_PTR, ( UART_PDD_INTERRUPT_RECEIVER | UART_PDD_INTERRUPT_TRANSMITTER )); /* Disable interrupts */ UART_PDD_EnableTransmitter(UART0_BASE_PTR, PDD_DISABLE); /* Disable transmitter. */ UART_PDD_EnableReceiver(UART0_BASE_PTR, PDD_DISABLE); /* Disable receiver. */ } }
/* ** =================================================================== ** Method : UART_A_Interrupt (component Serial_LDD) ** ** Description : ** The ISR function handling the device receive/transmit ** interrupt. Calls InterruptTX/InterruptRX methods. ** This method is internal. It is used by Processor Expert only. ** =================================================================== */ void UART_A_Interrupt(LDD_RTOS_TISRParameter _isrParameter) { /* {MQXLite RTOS Adapter} ISR parameter is passed as parameter from RTOS interrupt dispatcher */ UART_A_TDeviceDataPtr DeviceDataPrv = (UART_A_TDeviceDataPtr)_isrParameter; register uint32_t StatReg = UART_PDD_ReadInterruptStatusReg(UART3_BASE_PTR); /* Read status register */ if (StatReg & (UART_S1_NF_MASK | UART_S1_OR_MASK | UART_S1_FE_MASK | UART_S1_PF_MASK)) { /* Is any error flag set? */ (void)UART_PDD_GetChar8(UART3_BASE_PTR); /* Dummy read 8-bit character from receiver */ StatReg &= (uint32_t)(~(uint32_t)UART_S1_RDRF_MASK); /* Clear the receive data flag to discard the errorneous data */ } if (StatReg & UART_S1_RDRF_MASK) { /* Is the receiver's interrupt flag set? */ InterruptRx(DeviceDataPrv); /* If yes, then invoke the internal service routine. This routine is inlined. */ } if (DeviceDataPrv->SerFlag & ENABLED_TX_INT) { /* Is the transmitter interrupt enabled? */ if (StatReg & UART_S1_TDRE_MASK) { /* Is the transmitter empty? */ InterruptTx(DeviceDataPrv); /* If yes, then invoke the internal service routine. This routine is inlined. */ } } if ((UART_PDD_GetTxCompleteInterruptMask(UART3_BASE_PTR) != 0U) && (StatReg & UART_S1_TC_MASK)) { /* Is a transmission completed? */ UART_PDD_DisableInterrupt(UART3_BASE_PTR, UART_PDD_INTERRUPT_TRANSMITTER_COMPLETE); /* If yes then disable TX complete interrupt */ UART_A_OnTxComplete(DeviceDataPrv->UserDataPtr); /* If yes then invoke user event */ } }