⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drv_ftm_art.c

📁 最新版IAR FOR ARM(EWARM)5.11中的代码例子
💻 C
字号:
/************************************************************************/
/*                                                                      */
/*    Copyright (C) 2006 Oki Electric Industry Co., LTD.                */
/*                                                                      */
/*    System Name    :  ML675050 series                                 */
/*    Module Name    :  ML675050 iccc driver program                    */
/*    File   Name    :  drv_ftm_art.c                                   */
/*    Date           :  2006/01/06 initial version                      */
/*                                                                      */
/************************************************************************/

#include "common.h"
#if defined(__arm)
#include "ml675050.h"
#else
#include "ml675050sim.h"
#endif
#include "hal_api.h"
#include "drv_common.h"
#include "drv_ftm_art.h"
#include "intrinsics.h"


#define FTM_PORT1_SEL_MASK 0xff30ffff
#define FTM_PORT1_SEL_SET  0x00450000
#define FTM_PORT4_SEL_MASK 0x3fff3fff
#define FTM_PORT4_SEL_SET  0x40004000

/******************************/
/*     Private defines        */
/******************************/
/*--------- variable ---------*/
volatile int16_t counter[6];

/*--------- function ---------*/
static void art0_callback(uint16_t state);
static void art1_callback(uint16_t state);
static void art3_callback(uint16_t state);
static void art4_callback(uint16_t state);
static void art5_callback(uint16_t state);


/************************************************************************/
/*                                                                      */
/*  Function Name   : smpDrv_OpenFtm_Art                                */
/*  Input           : Art                                               */
/*  Output          : DRV_OK(1)                                         */
/*                  : DRV_PARAM_ERROR(-2)                               */
/*                                                                      */
/*  Note : Open the driver of ftm_art.                                  */
/*                                                                      */
/************************************************************************/
int16_t smpDrv_OpenFtm_Art(Art *art) 
{
    int16_t rtnVal = DRV_OK;
    uPLAT_PioFunctionParam port_param;
    int16_t i;
    uPLAT_InterruptParam int_param;

    /* Get port function. */
    rtnVal = uplat7dHAL_PioGetFunction(&port_param);
    if (rtnVal != DRV_OK) {
        return rtnVal;
    }
    /* Set FTM port Secondary function. */
    port_param.port_sel1 = (port_param.port_sel1 & FTM_PORT1_SEL_MASK)
                           | FTM_PORT1_SEL_SET;
    port_param.port_sel4 = (port_param.port_sel4 & FTM_PORT4_SEL_MASK)
                           | FTM_PORT4_SEL_SET;
    rtnVal = uplat7dHAL_PioSetFunction(&port_param);
    if (rtnVal != DRV_OK) {
        return rtnVal;
    }

    for(i=0; i<6; i++){
        counter[i] = 0;
    }

    /* FTM0 Interrupt setting. */
    int_param.primary = INT_FTM0_ART;
    int_param.level = EXILCA_ILC16 & INT_LV3;
    int_param.callback = art0_callback;
    rtnVal = uplat7dHAL_InterruptSetPrimary(&int_param);
    if (rtnVal != DRV_OK) {
        return rtnVal;
    }

    /* FTM1 Interrupt setting. */
    int_param.primary = INT_FTM1_ART;
    int_param.level = EXILCA_ILC16 & INT_LV3;
    int_param.callback = art1_callback;
    rtnVal = uplat7dHAL_InterruptSetPrimary(&int_param);
    if (rtnVal != DRV_OK) {
        return rtnVal;
    }

    /* FTM3 Interrupt setting. */
    int_param.primary = INT_FTM3;
    int_param.level = EXILCA_ILC18 & INT_LV2;
    int_param.callback = art3_callback;
    rtnVal = uplat7dHAL_InterruptSetPrimary(&int_param);
    if (rtnVal != DRV_OK) {
        return rtnVal;
    }

    /* FTM4 Interrupt setting. */
    int_param.primary = INT_FTM4;
    int_param.level = EXILCA_ILC20 & INT_LV1;
    int_param.callback = art4_callback;
    rtnVal = uplat7dHAL_InterruptSetPrimary(&int_param);
    if (rtnVal != DRV_OK) {
        return rtnVal;
    }

    /* FTM5 Interrupt setting. */
    int_param.primary = INT_FTM5;
    int_param.level = EXILCA_ILC20 & INT_LV1;
    int_param.callback = art5_callback;
    rtnVal = uplat7dHAL_InterruptSetPrimary(&int_param);
    if (rtnVal != DRV_OK) {
        return rtnVal;
    }

    /* Initailize ART HAL. */
    if (art->cycle0 != ART0CYC){
        rtnVal = DRV_PARAM_ERROR;
    }
    if (art->cycle1 != ART1CYC){
        rtnVal = DRV_PARAM_ERROR;
    }
    if (art->cycle3 != ART3CYC){
        rtnVal = DRV_PARAM_ERROR;
    }
    if (art->cycle4 != ART4CYC){
        rtnVal = DRV_PARAM_ERROR;
    }
    if (art->cycle5 != ART5CYC){
        rtnVal = DRV_PARAM_ERROR;
    }
    if (rtnVal == DRV_OK) {
        art->cycle0 = 65536 - (ART0CYC * FTM_APB_CLK * 1000) / 16 ;
        art->cycle1 = 65536 - (ART1CYC * FTM_APB_CLK * 1000) / 16 ;
        art->cycle3 = 65536 - (ART3CYC * FTM_APB_CLK * 1000) / 16 ;
        art->cycle4 = 65536 - (ART4CYC * FTM_APB_CLK * 1000) / 16 ;
        art->cycle5 = 65536 - (ART5CYC * FTM_APB_CLK * 1000) / 16 ;
        rtnVal = ml675050HAL_FtmArtInit(art);
    }
    
    /* Enable irq interrupt. */
    __enable_interrupt(); //irq_en();

    return rtnVal;
}

