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:写入端口 B 会导致端口 D 上的中断???

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/605750/ek-tm4c123gxl-writing-to-port-b-causes-interrupt-on-port-d

器件型号:EK-TM4C123GXL

大家好、我花了很多时间来处理下面的代码、我一生都不能弄清楚奇怪的行为。  最初、此代码是我一直在处理的较大项目的一部分、但后来为了确定发生的情况、将代码剥离为基本内容(您在下面看到的内容)、问题仍然存在。

正如您在下面看到的、我已经将引脚 B0-Thru B7配置为通用数字输出、并将引脚 D0-Thru D3配置为通用数字输入。  D0至 D3引脚设置为触发中断。  我将这些连接到试验板上的一些典型按钮、以便在按下按钮时触发中断。

现在、所发生的情况是、每次写入 GPIO_PORTB_DATA_R 时都会莫名触发中断。  如果我注释掉对 GPIO_PORTB_DATA_R 的写入操作、则仅当我按试验板上的按钮时才会触发端口 D 中断(正如它应该的那样)。

此外、如果我更改 main 中的 while 环路、将单个值写入 GPIO_PORTB_DATA_R、它将触发一次中断(写入该初始值时)、然后再也不会 agin 以用于后续写入(始终具有相同的值)。  因此、它似乎仅在更新端口 B 数据中的值时触发端口 D 中断。

我不知道为什么会发生这种情况。  我已经按照数据表(第10.3节)中的 GPIO 配置步骤进行了操作、正如您将在 InitPortB 和 InitPortD 函数中的注释中看到的那样。

任何人可能有的想法都非常受欢迎、因为我对为什么会发生这种情况几乎没有任何想法。

#include 
#include "inc/tm4c123ghp6.h"

void InitPortB()
{
//步骤1:启用端口 D 的时钟
SYSCTL_RCGCGPIO_R |= 0x02;

//步骤2:设置方向(输出)
GPIO_PORTB_DIR_= 0xFF;

//步骤3:将引脚配置为 GPIOAFSEL -跳过、因为默认情况下引脚为 GPIO

//步骤4:跳过,我不关心驱动强度

//步骤5:跳过,不使用上拉、下拉或开漏功能

//步骤6:将配置为数字
GPIO_PORTB_DEN_R |= 0xFF;

//步骤7:跳过、不使用这些引脚的中断

//步骤8:解锁端口/引脚以允许写入
GPIO_PORTB_LOCK_R = 0x4C4F434B;
GPIO_PORTB_CR_R = 0xFF;
}

空 InitPortD()
{
//步骤1:启用端口 D 的时钟
SYSCTL_RCGCGPIO_R |= 0x08;

//步骤2:设置方向(输入)
GPIO_PORTD_DIR_R &=~0x0F;

//步骤3:将引脚配置为 GPIOAFSEL -跳过、因为默认情况下引脚为 GPIO

//步骤4:跳过,我不关心驱动强度

//步骤5:跳过,不使用上拉、下拉或开漏功能

//步骤6:将配置为数字
GPIO_PORTD_DEN_R |= 0x0F;

//步骤7a:在配置中断时禁用中断
GPIO_PORTD_IM_R &=~0x0F;

//步骤7b:配置 GPIOIS 寄存器中的 IS 域和 GPIOIBE 寄存器中的 IBE 域
GPIO_PORTD_Y_R &=~0x0F;//为边沿检测配置中断
GPIO_PORTD_IBE_R &=~0x0F;//中断生成由 GPIOIEV 控制
GPIO_PORTD_IEV_R |= 0x0F;//检测上升沿上的中断

//步骤7c:清除 GPIORIS 寄存器
GPIO_PORTD_RIS_R &=~0x0F;

//步骤7d:通过设置 GPIOIM 寄存器中的 IME 字段来取消屏蔽端口
GPIO_PORTD_IM_R |= 0x0F;

//步骤8:跳过、不写入引脚、因此不关心锁定


//启用端口 D 中断
NVIC_EN0_R |=(1<<3);
}

