This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] EK-TM4C123GXL:在一个 swi 内调用 PWM_setDuty()会导致 swi 不返回

Guru**** 2032800 points
Other Parts Discussed in Thread: EK-TM4C123GXL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/854894/ek-tm4c123gxl-calling-pwm_setduty-within-a-swi-causes-the-swi-to-not-return

器件型号:EK-TM4C123GXL

我有一个任务具有 UART_READ()来读取一个字符。 如果读取的字符为"t"、则布置 swi。 在我添加 PWM_setDuty()调用之前、我在运行 swi 函数时没有遇到任何问题。 它在首次发布时成功运行、但此后不会返回。 在 swi 环境下的特定 API 调用是否被禁止?  

空 swi0Fxn (UArg0、UArgarg1){

///PWM 填充初始化
PWM_Handle pwm1;
PWM_Handle pwm2;

PWM_PARAMS 参数;
uint16_t pwmPeriod = 300;

PWM_PARAMS_INIT (params);
params.period = pwmPeriod;

pwm1 = PWM_OPEN (Board_PWM0、params);
pwm2 = PWM_OPEN (Board_PWM1、params);

//方向 GPIO 引脚值
GPIO_WRITE (Board_PA5、on);
GPIO_WRITE (Board_PA4、OFF);

PWM_setDuty (pwm1、150);
PWM_setDuty (pwm2、150);
//test++;
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Pablo、

    您应该只打开 PWM 一次(注意:我假设您在每个 PWM_OPEN 之后的某个位置没有调用 PWM_CLOSE)。 您能否更改逻辑以便仅发生一次?

    此外、您使用的是哪个 PWM 驱动器? PWMTimerTiva 或 PWMTiva? 您可以在"Board".c 文件中查看您使用的函数表。

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Todd、

    我将更改我的 swi 函数中的逻辑、以便 PWM 打开一次。 在 EK-TM4C123GXL.c 中、我看到 PWMTiva.h 被用作我的 PWM 驱动 程序来设置 PWMTiva_HWAttrs。

    Pablo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Todd、

    我遵循了您的建议,为两个 PWM_Handle 变量中的每个变量调用一次 PWM_open()。 发布 swi 后、我的程序崩溃、出现以下情况:

    FSR = 0x0000
    HFSR = 0x40000000
    DFSR = 0x0000000b
    MMAR = 0x4601b5d7
    BFAR = 0x4601b5d7
    AFSR = 0x00000000

    在 ROV->Swi 中 、我看到 一个异常已经被抛出。

    Pablo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    巴勃罗

    作为完整性检查、PWM_Handles 是静态局部变量还是全局变量?

    我将启用 SYS/BIOS 断言、以确保您没有违反任何规定。 请查看此 文档、了解有关如何调试异常的更多详细信息:https://training.ti.com/debugging-common-application-issues-ti-rtos

    Todd  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Todd、

    您的健全性检查使我找到了解决办法。 我将 PWM_Handles 定义为 swi 中的静态变量、而 swi_post ()不再导致崩溃、并且输出波形正确且存在。 以下是 OP 的更新代码、适用于遇到类似问题的任何人。

    bool pwmOpenFlag = false;
    void swi0Fxn (UARg arg0、UARg arg1){
    
    ///PWM 填充初始化
    静态 PWM_Handle pwm1;
    静态 PWM_Handle pwm2;
    
    PWM_PARAMS 参数;
    uint16_t pwmPeriod = 300;
    
    PWM_PARAMS_INIT (params);
    params.period = pwmPeriod;
    
    if (pwmOpenFlag = false){
    pwm1 = PWM_OPEN (Board_PWM0、params);
    pwm2 = PWM_OPEN (Board_PWM1、params);
    
    pwmOpenFlag = true;
    }
    
    //方向 GPIO 引脚值
    GPIO_WRITE (Board_PA5、on);
    GPIO_WRITE (Board_PA4、OFF);
    
    PWM_setDuty (pwm1、150);
    
    PWM_setDuty (pwm2、150);
    
    } 

    如果没有太多麻烦、您是否可以在健全性检查中进行扩展?

    非常感谢您的帮助。

    Pablo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    巴勃罗

    我想您可能将句柄保留为简单的局部变量(而不是静态变量)。 因此、第一次调用 PWM_OPEN 时、一切都正常、因为 PWM 句柄已正确设置。 下次不调用 PWM_OPEN 时、由于句柄不是静态的、因此它们的值将是栈上的任何值(并且可能会导致 PWM_setDuty 调用中发生不良事件)。 通过设置为静态、它们的值将在将来对函数的调用中保持不变。

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    愿此(非常)谦逊的外部人员奖、"荣誉"给两人:

    • 海报-让关注/疑虑正确详述他的"修复"、以便他人受益
    • 供应商代理-逻辑上进行-正确总结-然后明确指出(可能-快速证明)解决方案

    干得好-谢谢你们两个-非常感谢...