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.

[参考译文] TM4C123GH6PM:TIvaware 中需要的帮助

Guru**** 2440240 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/627412/tm4c123gh6pm-help-needed-in-tivaware

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

大家好、

我正在尝试使用两个 Launchpad 上的 uart1模块连接其中的2个 tm4c123 Launchpad。 我使用的应用非常简单、按下一个 Launchpad 上的开关>>打开另一个 LaunchPad 上的 LED。

问题是我配置了这些设置、这样它将在 launchpad (PF0、PF4)的 sw1和 SW2的下降沿发生中断、但我发现中断仍然发生在 PF1、PF2、PF3的下降沿。

下面是端口 f 初始化:

void PORTF_Init (void){
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOF));

GPIO_PORTF_LOCK_R = 0x4C4F434B;
GPIO_PORTF_CR_R |= 0x01;
GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、GPIO_PIN_0|GPIO_PIN_4);

GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);

GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_0|GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);

GPIOIntTypeSet (GPIO_PORTF_BASE、GPIO_INT_PIN_0|GPIO_PIN_4、GPIO_FALLING_EDGE);

GPIOIntRegister (GPIO_PORTF_BASE、PORTF_ISR);

GPIOIntEnable (GPIO_PORTF_BASE、GPIO_INT_PIN_0|GPIO_INT_PIN_4);


}

任何人都可以帮助吗?

谢谢、

