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.

[参考译文] CCS/TM4C123GH6PM:API 函数 PWMGenConfigure 卡在 FaultISR 无限循环上

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/602615/ccs-tm4c123gh6pm-api-function-pwmgenconfigure-stuck-at-faultisr-infinite-loop

器件型号:TM4C123GH6PM
主题中讨论的其他器件:TM4C123

工具/软件:Code Composer Studio

我尝试在 TI 板上使用 PWM。 当我在调试模式下使用单步进入时、我发现了这个问题。 我的代码如下所示:

#include "inc/tm4c123ghp6.h"
#include 
#include 
#include "inc/hw_memmap.h"
#include "driverlib/pwm.h"
#include "driverlib/gpio.h"
#include "inc/hw_gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"


void PWMInitTom (void){void
SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);//启用 PWM0外设
//while (!SysCtlPeripheralReady (SYSCTL_Periph_PWM0)){//等待 PWM0模块准备就绪。*/}
SysCtlPWMClockSet (SYSCTL_PWMDIV_1);//将 PWM 时钟设置为系统时钟
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);//启用 GPIOB
GPIOPinConfigure (GPIO_PB6_M0PWM0);//配置 GPIO 引脚以选择 PWM0功能
GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_6);//为此引脚配置 PWM 功能。

//将 PWM 发生器配置为递减计数模式并立即更新参数。
PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);

//设置周期。 对于50KHz 频率、周期= 1/50、000或20
//微秒。 对于一个20MHz 时钟、这转换为400个时钟周期。
//使用此值设置周期。
PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、400);
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、100);//将 PWM0的脉冲宽度设置为25%占空比。
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、300);//将 PWM1的脉冲宽度设置为75%占空比。
PWMGenEnable (PWM0_BASE、PWM_GEN_0);//启动发生器0中的计时器
PWMOutputState (PWM0_BASE、(PWM_OUT_6_BIT | PWM_OUT_7_BIT)、TRUE);//启用模块0上 PWM6和 PWM7的输出

}

无符号长周期频率、宽度、周期、pwmfreq;

int main (void){
SysCtlClockSet (SYSCTL_USE_PLL |SYSCTL_SYSDIV_10| SYSCTAL_XTAL_16MHz |SYSCTL_OSC_MAIN);//将时钟设置为20MHz
FREQ = SysCtlClockGet ();
PWMInitTOM();
pwmfreq = SysCtlPWMClockGet ();
宽度= PWMPulseWidthGet (PWM0_BASE、PWM_OUT_0);
周期= PWMGenPeriodGet (PWM0_BASE、PWM_GEN_0);
while (1){

}
} 

因此、当 CCS 尝试编译 PWMGenConfigure 时、它会跳转到 FaultISR 并一直停留在那里。  

当我使用示例文件(inver.c)时、我遇到了同样的问题。  PWMGenConfigure 导致了该问题。

我已将 pwm.c、sysctl.c、gpio.c 添加到我的项目中。  

