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:TM4C123中的中断优先级

Guru**** 2526700 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/837247/tm4c123gh6pm-interrupt-priority-in-tm4c123

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

您好!

我正在尝试使 FXOS8700 accelmag 和 FXAS21002陀螺仪与 TM4C123 MCU 配合使用。 到目前为止、我编写了 i2c 驱动程序、使传感器初始化并生成中断、处理这些中断并从 i2c 读取数据。 发生的情况是、如果我将代码配置为仅与一个传感器一起工作、它就会工作、但是如果我有两个中断、一段时间(例如30-60秒)后、中断处理机制中的一个会失败。

以下是代码的相关部分:

//陀螺仪中断引脚设置
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
GPIOPinTypeGPIOInput (GPIO_PORTC_BASE、GPIO_PIN_4);
GPIOPadConfigSet (GPIO_PORTC_BASE、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD);
GPIOIntDisable (GPIO_PORTC_BASE、GPIO_PIN_4);
GPIOIntClear (GPIO_PORTC_BASE、GPIO_PIN_4);
GPIOIntRegister (GPIO_PORTC_BASE、gyro_ISR);
GPIOIntTypeSet (GPIO_PORTC_BASE、GPIO_PIN_4、GPIO_FALLING_EDGE);
GPIOIntEnable (GPIO_PORTC_BASE、GPIO_PIN_4);

// accelmag 中断引脚设置
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
GPIOPinTypeGPIOInput (GPIO_Porte _BASE、GPIO_PIN_2);
GPIOPadConfigSet (GPIO_Porte _BASE、GPIO_PIN_2、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD);
GPIOIntDisable (GPIO_Porte _BASE、GPIO_PIN_2);
GPIOIntClear (GPIO_Porte _BASE、GPIO_PIN_2);
GPIOIntRegister (GPIO_Porte _BASE、accelmag_ISR);
GPIOIntTypeSet (GPIO_Porte _BASE、GPIO_PIN_2、GPIO_RISE_EDGE);
GPIOIntEnable (GPIO_Porte _BASE、GPIO_PIN_2); 

PC4配置为下降沿、PE2 配置为上升沿、连接到传感器板、陀螺仪配置为生成有源0输出(用于下降沿)、accelmag 板配置为生成有源1输出。

//陀螺仪中断服务例程
void gyro_ISR (void){
if (GPIOIntStatus (GPIO_PORTC_BASE、false)& GPIO_PIN_4){
GPIOIntClear (GPIO_PORTC_BASE、GPIO_PIN_4);
gyro_data_ready = true;
}
}

// accelmag 中断服务例程
void accelmag_isr (void){

if (GPIOIntStatus (GPIO_Porte _BASE、false)& GPIO_PIN_2){
GPIOIntClear (GPIO_Porte _BASE、GPIO_PIN_2);
accelmag_data_ready = true;
}
}

这里是中断处理程序。 它们只标记 volatile 布尔值、以便我可以从主循环读取传感器。

在主循环中、我检查这些布尔值、然后读取数据:

while (1){

//CURRENT_TIME = nh.now();

if (gyro_data_ready){
GyroGetData (FXAS21002C_address、&gyroRD);
gyro_data_ready = false;
}

if (accelmag_data_ready){
AGGetData (FXOS8700地址、&accelRD、&magRD);
accelmag_data_ready = false;
}
} 

无论我尝试了什么、我都无法消除此错误。 accelmag 的高电平有效中断卡在1、这意味着传感器未被读取(这将清除传感器上的中断)

一开始我以为这与 FXOS8700 accelmag 或 FXAS21002陀螺仪传感器有关、但此时我认为这与中断有关。 在某种程度上、传感器上升中断线路、但中断不会触发、因为会发生其他中断。 要支持此理论:

答:通过仔细检查两条中断线路、(通过录像)我可以证明、当两个中断同时触发时、会发生功能错误。

b.我将故障 accelmag 中断从 PE2替换为 PB4。 这一次 PC4上的另一个中断线路失败(来自陀螺仪)

下面是视频链接: twitter.com/altineller/status/1170381044115283973 (我必须将其放在 Twitter 上、因为 Vimeo 看起来不像示波器射门)

对有关该问题的任何想法、帮助和建议都非常赞赏。

此致、

