4176|3

8

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于cc2650 lanchpad pwmled的疑问 [复制链接]

run 了一下TI cc2650的PWMLED例程,红色LED闪动了起来。想小改一下换颗LED试试。看到了GPIO_write(Board_LED0, Board_LED_ON); 这句,语言改为Board_LED1,结果还是红色的LED在动,后来又把这句屏蔽掉,照样是LED0 在动。吓得我以为板子坏掉。
后来发现直接PWMLed线程中的PWM_open(Board_PWM1, ¶ms);就行了。
看来确实是PWM输出,既然如此,为何TI 还有些GPIO呢?

此帖出自无线连接论坛

最新回复

跟踪一下这个函数你就懂了 PWM_Handle PWMTimerCC26XX_open(PWM_Handle handle, PWM_Params *params) {     PWMTimerCC26XX_HwAttrs *hwAttrs = handle->hwAttrs;     PWMTimerCC26XX_Object  *object  = handle->object;     /* Check if PWM already open  */     uint32_t key = Hwi_disable();     if (object->isOpen)     {         Hwi_restore(key);         Log_error1("PWM_open(%x):  Unit already in use.", (UArg) handle);         return NULL;     }     object->isOpen = 1;     Hwi_restore(key);     /* Open timer resource */     GPTimerCC26XX_Params timerParams;     GPTimerCC26XX_Params_init(&timerParams);     timerParams.width          = GPT_CONFIG_16BIT;     timerParams.mode           = GPT_MODE_PWM;     timerParams.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;     GPTimerCC26XX_Handle hTimer = GPTimerCC26XX_open(hwAttrs->gpTimerUnit, &timerParams);     /* Fail if cannot open timer */     if (hTimer == NULL)     {         Log_error2("PWM_open(%x): Timer unit (%d) already in use.", (UArg) handle, hwAttrs->gpTimerUnit);         object->isOpen = false;         return NULL;     }     /* Open pin resource */     PIN_Config pinConfig;     /* Initial open of pin handle with no pins in it. Should never fail. */     if (hPins == NULL)     {         pinConfig = PIN_TERMINATE;         hPins     = PIN_open(&pinState, &pinConfig);     }     /* Invert PWM idle level since pin output is inverted */     uint32_t idleLevel = PIN_GPIO_HIGH;     if (params->idleLevel == PWM_IDLE_HIGH)     {         idleLevel = PIN_GPIO_LOW;     }     /* Generate pin config for PWM pin.      *  Output is inverted to make PWM duty calculations independent of period      */     pinConfig = hwAttrs->pwmPin | PIN_INPUT_DIS | PIN_GPIO_OUTPUT_EN | idleLevel |                 PIN_INV_INOUT | PIN_PUSHPULL | PIN_DRVSTR_MAX;     /* Fail if cannot add pin */     if (PIN_add(hPins, pinConfig) != PIN_SUCCESS)     {         Log_error2("PWM_open(%x): PIN (%d) already in use.", (UArg) handle, hwAttrs->pwmPin);         GPTimerCC26XX_close(hTimer);         object->isOpen = false;         return NULL;     }     /* Store configuration to object */     object->periodUnit  = params->periodUnits;     object->periodValue = params->periodValue;     object->dutyUnit    = params->dutyUnits;     object->dutyValue   = params->dutyValue;     object->idleLevel   = params->idleLevel;     object->hTimer      = hTimer;     /* Configure PWM period*/     uint32_t period = object->periodValue;     if (PWMTimerCC26XX_setPeriod(handle, period) != PWM_STATUS_SUCCESS)     {         Log_error1("PWM_open(%x): Failed setting period", (UArg) handle);         PIN_remove(hPins, hwAttrs->pwmPin);         GPTimerCC26XX_close(hTimer);         object->isOpen = false;         return NULL;     }     /* Corner case: If using duty unit PWM_DUTY_FRACTION or PWM_DUTY_US with        value 0, then duty is already set by setPeriod. Skip if so. */     PWM_Duty_Units unit  = object->dutyUnit;     uint32_t      value = object->dutyValue;     if (!(unit == PWM_DUTY_FRACTION || (value == 0 && unit == PWM_DUTY_US)))     {         if (PWMTimerCC26XX_setDuty(handle, value) != PWM_STATUS_SUCCESS)         {             Log_error1("PWM_open(%x): Failed setting duty cycle", (UArg) handle);             PIN_remove(hPins, hwAttrs->pwmPin);             GPTimerCC26XX_close(hTimer);             object->isOpen = false;             return NULL;         }     }     Log_info1("PWM_open(%x): Opened with great success!", (UArg) handle);     return handle; }  详情 回复 发表于 2017-1-3 19:08
点赞 关注
 

回复
举报

855

帖子

5

TA的资源

一粒金砂(高级)

沙发
 
