【DigiKey&NXP】NXP FRDM-K32L3A6开发板-手机控制风扇与台灯(六)

    /* 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();
        }
    }
}

(由于发帖内容对图片有限制,精彩内容请见下篇帖子)