void PortDInterruptHandler()
{
GPIO_PORTD_ICR_R |= 0xFF;//清除中断
}

int main (void)
{
InitPortB();
InitPortD();

uint32_t 计数器= 0;
while (1)
{
if (计数器% 2 = 0)
{
GPIO_PORTB_DATA_R = 99;
}
其他
{
GPIO_PORTB_DATA_R = 0;
}
++计数器;
}
} 

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

    快速查看代码不建议任何内容。

    您可能遇到硬件问题?  PORD 的浮动输入是否足够接近 PORB 输出以耦合边沿?  也许可以尝试将所有未使用的端口 D 引脚设置为输出并为其提供一个值、以便对其进行驱动。

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

    这是否也是"疯狂"决定将端口 B 上的2个引脚直接连接到端口 D 的另一个表现?

    (声称已完成(长期)兼容性-但经常会造成(当前)折磨!   检查电路板原理图(LPAD)-标记了这些 Devil 引脚。   (通过放大可见...)  R9和 R10执行这种(普遍不需要的)住宿!

    0Ω“总是”地把那些“瘟疫”和“坟墓”的“鬼”都叫出来——这很好地把这些牌标记为“固定”。

    记录:PD0连接到 PB6、PD1连接到 PB7。    多年来、我一直敦促该供应商"以小袋包装提供这些瘟疫疫症患者"、这样那些寻求(过去) MSP 兼容性的"每个中心一个"(如果是这样)就可以避免许多主要人群所遭受的痛苦和痛苦!   (对"古代"兼容性毫无兴趣的人-对较小的 MCU ...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哦、是的、可以这么做。 从电路板上拆下 R9和 R10。 我从未使用过123 Launchpad -始终使用1294。

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

    [引用用户="Benjamin ***"]

    快速查看代码不建议任何内容。

    您可能遇到硬件问题?  PORD 的浮动输入是否足够接近 PORB 输出以耦合边沿?  也许可以尝试将所有未使用的端口 D 引脚设置为输出并为其提供一个值、以便对其进行驱动。

    [/报价]

    您好、Ben、感谢您的建议。  我只是按照您的建议尝试了这种方法、但不幸的是、同样的行为仍然存在。  不过、很有意思、尝试其他一些调整后、我发现我需要写入 GPIO_PORTB_DATA_R 的值必须大于63 (十进制)才能触发端口 D 中断。  63十进制等于00111.1111二进制。  然后、我还尝试了128个十进制数(1000.0000二进制数)、这也会触发中断。  

    因此、必须设置 B6和 B7。  我已经阅读(多次)数据表的第10.2.1.2节("数据寄存器操作")、没有发现任何问题。  根据本节中的信息、我很清楚地知道、我可以通过将0x4000.53FC 设置为0xFF 来为端口 B 设置所有引脚为高电平。  当然、GPIO_PORTB_DATA_R 被#defineed 为该存储器地址(0x4000.53FC)、该地址被强制转换为非引用的易失性 uint32_t 指针...  所以,我在这里没有发现任何问题:(

    我将尝试从端口 B 切换到另一个端口、看看问题是否仍然存在。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、正如 CB1指出的、PB6和 PB7通过 R9和 R10连接到端口 D
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ^抱歉,我写了我之前的回复,而你们两个人都发布了。。。 所以、我的想法被正式打动了。 您是否建议*物理*从电路板上移除电阻器 R9和 R10? 我是一名软件开发人员、不是真正的硬件开发人员(而且已经足够老、可以了解我的限制)。 我有一个烙铁、烙铁的烙铁头比#2铅笔小一点(不是铅笔的磨尖点)。 老实说、我甚至不应该拥有一个焊接烙铁。 )
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不用开玩笑、如果您担心焊接问题、只需将其从电路板上破裂即可。 只需用一对尖嘴抓住它们、然后挤压即可。 陶瓷将会爆炸很多。 无需担心。

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

    我必须感谢海报 Ben 在纪念我对臭名昭著的 R9和 R10的"首次识别"方面表现出的善意。
    移除-理想情况下、每个电阻器都要使用墓碑。 (例如、将其粘在一个焊盘上-垂直(例如、一个坟墓石)这是一个清晰的视觉确认、即您已经"准备好此板进行实际维修"(不希望出现"兼容性"-这直接导致您(和数百人)的疼痛和痛苦!

    任何六岁的儿童(配备手机)都应能够焊接。 (除非禁止此类"奴隶劳动"、否则您所在的国家/地区...)

    除了“海报本”之外——从痛苦的经历——虽然不适合 Terrence——“墓碑建议”也很好地将此类板标记为“使用准备就绪!”   我们已经使用了100块这样的板-并且总是并且只"把那些(令人愉快的)鼠疫-伊斯达人"!    (即使是"拾取就地和20英尺回流烤箱-也没有意义来重复(否则)做得很好的事情。   我们(稍微)修改 PCB -以避免"限制性电路板使用指南...")

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我确信它可以正常工作、但在任何类型的高振动环境中、留下墓碑部件都是一个大不可接受的选择。 如果器件没有断裂、那么它最终可能是 FOD、或者更糟糕的是、将坏器件从电路板上拔出并使用它走线。 强烈建议完全去除电路板上的油漆点、以直观地指示完成情况。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的-当然、你是对的! 然而、对于内部实验、墓碑是"明确"的(真正的"砰砰")、这是我们的目标。

    如果我可以(暂时)将我的"专利手"从我的背面移走-我们仍然有"工作要做!" 在其目标端口上存在内部无中断交叉连接这一事实-也许不能完全解释中断是如何被错过的。 (除非将其中一个"绑定的针脚"设置为输出-但如果有必要、我会(首先)追逐"低挂果"并读取下游代码...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    错过了吗? 中断被配置为改变/边沿检测中断。 向 PORTB[7:6]写入相同的值不会触发中断。 我想它每次都是根据连接的端口引脚启动的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想说的是(我承认只有"短暂扫描"代码)、"不应该配置和/或启用端口 D 中断"-端口 D 上的此类"意外"(可能非法)中断-熊验检查-它们是否不会?   如果在 D 港有海报“想要”中断——他到达后的“惊喜”(和论坛抗议)——不会有结果!   这就是我们错过的!

    重复海报的主题行:"写入端口 B -在端口 D 上产生中断!"    除非端口 D 经过专门编程并启用、以识别此类中断-否则我发现该行为(端口 D 中断)"仍然"、原因不明...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    端口 D 配置为边沿中断。 原始海报确实需要端口 D 中断并将其配置为这样。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的-抱歉让你读过代码-他的标题没有明确这一事实(尤其是)-在我看来、似乎(只有)端口 B 在到达"写入"时应该响应(中断)。

    感谢你的努力-也许我们可以"分享"通过放逐这些瘟疫的人而实现的"修复"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    无论如何、您不应在生产中使用这些板。

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

    抱歉、大家、我得走了一会儿。  感谢您提供更多信息。  此外、对于标题中的任何含糊之处表示歉意、它没有具体说明我是要在端口 D 上发生中断、只是需要它们独立于端口 B 的数据。

    所以、我按照您的建议-就在一分钟前移除了电阻器-成功-在设置 PB6或 PB7时不再触发中断 D。  非常感谢大家。  在过去的几天里、我花了很多时间尝试弄清这里发生了什么、如果没有您提供的信息、可能无法找到它的底部。  我可能会切换到另一个端口、这对我来说仍然是一个谜、可能会在将来导致额外的无希望调试。  非常感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴这一切都为您解决了。