跟踪一下这个函数你就懂了
PWM_Handle PWMTimerCC26XX_open(PWM_Handle handle, PWM_Params *params)
{
    PWMTimerCC26XX_HwAttrs *hwAttrs = handle->hwAttrs;
    PWMTimerCC26XX_Object  *object  = handle->object;

    /* Check if PWM already open  */
    uint32_t key = Hwi_disable();
    if (object->isOpen)
    {
        Hwi_restore(key);
        Log_error1("PWM_open(%x):  Unit already in use.", (UArg) handle);
        return NULL;
    }
    object->isOpen = 1;
    Hwi_restore(key);

    /* Open timer resource */
    GPTimerCC26XX_Params timerParams;
    GPTimerCC26XX_Params_init(&timerParams);
    timerParams.width          = GPT_CONFIG_16BIT;
    timerParams.mode           = GPT_MODE_PWM;
    timerParams.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
    GPTimerCC26XX_Handle hTimer = GPTimerCC26XX_open(hwAttrs->gpTimerUnit, &timerParams);

    /* Fail if cannot open timer */
    if (hTimer == NULL)
    {
        Log_error2("PWM_open(%x): Timer unit (%d) already in use.", (UArg) handle, hwAttrs->gpTimerUnit);
        object->isOpen = false;
        return NULL;
    }

    /* Open pin resource */

    PIN_Config pinConfig;

    /* Initial open of pin handle with no pins in it. Should never fail. */
    if (hPins == NULL)
    {
        pinConfig = PIN_TERMINATE;
        hPins     = PIN_open(&pinState, &pinConfig);
    }

    /* Invert PWM idle level since pin output is inverted */
    uint32_t idleLevel = PIN_GPIO_HIGH;
    if (params->idleLevel == PWM_IDLE_HIGH)
    {
        idleLevel = PIN_GPIO_LOW;
    }

    /* Generate pin config for PWM pin.
     *  Output is inverted to make PWM duty calculations independent of period
     */
    pinConfig = hwAttrs->pwmPin | PIN_INPUT_DIS | PIN_GPIO_OUTPUT_EN | idleLevel |
                PIN_INV_INOUT | PIN_PUSHPULL | PIN_DRVSTR_MAX;

    /* Fail if cannot add pin */
    if (PIN_add(hPins, pinConfig) != PIN_SUCCESS)
    {
        Log_error2("PWM_open(%x): PIN (%d) already in use.", (UArg) handle, hwAttrs->pwmPin);
        GPTimerCC26XX_close(hTimer);
        object->isOpen = false;
        return NULL;
    }


    /* Store configuration to object */
    object->periodUnit  = params->periodUnits;
    object->periodValue = params->periodValue;
    object->dutyUnit    = params->dutyUnits;
    object->dutyValue   = params->dutyValue;
    object->idleLevel   = params->idleLevel;
    object->hTimer      = hTimer;


    /* Configure PWM period*/
    uint32_t period = object->periodValue;

    if (PWMTimerCC26XX_setPeriod(handle, period) != PWM_STATUS_SUCCESS)
    {
        Log_error1("PWM_open(%x): Failed setting period", (UArg) handle);
        PIN_remove(hPins, hwAttrs->pwmPin);
        GPTimerCC26XX_close(hTimer);
        object->isOpen = false;
        return NULL;
    }

    /* Corner case: If using duty unit PWM_DUTY_FRACTION or PWM_DUTY_US with
       value 0, then duty is already set by setPeriod. Skip if so. */
    PWM_Duty_Units unit  = object->dutyUnit;
    uint32_t      value = object->dutyValue;

    if (!(unit == PWM_DUTY_FRACTION || (value == 0 && unit == PWM_DUTY_US)))
    {
        if (PWMTimerCC26XX_setDuty(handle, value) != PWM_STATUS_SUCCESS)
        {
            Log_error1("PWM_open(%x): Failed setting duty cycle", (UArg) handle);
            PIN_remove(hPins, hwAttrs->pwmPin);
            GPTimerCC26XX_close(hTimer);
            object->isOpen = false;
            return NULL;
        }
    }

    Log_info1("PWM_open(%x): Opened with great success!", (UArg) handle);
    return handle;
}
此帖出自无线连接论坛
个人签名作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
人民币的幻想 发表于 2017-1-3 19:08
跟踪一下这个函数你就懂了
PWM_Handle PWMTimerCC26XX_open(PWM_Handle handle, PWM_Params *params)
{
...

感谢你的回复,我刚开始用这片板子和CCS 工具,我只有在github上才看到你贴的这个程序
链接已隐藏,如需查看请登录或者注册

而我在TI上只有看到一些headfiles.具体在http://software-dl.ti.com/dsps/d ... gen/html/index.html
我想知道我应该从哪里打开你提到的源文件。因为后面的学习还将用到。

另外我在追踪代码的时候发现我前面提到过的GPIO_write(n,m)只是个定义。具体见图片。。整个学习资源怎么使用还望指点
此帖出自无线连接论坛
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

4
 
matthew_wang 发表于 2017-1-4 09:34
感谢你的回复,我刚开始用这片板子和CCS 工具,我只有在github上才看到你贴的这个程序 https://github.co ...

关于上面问题,自己回答一下,供其他小伙伴查找:
PWM的源文件在 C:\ti\tirtos_cc13xx_cc26xx_2_20_01_08\products\tidrivers_cc13xx_cc26xx_2_20_01_10\packages\ti\drivers\pwm


此帖出自无线连接论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表