/************************************************************************/
/*                                                                      */
/*  Function Name   : smpDrv_CloseFtm_Art                               */
/*  Input           : void                                              */
/*  Output          : DRV_OK(1)                                         */
/*                                                                      */
/*  Note : Close the driver of ftm_art.                                 */
/*                                                                      */
/************************************************************************/
int16_t smpDrv_CloseFtm_Art(void) 
{
    int16_t rtnVal = DRV_OK;

    __disable_interrupt(); //irq_dis();                              /* Disable Interrupt */

    return rtnVal;
}
/************************************************************************/
/*                                                                      */
/*  Function Name   : smpDrv_IoctlFtm_Art                               */
/*  Input           : cmd The number of ART HAL-API.                    */
/*                    arg The argument of ART HAL-API.                  */
/*  Output          : DRV_OK(1)                                         */
/*                  : DRV_PARAM_ERROR(-2)                               */
/*                                                                      */
/*  Note : Control the driver of ftm_art.                               */
/*                                                                      */
/************************************************************************/
int16_t smpDrv_IoctlFtm_Art(uint16_t cmd, uint32_t arg) {
    int16_t rtnVal = DRV_OK;
    uint16_t *start;

    switch (cmd) {
    case ML675050_HAL_FTM_ART_START:
        start = (uint16_t *)arg;
        if ((start[0] != 1) && (start[0] != 0)) {
            rtnVal = DRV_PARAM_ERROR;
        }
        if ((start[1] != 1) && (start[1] != 0)) {
            rtnVal = DRV_PARAM_ERROR;
        }
        if ((start[2] != 1) && (start[2] != 0)) {
            rtnVal = DRV_PARAM_ERROR;
        }
        if ((start[3] != 1) && (start[3] != 0)) {
            rtnVal = DRV_PARAM_ERROR;
        }
        if ((start[4] != 1) && (start[4] != 0)) {
            rtnVal = DRV_PARAM_ERROR;
        }
        if ((start[5] != 1) && (start[5] != 0)) {
            rtnVal = DRV_PARAM_ERROR;
        }
        if (rtnVal == DRV_OK) {
            rtnVal = ml675050HAL_FtmArtStart(start);
        }
        break;
    default :
        rtnVal = DRV_PARAM_ERROR;
        break;
    }

    return rtnVal;
}

/************************************************************************/
/*                                                                      */
/*  Function Name   : art_callback                                      */
/*  Input           : state                                             */
/*  Output          : void                                              */
/*                                                                      */
/*  Note : ART  call back function.                                     */
/*                                                                      */
/************************************************************************/
/* FTM0 call back function. */
static void art0_callback(uint16_t state) {
    counter[0]++;
}

/* FTM1 call back function. */
static void art1_callback(uint16_t state) {
    counter[1]++;
}

/* FTM3 call back function. */
static void art3_callback(uint16_t state) {
   counter[3]++;
}

/* FTM4 call back function. */
static void art4_callback(uint16_t state) {
    counter[4]++;
}

/* FTM5 call back function. */
static void art5_callback(uint16_t state) {
    counter[5]++;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -