/* Configure tpm params with frequency 24kHZ */
tpmParam[0].chnlNumber = (tpm_chnl_t)BOARD_FIRST_TPM_CHANNEL;
#if (defined(FSL_FEATURE_TPM_HAS_PAUSE_LEVEL_SELECT) && FSL_FEATURE_TPM_HAS_PAUSE_LEVEL_SELECT)
tpmParam[0].pauseLevel = kTPM_ClearOnPause;
#endif
tpmParam[0].level = TPM_LED_ON_LEVEL;
tpmParam[0].dutyCyclePercent = updatedDutycycle1;
tpmParam[1].chnlNumber = (tpm_chnl_t)BOARD_SECOND_TPM_CHANNEL;
#if (defined(FSL_FEATURE_TPM_HAS_PAUSE_LEVEL_SELECT) && FSL_FEATURE_TPM_HAS_PAUSE_LEVEL_SELECT)
tpmParam[1].pauseLevel = kTPM_ClearOnPause;
#endif
tpmParam[1].level = TPM_LED_ON_LEVEL;
tpmParam[1].dutyCyclePercent = updatedDutycycle2;
if (kStatus_Success !=
TPM_SetupPwm(BOARD_TPM_BASEADDR, tpmParam, 2U, kTPM_EdgeAlignedPwm, DEMO_PWM_FREQUENCY, TPM_SOURCE_CLOCK))
{
PRINTF("\r\nSetup PWM fail!\r\n");
return -1;
}
TPM_StartTimer(BOARD_TPM_BASEADDR, kTPM_SystemClock);
/* Record channel PWM mode configure */
control = TPM_GetChannelContorlBits(BOARD_TPM_BASEADDR, (tpm_chnl_t)BOARD_FIRST_TPM_CHANNEL);
while (1)
{
/* If g_txBuffer is empty and g_rxBuffer is full, copy g_rxBuffer to g_txBuffer. */
if ((!rxBufferEmpty) && (!txBufferFull))
{
channl = g_rxBuffer[0];
pwmduty = g_rxBuffer[1];
memset(g_rxBuffer,0,sizeof(g_rxBuffer));
PRINTF("Channl == %d\r\n",channl);
PRINTF("dutyStep == %d\r\n",pwmduty);
rxBufferEmpty = true;
txBufferFull = true;
}
/* If RX is idle and g_rxBuffer is empty, start to read data to g_rxBuffer. */
if ((!rxOnGoing) && rxBufferEmpty)
{
rxOnGoing = true;
LPUART_TransferReceiveNonBlocking(DEMO_LPUART, &g_lpuartHandle, &receiveXfer, &receivedBytes);
if (ECHO_BUFFER_SIZE == receivedBytes)
{
rxBufferEmpty = false;
rxOnGoing = false;
}
}
/* If TX is idle and g_txBuffer is full, start to send data. */
if ((!txOnGoing) && txBufferFull)
{
txOnGoing = true;
switch(channl)
{
case 0:
updatedDutycycle1 = pwmduty * 5U;
TPM_DisableChannel(BOARD_TPM_BASEADDR,(tpm_chnl_t)BOARD_FIRST_TPM_CHANNEL);
if ((kStatus_Success == TPM_UpdatePwmDutycycle(BOARD_TPM_BASEADDR, (tpm_chnl_t)BOARD_FIRST_TPM_CHANNEL,kTPM_EdgeAlignedPwm, updatedDutycycle1)))
TPM_EnableChannel(BOARD_TPM_BASEADDR, (tpm_chnl_t)BOARD_FIRST_TPM_CHANNEL, control);
break;
case 1:
updatedDutycycle2 = pwmduty * 5U;
TPM_DisableChannel(BOARD_TPM_BASEADDR,(tpm_chnl_t)BOARD_SECOND_TPM_CHANNEL);
if ((kStatus_Success == TPM_UpdatePwmDutycycle(BOARD_TPM_BASEADDR, (tpm_chnl_t)BOARD_SECOND_TPM_CHANNEL,kTPM_EdgeAlignedPwm, updatedDutycycle2)))
TPM_EnableChannel(BOARD_TPM_BASEADDR, (tpm_chnl_t)BOARD_SECOND_TPM_CHANNEL, control);
break;
default:
memset(g_rxBuffer,0,2);
memset(g_txBuffer,0,2);
memset(&receiveXfer,0,2);
GPIO_PinWrite(BOARD_LED1_GPIO,BOARD_LED1_GPIO_PIN,1);
i = 0xffff;
while (i--)
{
__NOP();
}
PRINTF("Data is error\r\n");
break;
}
LPUART_TransferSendNonBlocking(DEMO_LPUART, &g_lpuartHandle, &sendXfer);
}
/* 延迟一段时间,模拟应用程序正在处理其他事情,将输入数据保存到环形缓冲区 */
i = 0x10U;
while (i--)
{
__NOP();
}
}
}
(由于发帖内容对图片有限制,精彩内容请见下篇帖子)