int main(void) { int value; DelayInit(); GPIO_QuickInit(HW_GPIOD, 7, kGPIO_Mode_OPP); GPIO_QuickInit(HW_GPIOE, 6, kGPIO_Mode_OPP); UART_QuickInit(UART0_RX_PA01_TX_PA02, 115200); printf("LPTMR test\r\n"); printf("PWM will generated from PC04, LPTMR will measure pulse on PC05\r\n"); printf("please connect PC04&PC05\r\n"); /* 边沿对其方式产生PWM波 */ TPM_PWM_QuickInit(TPM0_CH3_PC04, kPWM_EdgeAligned, 50); /* 占空比 50% */ TPM_PWM_ChangeDuty(HW_TPM0, kTPM_IT_CH3, 5000); LPTMR_PC_QuickInit(LPTMR_ALT2_PC05); while(1) { value = LPTMR_PC_ReadCounter(); printf("lptmr:%dHz\r\n", value); LPTMR_ClearCounter(); DelayMs(1000); } }
/** * @brief 初始化PWM波产生 * @code * * //TPM0_CH0_PE24 使用FTM0模块通道0 引脚E24上产生1KHz PWM波 * FTM_PWM_QuickInit(TPM0_CH0_PE24, 1000); * @endcode * @param MAP : 快速初始化通道 * @param frequencyInHZ : 频率 * @retval None */ uint8_t TPM_PWM_QuickInit(uint32_t MAP, TPM_PWM_Mode_Type mode, uint32_t req) { uint8_t i; uint32_t modulo; uint32_t clock; int32_t pres; uint8_t ps = 0; QuickInit_Type * pq = (QuickInit_Type*)&(MAP); /* init pinmux */ for(i = 0; i < pq->io_offset; i++) { PORT_PinMuxConfig(pq->io_instance, pq->io_base + i, (PORT_PinMux_Type) pq->mux); } /* calc req and ps */ uint32_t min_val = 0xFFFF; /* cal ps */ CLOCK_GetClockFrequency(kMCGOutClock, &clock); // if(MCG->C6 & MCG_C6_PLLS_MASK) /* PLL */ // { // clock /= 2; // } // else /* FLL */ // { // // } LIB_TRACE("%s %d\r\n", __func__, clock); pres = (clock/req)/TPM_MOD_MOD_MASK; if((clock/req)/pres > TPM_MOD_MOD_MASK) { pres++; } for(i = 0; i < 7; i++) { if((ABS(pres - (1<<i))) < min_val) { ps = i; min_val = ABS(pres - (1<<i)); } } if(pres > (1<<ps)) ps++; if(ps > 7) ps = 7; modulo = ((clock/(1<<ps))/req) - 1; LIB_TRACE("input frequency:%dHz\r\n", req); LIB_TRACE("input clk:%d\r\n", clock); LIB_TRACE("ps:%d\r\n", pres); LIB_TRACE("modulo:%d\r\n", modulo); LIB_TRACE("ip_instance:%d\r\n", pq->ip_instance); LIB_TRACE("io_instance:%d\r\n", pq->io_instance); LIB_TRACE("io_base:%d\r\n", pq->io_base); LIB_TRACE("io_offset:%d\r\n", pq->io_offset); LIB_TRACE("chl:%d\r\n", pq->channel); _TPM_InitBasic(pq->ip_instance, modulo, (TPM_ClockDiv_Type)ps); /* set FTM mode */ switch(mode) { case kPWM_EdgeAligned: TPM_SetMode(pq->ip_instance, pq->channel, kTPM_Mode_EdgeAligned); break; default: LIB_TRACE("error in FTM_PWM_Init\r\n"); break; } /* set duty to 50% */ TPM_PWM_ChangeDuty(pq->ip_instance, pq->channel, 5000); return pq->ip_instance; }