斯里特

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

    [引用 user="sarea Hariri "]我发现中断仍在 PF1、PF2、PF3的下降沿发生。[/引用]

    应该注意的是、您已" PF1、PF2和 PF3配置为输出"-有鉴于此、PF1 - PF3 (真的)是否生成(PinInt 约束) Port_F 中断?  您最近检查过吗?

    此外-您采用的是"GPIOIntEnable()"-不应该是"GPIOPinIntEnable()"   ("PinInt"函数(我认为)可产生 您搜索的"更具选择性"(端口 PIN)中断。  (在过去的 StellarisWare 下)

    最佳做法是在您的其他端口 F 中断调用之前使用"IntDisable()"后跟"GPIOPinIntDisable()"!

    再说一次-我相信您使用"GPIOPinIntEnable()"将"将您的中断限制在该函数调用中列出的那些中断-解决您的问题...

    下面是"正常工作、模型端口引脚中断配置。 代码"(根据 StellarisWare 9453开发-客户要求)、(希望)对其进行了说明/澄清。  (TivaWare 可能会指示(某些/轻微)更改...)

    ROM_GPIOPinTypeGPIOInput (PIN_Target_port、(PIN_TargetA_PIN | PIN_TargetB_PIN | PIN_TargetC_PIN));

    ROM_GPIOPadConfigSet (PIN_Target_port、(PIN_TargetA_PIN | PIN_TargetB_PIN | PIN_TargetC_PIN));、GPIO_Strength _2mA、 GPIO_PIN_TYPE_STD_WPU);

    ROM_GPIOIntTypeSet (PIN_Target_port、(PIN_TargetA_PIN | PIN_TargetB_PIN | PIN_TargetC_PIN); GPIO_BLE_边缘);

    然后:

    ROM_IntDisable (INT_GPIOF);  //  根据需要调整"INT_GPIOF"-以适应"TivaWare"

    ROM_GPIOPinIntDisable (PIN_Target_port、(PIN_TargetA_PIN | PIN_TargetB_PIN | PIN_TargetC_PIN)); // 我们已唯一定义"PIN_Target_port & PIN_Target (n)_PIN"

    ROM_GPIOPinIntClear (PIN_Target_port、 (PIN_TargetA_PIN | PIN_TargetB_PIN | PIN_TargetC_PIN));

    ROM_GPIOPinIntEnable (PIN_Target_port、 (PIN_TargetA_PIN | PIN_TargetB_PIN | PIN_TargetC_PIN);

    ROM_IntEnable (INT_GPIOF); //  根据需要调整"INT_GPIOF"-以适应"TivaWare"

    请注意、我们的首选项(到目前为止)是"在启动文件中嵌入 ISR 的名称、从而避免"注册"中断的任何要求。   (即 RAM 吞噬)

    纯粹主义者更希望您使用"映射"而不是 ROM 调用...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    主席先生,
    PF1-PF3在下降沿上生成中断. 我在 RIS 寄存器中检查(在 CCS 中使用单步执行)。
    其次,我使用的 TIvAware 软件包中没有函数具有"GPIOPinIntDisable()"原型。
    此外、我认为、tm4c123只允许我们对整个端口使用一个 ISR、因此、我应该检查 ISR 中的 RIS 以查找导致中断的引脚。

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

    谢谢您-我已将代码示例添加到我(之前)的帖子中。   接受所提供的代码在"数千"个已发运的电路板上有效!

    请注意、您的"检查 RIS -带端口 ISR "既巧妙又正确。  也就是说、"PinInt()"函数(缩写)尝试限制从而减少能够影响 RIS 的引脚数量。  (这是一件"好事"-是不是吗?)

    如上所述-客户(需求)我们使用"更成熟/更稳定"的 StellarisWare -您必须在您的"vendorWare"版本下找到"最合适的功能"(即最佳匹配)。

    我的建议是:"GPIOPinIntEnable()",你没有提到,也没有注意到,你的代码完全不存在!   其目的是允许(您所需的)单个 PIN 中断!   为什么是这样?

    如果您努力响应:

    • 没有提到(任何) "GPIOPinIntEnable()"-我认为这是"至关重要的"

    • PF1-PF3 -由您配置(由您的代码显示)作为输出-(真正)是否会生成(PinInt 受限) Port_F 中断?

    反过来、我将代表您找到时间来"比较/对比"过去的 StellarisWare 与供应商的(原谅) Buggy 更新版本-寻求最佳匹配。   您可以"快速、轻松、增强"我的工作、方法是(首先)在您的 API 下进行搜索-查找与我注意到的功能相匹配的过去。   我们公司目前正在"移动我们的外部仓库"、过去2天在芝加哥(美国)看到(记录)高温(>94°F)、我们"回到这里"(是-即使在周六和周日)、因此我的退货将"在当天晚些时候..."   (同样、根据您按要求作出回应的但书、这证明是相当公平的、不是吗?)

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

    主席先生,

    关于您的代码和函数,如“GPIOPinInt***()”原型:

    TIvaware 中没有任何功能可以禁用或启用引脚级别(单独)的中断。我拥有的所有功能都在整个端口上。

    但我想我只能使用"GPIOIntTypeSet (...)"根据某些引脚来触发端口 f 中断。 功能. 由于第二个参数指定了用于触发的所需引脚,我知道。 那么为什么即使我在第二个参数中没有传递中断、PF1 - PF3也仍然在下降沿生成中断呢??

    我希望我的问题是清楚的。

    谢谢

    斯里特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、
    感谢您分享您的示例代码。 在 TivaWare 驱动程序库中、现在使用的是 GPIOIntEnable 而不是 GPIOPinIntEnable()。

    您好、Sarea、
    我不会发现您的代码有任何问题。 请打开寄存器浏览器窗口并检查 GPIODIR、GPIOIS、GPIOIBE 和 GPIOIM 等寄存器。 是否确实将1、2、3配置为输出? 它们有哪些中断屏蔽? 将这些寄存器中的 PF1、2、3设置与 PF0、4进行比较。 我想不出为什么如果 P1.2、3配置为输出、那么它们会生成中断的原因。 另请遵循 CB'1建议、在为引脚0、4启用中断之前先清除所有中断标志。

    作为实验、如果您注释掉 GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3)行、该怎么办。 您是否仍然看到为它们设置的 RIS 标志
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="sarea Hariri"] TIvaware 中没有禁用或启用引脚级别(单独)中断的函数。我拥有的所有函数都在整个端口上。

    您的那句话是"出色的"-非常好的工作-完美的总结!   做得非常好!

    话虽如此-您(或许其他人也是如此)现在是否能理解"为什么我公司的"关键客户"坚持要求我们(仅)使用 StellarisWare 9453?"   (被称为"无故障且稳定!" 同时支持 LM3S、LX4F 和 TM4C123。  (经过细微修改(PIN_MAP.h))

    确实增加了一些(简洁的)功能、但"稳定性和稳健性"非常重要、并且决定了我们的选择。

    我建议您/他人使用"GPIOPinIntEnable()"-如果确实没有较新的 API -可能会被"创建"-并且通过审查过去的源代码来减轻这一工作。

    然后-该源代码: (此供应商的属性-还在公共域中)

    //
    //
    //! 为指定引脚启用中断。
    //!
    //! \param ulPort 是 GPIO 端口的基址。
    //! \param ucpins 是引脚的位封装表示。
    //!
    //! 解除屏蔽指定引脚的中断。
    //!
    //! 引脚使用位封装字节指定、其中每个位都是
    //! 置位表示要访问的引脚、以及字节的位0的位置
    //! 代表 GPIO 端口引脚0、位1代表 GPIO 端口引脚1、依此类推。
    //!
    //! \无返回。
    //
    //
    无效
    GPIOPinIntEnable (unsigned long ulPort、unsigned char ucpins)

    //
    //检查参数。
    //
    assert (GPIOBaseValid (ulPort));

    //
    //启用中断。
    //
    HWREG (ulPort + GPIO_IM)|= ucpins;

    //
    //
    //! 禁用指定引脚的中断。
    //!
    //! \param ulPort 是 GPIO 端口的基址。
    //! \param ucpins 是引脚的位封装表示。
    //!
    //! 屏蔽指定引脚的中断。
    //!
    //! 引脚使用位封装字节指定、其中每个位都是
    //! 置位表示要访问的引脚、以及字节的位0的位置
    //! 代表 GPIO 端口引脚0、位1代表 GPIO 端口引脚1、依此类推。
    //!
    //! \无返回。
    //
    //
    无效
    GPIOPinIntDisable (unsigned long ulPort、unsigned char ucpins)

    //
    //检查参数。
    //
    assert (GPIOBaseValid (ulPort));

    //
    //禁用中断。
    //
    HWREG (ulPort + GPIO_IM)&=~(ucpins);

    请注意、供应商声称(过去的) LX4F 基本上由 TM4C123复制-并且商号/我已确认、LX4F 和 TM4C123上的过去代码都成功了!

    由于代码非常有限-很难理解"为什么"这被"绕过"-并且(相对)很容易"移植到 vendorWare 的(唯一)版本中。  (当新版本发布时-此添加项将"丢失"-该选项驻留在用户...

    您可能希望"尝试"(尤其是考虑到此(如此短)源列表)并报告您的结果...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles 和 CB1、
    最后我发现了错误。。。 我在 main 中错误地使用了"GPIOIntStatus(**,**)"。 也就是说、我传递了第二个参数"false"、而不是"true"。
    该函数将返回原始中断状态或" false "或"true"的屏蔽中断状态、分别作为第二个参数传递。

    但这里有一个新问题.. 当发生下降沿时、为什么 RIS 寄存器在 PF1、PF2和 PF3上上升一个标志、即使我使用" GPIOIntTypeSet (**、**、**)"、而只有 PF0 | PF4作为第二个参数传递(原始帖子中包含的代码)。


    谢谢、此致、
    斯里特
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sarea、
    硬件的行为与您所描述的类似有点奇怪。 目前、我家里没有用于运行实验的工作台设置。 您能否从临时浏览器窗口中首先确认 GPIODIR 寄存器中的设置? 它说什么? 也许您可以获取所有 GPIO 寄存器的屏幕截图并向我们展示。

    您是否对 OCDE 中的 P1.2、3引脚执行过任何写入操作? 您的代码中是否有任何地方可以再次更改 PF 端口的引脚方向? 如果您注释掉 GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3)行、该怎么办。 您仍然看到为它们设置的 RIS 标志吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我"希望"上述帖子-如果该能力(已被允许)继续。

    供应商 Charles 对"PF 写入、PF 配置更改和 PF 输出删除"的识别实际上是(也是)禁止的"kiss"的主要说明、该"简化、增强"设计和开发、将操作限制为"最具体和最简单..."的操作。   正如 Charles 所指出的那样、加入这一组合有可能会添加"问题和复杂问题"、因此应该避免!