コード例 #1
0
ファイル: main.c プロジェクト: guzhaoyuan/smartCar
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);
    }
}
コード例 #2
0
ファイル: tpm.c プロジェクト: zwzmzd/kl02z
/**
 * @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;
}