查看: 3423|回复: 4

[分享] FRDM-K64F fsl_lptmr_driver.c 被指针搞晕了

[复制链接]
  • TA的每日心情
    慵懒
    2016-11-24 10:19
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    50

    主题

    1028

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2870
    最后登录
    1970-1-1
    发表于 2015-7-3 15:13:10 | 显示全部楼层 |阅读模式
    学习 LPTMR 的驱动,在函数中有段指针的操作把我给搞晕了,求指教

    lptmr_status_t LPTMR_DRV_Init(uint32_t instance, lptmr_state_t *userStatePtr, const lptmr_user_config_t* userConfigPtr)
    {
        assert(instance < LPTMR_INSTANCE_COUNT);
        LPTMR_Type * base = g_lptmrBase[instance];
        lptmr_prescaler_user_config_t prescalerUserConfig;
        lptmr_working_mode_user_config_t workingModeUserConfig;
        if ((!userConfigPtr) || (!userStatePtr))
        {
            return kStatus_LPTMR_NullArgument;
        }
        /* prescaler value 0 is invalid while working as pulse counter */
        if ((kLptmrTimerModePulseCounter == userConfigPtr->timerMode) &&
             (true == userConfigPtr->prescalerEnable) &&
             (kLptmrPrescalerDivide2 == userConfigPtr->prescalerValue))
        {
            return kStatus_LPTMR_InvalidPrescalerValue;
        }
        /* Enable clock for lptmr */
        CLOCK_SYS_EnableLptmrClock(instance);
        /* Disable lptmr and reset lptmr logic */
        LPTMR_HAL_Disable(base);
        /* LPTMR prescaler configure */  
        prescalerUserConfig.prescalerClockSelect = (lptmr_prescaler_clock_select_t)userConfigPtr->prescalerClockSource;
        prescalerUserConfig.prescalerBypass = (uint8_t)(userConfigPtr->prescalerEnable == false);
        prescalerUserConfig.prescalerValue = userConfigPtr->prescalerValue;
        LPTMR_HAL_SetPrescalerMode(base, prescalerUserConfig);
        /* Working Mode configure */
        workingModeUserConfig.timerModeSelect = userConfigPtr->timerMode;
        workingModeUserConfig.freeRunningEnable = userConfigPtr->freeRunningEnable;
        workingModeUserConfig.pinPolarity = userConfigPtr->pinPolarity;
        workingModeUserConfig.pinSelect = userConfigPtr->pinSelect;
        LPTMR_HAL_SetTimerWorkingMode(base,workingModeUserConfig);
        /* Internal context */
        lptmr_state_ptrs[instance] = userStatePtr;
        userStatePtr->userCallbackFunc = NULL;
        /* LPTMR interrupt */
        if (userConfigPtr->isInterruptEnabled)
        {
            LPTMR_HAL_SetIntCmd(base,true);
            INT_SYS_EnableIRQ(g_lptmrIrqId[instance]);
        }
        else
        {
            LPTMR_HAL_SetIntCmd(base,false);
            INT_SYS_DisableIRQ(g_lptmrIrqId[instance]);
        }
        /* Caculate prescaler clock frequency */
        if ( kLptmrTimerModeTimeCounter == userConfigPtr->timerMode)
        {
            userStatePtr->prescalerClockHz = CLOCK_SYS_GetLptmrFreq(instance,
                    userConfigPtr->prescalerClockSource);
            if (userConfigPtr->prescalerEnable)
            {
                userStatePtr->prescalerClockHz = (userStatePtr->prescalerClockHz >> ((uint32_t)(userConfigPtr->prescalerValue+1)));
            }
        }
        return kStatus_LPTMR_Success;
    }

    lptmr_state_ptrs[instance] = userStatePtr;
    userStatePtr->userCallbackFunc = NULL;
    红色部分代码是关于指针的,目的是实现 LPTMR 中断中调用的回调函数
    假设调用该函数的用户定义了一个全家变量 UserState,
    那么通过执行第一句红色代码, lptmr_state_ptrs[instance] 和 userStatePtr 都指向的是 UserState
    再执行第二句红色代码,全局变量 UserState 中的回调函数岂不是变成空指针了?不解,求解惑
    回复

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2015-7-3 16:35:28 | 显示全部楼层
    是的,所以在例程会在增加这样一个函数从而可以找到正确的回调函数
        // Install interrupt call back function for LPTMR
        LPTMR_DRV_InstallCallback(LPTMR0_IDX, lptmr_call_back);
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2016-11-24 10:19
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    50

    主题

    1028

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2870
    最后登录
    1970-1-1
     楼主| 发表于 2015-7-3 16:37:24 | 显示全部楼层
    FSL_TICS_ZP 发表于 2015-7-3 16:35
    是的,所以在例程会在增加这样一个函数从而可以找到正确的回调函数
        // Install interrupt call back fu ...

    可为什么要这么做呢,好费解
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16714
    最后登录
    1970-1-1
    发表于 2015-7-3 17:19:15 | 显示全部楼层
    学习了
    回复

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2015-7-3 17:31:21 | 显示全部楼层
    cxtarm 发表于 2015-7-3 16:37
    可为什么要这么做呢,好费解

    这个我就不方便回答啊,因为我也没参与KSDK的设计啊
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-28 00:15 , Processed in 0.083571 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表