有人能解释一下吗?

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Tom、
    您是否见过此应用手册?
    www.ti.com/.../spma043.pdf

    后续问题最好在 TM4C 论坛中解答。

    谢谢
    Ki
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Ki 的参考。 我发现 SysCtlPeripheralEnable (SYSCTL_Periph_PWM0)实际上无法启用我的 PWM0外设。 尽管我向系统添加了1秒延迟、但我的 PWM0仍处于禁用状态。 我还尝试添加 while 循环以延迟
    while (!SysCtlPeripheralReady (SYSCTL_Periph_PWM0)){//*等待 PWM0模块准备就绪。*/}
    但更糟糕的是、由于 PWM0从未启用、因此系统始终处于该 while 环路。
    我的结论是 SysCtlPeripheralEnable 不起作用。
    有什么解决方案?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是最好在 TM4论坛中向专家提问的问题。 我要将此主题移至该论坛。

    谢谢
    Ki
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Ki。
    我想添加1个附加信息。
    我测试了 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB)并且 GPIOB 外设已成功启用。
    只有 SysCtlPeripheralEnable (SYSCTL_Periph_PWM0)有问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在启用 PWM0之前、使用过去的(LX4F)器件-我们的工作正常、但我们启用了 Port_B。

    我知道我们最近取得了更大的成功-使用您的 MCU -员工正在寻找该代码...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    您的问题与下一行有关。 PWM0发生器只能将 PWM_OUT_0_BIT 和 PWM_OUT_1_BIT 置为有效。 PWM_OUT_6_BIT 和 PWM_OUT_7_BIT 用于 PWM3_base。

    PWMOutputState (PWM0_BASE、(PWM_OUT_6_BIT | PWM_OUT_7_BIT)、TRUE);//在模块0上启用 PWM6和 PWM7的输出

    请更改为下面并重试。

    PWMOutputState (PWM0_BASE、(PWM_OUT_0_BIT | PWM_OUT_1_BIT)、true);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、感谢您的关注和抽出宝贵的时间。
    我更改了该行、但 SysCtlPeripheralEnable (SYSCTL_Periph_PWM0)仍有问题。

    并且我在 PWMOutputState (PWM0_BASE)之前调用 SysCtlPeripheralEnable (SYSCTL_Periph_PWM0)、(PWM_OUT_0_BIT | PWM_OUT_1_BIT)、true)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、这很奇怪。 我刚运行代码时仅更改了 PWMOutputState (PWM0_BASE、(PWM_OUT_0_BIT | PWM_OUT_1_BIT)、true)、并且能够在示波器上看到50kHz PWM。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    再次感谢 Charles。 至少我知道我的代码不是主要问题。 我想我的板有一些问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Tom、
    我还测试了 inver.c、它在我的 TM4C Launchpad 上运行正常。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    MES Amis、

    PB_6引脚中的一个引脚是否"有天赋"、0Ω 其中一个引脚是"鼠疫干扰者"、从而与另一个 MCU GPIO 短路?
    然而、即使为 true、函数调用也不应(自身)失败。

    Charles -此海报是否已从"StellarisWare"导入代码(正如我们独家拥有的那样)、并且可能在 TIvaWare 下更改了参数"sysctl_Periph_PWM0"?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、
    SYSCTL_PERIPH_PWM0正确。

    您恰好在 PB6和 PD0之间的0欧姆。 最好由 Tom 检查 PD0是否连接到 VDD 或接地。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、Charles。

    任一种方式-如果 PD_0被配置为输出-并且订购的"高电平或低电平"-(较差) PB_6将受到影响。 (也许 PD_0也是如此(当两者都是输出并被驱动至相反的状态时)  如果这些电阻器保持不变、大多数保护程序是订购 PD0进入输入模式。

    最好的(我们已经发现)是"墓碑"鼠疫 R9,10 (断开他们的 MCU 与 MCU 的连接-并且 Tack 焊接一根导线-作为对 Big Brother (总是)的"乐于助人"(但又是侵入式)方式的准确提醒(坟墓场)!)    非常像在 CB1上"防晒霜"-当大白-口盖-正在关闭和最终...

    PWM0的 Periph 启用-在 Port_B 之前-是否会导致海报的问题? 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 CB1。 我还有 LX4F、我将在此测试 PWM。 我想问 LX4F 是否可以使用 TivaWare? 我从某个地方听说、LX4F 和 TM4C 是相同的。 是这样吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还尝试在 GPIOB 之前配置 PWM0。 仍然有问题:(
    我想我只会购买一个新电路板。
    非常感谢您的投入
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    实际上、LX4F 可以使用 TivaWare -但需要注意。 (您必须在 pin_map.h 中手动输入 LX4Fxyz、因为 TivaWare 中已"禁止"该操作)

    由于 StellarisWare 9453是"最后一个"支持 LM3S 和 LX4F 的 API -并且(近乎)具有项目符号-我们的客户"锁定我们进入 StellarisWare!" 并且-我们成功地使 StellarisWare 适应 TM4C123 (通过 pin_map.h 模块-可能还有几个(简单)其他模块)

    在启用 PWM0之前、请尝试启用 Port_B -请查看该功能是否得到纠正。 如果没有,请仔细查看"PWM.h",以确保"PWMGenConfigure()存在"及其参数符合您的预期。 非常非常奇怪的行为。

    并"墓碑"这些鼠疫-它将您的板标记为安全-并防止损坏。

    [编辑]... Tom -请勿丢弃您的板!   即使该引脚已损坏-您的主板(应该)的大部分都完好无损。   片刻之后-将 PB6配置为输出-并将其切换-监控行为。   ******只有在“用石头砸”这两个瘟疫的人之后才能这样做!  ***