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.
我有一个任务具有 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
巴勃罗
作为完整性检查、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
愿此(非常)谦逊的外部人员奖、"荣誉"给两人:
干得好-谢谢你们两个-非常感谢...