CAN

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

    您好 CB1_MOBILE、

    我会尽快尝试这些方法。 我已经尝试通过 USB 移动电源为电路板供电、笔记本电脑从电源断开。

    Adafruit 板具有一个 mich5225稳压器。 它由评估板的 USB VBUS 供电。 USB 可提供高达2A 的电流。 如果我使用 launchpad 的3V3为电路板供电、这可能会耗尽 tps76333的电量、但我会尝试使用可调实验室电源为电路板供电、看看会发生什么情况。

    "当 此类"推挽"信号切换时、'电压转换器'的传感器板供应商作为'毛刺脉冲'的(强)候选器件!   而(那)正是当-"毛刺脉冲出现在海报上(否则)原始 SCL 信号线上的时间。    (中断的"


    该部分非常好。 我怀疑电压转换器、不知道为什么。 这是一个很好的解释。

    此外、当我切换到 usbee ax 到24MHz 捕获时、在 i2c 解码上、*在某些失败中*-它将按预期显示所有数据包。 但存在 i2c 时钟尖峰。

    此外、我将 i2c 读取语句从 ISR 中更改过来、并将其放入主循环中。 使用此设置时、有一件事发生了变化。 陀螺仪或加速仪都可能以相同的方式失败。 大多数情况下 accelmag 传感器出现故障、但有时陀螺仪会以相同的方式出现故障。

    是的、我认为这个问题和传感器的神秘尚未完成、但我们可以观察和复制故障、因此错误"已被忽略"

    element14还制造了另一个版本的传感器板:element14.com/community/docs/DOC-75622/l/breakout-board-with-the-fxas21002c-and-the-fxos8700cq -它没有电压转换器或板载稳压器、因此我认为它更合适。

    我还在考虑移除这些 MOSFET 电压转换器和上拉电阻器

    此致、

    C.

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

    您好 Can. 我的"最终"建议是使用 I2C 转串行(RS-232/TTL)转换器并将串行边缘的 Tx 引脚回路到 Rx 引脚。

    因此、无论您发送到 MCU 的 I2C 总线(也尝试一些测试数据)、它最终都会发送回 MCU 上的 INT/读取例程。 如果

    一切都很正常-没有缺失/故障读数、然后使用两(2)个 I2C 至串行转换器、一个插在 MCU 的 I2C 总线上、然后

    一个连接到传感器的 I2C 总线上。 然后是两个串行边沿、Rx 到 Tx。 让游戏开始。 从完全相同的电压为所有器件供电  

    源。  此类转换器的一个良好来源可能是: https://www.sparkfun.com/products/retired/9981 或 export.farnell.com、您可以从中获得  

    几天内完成所有工作。  这些是便宜的转换器。 这样、我估计您/我们所有人最终将确定的核心来源  

    问题。 随时向我们提供最新信息。

    John

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

    [引用 user="can altineller"]我将尝试使用可调实验室电源为电路板供电、看看会发生什么情况。

    我们认为这很有道理-尤其是在实验室电源可以提供5V @ 2A 或更高电压的情况下。   正确的电源及其分配/输送始终是"要求#1 "。

    "SCL 上产生的干扰"与传感器中断的切换(H -> L)同时发生这一事实表明:

    • 传感器问题
    • 或"电路困难"接受中断的"强/突然"负边沿

    最简单的解决方案之一是在传感器的"int"引脚和 MCU 的接收 GPIO 之间施加串联电阻(1K - 2k2)。   重新访问配置 GPIO 的代码并确保它一直被设置为输入不会有任何问题。   (我将其输出电流设置为最小值-以防万一)

    "分辨率"的第二个元素是在传感器的"SCL"线路上添加了一个100K 下拉 R -。   (在电压转换器和传感器之间-不在 MCU 侧。)   0.005µF 在传感器的 SCL 引脚附近安装一个小型陶瓷旁路电容器(μ F 作为起始电容器)、可提供额外的保险。

    人们认为、这种方法的"易用性、速度(无运输)和成本"(低于低)证明是非常可取的...

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

    您好!

    我尝试了以下操作:

    a.在 MCU 和传感器中断输出之间插入2.2K、4.7K、10K:10分钟内未崩溃。 我几乎以为它已经解决了。

    b.使用漏极开路配置传感器并使用上拉线:结果与以前相同、在10秒内崩溃。 [这些被上拉至传感器的3V3侧]

    c.使用10K 下拉 SCL:结果与10秒内崩溃的结果相同。 [但是、 这是从 MCU 侧下拉的、我在看到您的上一篇帖子后意识到我做了错误。

    我也无法在 a 中捕捉失败。我可能能够设计出一种方法来实现这一目的。 (触发脉冲视图以停止记录、只需保留 N 个数据点并将其从另一侧删除)

    明天、我将拜访我的"高技能"朋友、移除 MOSFET 以及附带的上拉电阻器、只需去掉电压分压器部件即可。 基本上、我将移除 Q1、Q2、R3、R4、并使用一根细特氟龙线焊接每个 Q1、Q2的第2个和第3个引脚、使 R1和 R2上拉至传感器侧3V3。 这将是一个小小的 Frankenstein、但 电压转换器在实验中是一个很大的"if"-所以我认为最好的摆脱它们的方法。

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

    感谢您-现在让我们开始今天的"交叉考试":

    [引用 user="can altineller"]a. 在 MCU 和传感器中断输出之间插入2.2K、4.7K、10K:10分钟内未崩溃。 我几乎以为解决了。[/引述]

    您知道吗... 我们在美国芝加哥一直听到您的"原始屏幕"(来自土耳其)!   完成此操作后-您是否仍处于默认(Int 为推挽)加速模式?

    • 您的 MCU 是由 LPAD 的线性稳压器供电的3V3、而 accel 传感器是由传感器板的稳压器供电吗?   这不是一个好的设计做法。  (这些不同的耗材"不太可能"享受"紧急"。)  在"H->L"转换期间观察'Int'线路(请示波器)对您来说"非常有用"-怀疑(发生"锁定"时) 此信号驱动(低于)接地-甚至可能"振铃"。
    • 如果需要注意此类负电压摆幅-安装肖特基二极管-使负电压摆幅被钳位在比接地低几百 mV 的位置。
    • 如果 观察到信号"振铃"(产生峰值>3V3的电压)-安装第二个肖特基二极管-使"振铃瞬态"被钳位到 比3V3高几百 mV 的水平。
    • 我们认为、尽可能靠近传感器的 SCL 引脚放置的"陶瓷旁路电容器"以及~10K 系列 R 可能会证明"尤里卡"。   (将下拉电阻更改为"更早"的100K 建议值-而非10K)

    如果您满足以下条件、则从未透露过:

    • 已放置 SCL 线路-穿过 MCU 板至传感器板-带"固定电缆"。
    • 并将 SCL 导线尽可能远离"信号包"、以减少(预期)不必要的信号/尖峰耦合