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.

[参考译文] MSPM0G3519-Q1:SysTick 工作异常和 ISR 中断 Tick_Handler

Guru**** 2781785 points

Other Parts Discussed in Thread: MSPM0G3519

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1612667/mspm0g3519-q1-systick-work-abnormal-and-lost-isr-systick_handler

器件型号: MSPM0G3519-Q1
主题: MSPM0G3519 中讨论的其他器件

您好 TI 支持团队:

我目前正在使用 MSPM0G3519 机房数量、并在遇到问题时遇到 SysTick 中断偶尔不会触发 亮起。

系统配置

  • 器件: MSPM0G3519
  • 时钟源: SYSOSC @μ V 32MHz
  • SysTick 时基: 500µs
  • 监视方法: 切换 GPIO 引脚 PA9 在 SysTick ISR 内部观察示波器/逻辑分析仪的时序

问题描述

有时、SysTick ISR 似乎也成立 错过或延迟
在示波器上、PA9 切换显示预期的稳定 500µs 周期有时会延长、表明中断没有在时间上触发。

 补充证据

为了排除我自己代码中的问题、我还测试了 使用 TI SDK 中 FreeRTOS 的闪烁演示 、使用 FreeRTOS 无节拍模式
不过、 会发生相同的时序问题 —SysTick /计时器节拍偶尔会超出预期间隔。

这表明该问题可能与以下各项有关:

  • 时钟配置
  • 32MHz SYSOSC 上的计时器/SysTick 行为
  • 中断控制器时序
  • 闪存等待状态或预取行为
  • 低功耗进入/退出时序
  • 其他硬件级限制或勘误表

向 TI 提问

  1. 是否存在与 MSPM0G3519 上的 SysTick 或中断延迟相关的任何已知问题或勘误表?
  2. 时钟或中断控制器中是否存在可能导致 SysTick 中断丢失的配置依赖关系?
  3. SysTick 是否‑低 μ A 功耗状态、闪存等待状态或长时间运行的关键部分?
  4. 是否建议了测试方法或设置来确保 32MHz SYSOSC 上的 SysTick 时序稳定?

 

 提前感谢您的支持!

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

    请您帮助澄清以下内容:

    1. 为什么 IAR 优化会影响 MSPM0G3519 的运行时行为?
    2. 有任何问题 与优化相关的已知问题 开发 MSPM0 或 TI 驱动程序库的完整源代码?
    3. 我们是否需要应用任何特殊情况 编译器标志、易失性限定符、存储器屏障或 pragma 启用优化时?
    4. 是否有官方的 TI 指南或应用手册 在 MSPM0 器件上优化 IAR
    5. 是否有特定于 MSPM0 的编码规则来防止优化器删除或重新排序关键指令(例如寄存器访问,ISR 更新,标志轮询等)?

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

    您好 Tuan、

    我有你的问题。 本周、请给我一些时间来检查和测试您的问题。 也许会有一点点延迟,因为明天我将去出差。 但我会尽快回复你。

    BR、  

    Janz Bai

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

    你好 Janz Bai、

    在我深入研究后、调查问题。 我发现了与 ISR SysTick 无关的根本原因、它在监控 ISR SysTick 期间使用切换引脚。

    1.第一种方法,在 IAR 中优化很高,有时会丢失信号

    /*设置 PB26 */

     GPIOB->DOUTSET31_0 |= 0x04000000

     /*清除 PB26 */

     GPIOB->DOUTCLR31_0 |= 0x04000000
    2.第二种方式,与优化的高和切换工作良好
    /*切换 PA9 */
    GPIOA->DOUTTGL31_0 =(1U << 9)
    系统 Tick_Handler(空)
      /*将 PB26 输出值设置为高电平(位 9 = 0x00000200)*/
      GPIOB->DOUTSET31_0 |= 0x04000000
      /*将 PB26 输出清除为低电平(位 9 = 0x00000200)*/
      GPIOB->DOUTCLR31_0 |= 0x04000000

      /*切换 PA9 */
      GPIOA->DOUTTGL31_0 = 0x00000200

      //如果已触发 SysTick 挂起状态、请清除该状态
      SCB->ICSR = SCB->ICSR |(1<<25);//设置 PENDSTCLR 位以清除 SysTick 挂起标志
    }

    我的问题:

    1. 设置/清除和切换之间的硬件级别差异是多少?
    2. 是否设置/清除/切换原子操作?
    3. 使用这些寄存器时是否存在任何读取‑修改‑写入问题?
    4. 与 SET+CLR 序列相比、使用 DOUTTGL 时是否具有任何时序或性能优势?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

        GPIOB->DOUTSET31_0  |=  0x04000000

    这是一种非常特殊的用法;DOUTSET 通常与写入一起使用,而不是与读取 — 修改-写入一起使用。 (类似地,DOUTCLR/DOUTTGL)。 我的观察是、此寄存器的读数始终为 0、但 TRM 没有显示。 在任何情况下、RMW 都会添加可能受优化影响的额外指令。

    请尝试:

        GPIOB->DOUTSET31_0   =  0x04000000

    ------------------------
      >SCB->ICSR  =  SCB->ICSR  | (1<<25); //设置 PENDSTCLR 位以清除 SysTick 挂起标志
    同样、ICSR 通常与“写入“一起使用、而不是与 RMW 一起使用。 请尝试:
     
      SCB->ICSR  = (1<<25); //设置 PENDSTCLR 位以清除 SysTick 挂起标志
    事实上,你甚至有这行代码表明你的 SysTick 间隔非常短,因此容易受到种族的影响——特别是,在这种情况下,你可能会也可能不会清除你想要的待处理的 SysTick 中断。 您可能根本不需要这行代码。
     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tuan:
    1.硬件差异在于寄存器的功能。 设置->将 GPIO 设置为高电平|清除-->将 GPIO 设置为低电平|切换-->反转当前 GPIO 输出

    2.是的,它们是原子操作

    3.  访问 GPIO 寄存器没有特定问题。

    4.假设您有两个 LED 灯,您想关闭一个 LED 灯,另一个 LED 灯打开。 使用拨动开关、您可以在没有重叠的情况下实现这一点。 使用 SET/CLR、可以使两个 LED 在几个时钟周期内关闭、或者在几个时钟周期内都关闭。

    此致、

    Diego Abad

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

    请尝试:

        GPIOB->DOUTSET31_0   =  0x04000000

    -->在这种情况下、如果同时设置了两个针脚 B。 我认为这会影响引脚的功能

    示例:  

    GPIOB->DOUTSET31_0  = 0x04000000;-->设置为引脚 PB26

    同时、引脚 PB25 也已重新设置为高电平。

    然后使用语句  GPIOB->DOUTSET31_0   =  0x04000000; 已将 PB25 更改为低电平。

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

    感谢您的信息

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

    我认为不匹配的第三点,这是由迭戈阿巴德萨贾明的答复。

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

    这不是 DOUTSET(也不是 DOUTCLR)的工作方式。 由于位 25 为 0、因此 不会更改 PB25.TRM (SLAU846C) 表 9-42 描述了 DOUTSET31_0:位 25:“向该位写入 1 会设置 DOUT31_0 寄存器中的 DIO25 位。 写入 0 无效。“

    DOUTSET/DOUTCLR 使您能够 原子性设置/清除 DOUT 中的位,而不会带来读取 — 修改-写入风险。 (没有用于同时设置和清除任意位集的机制[如中所示、例如 TIVA 系列]。)

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

    我还应指出的是、两个示波器迹线显示的波形差异很大。  

    第一种是周期性脉冲。 脉冲非常窄——可能太短、无法可靠地捕获。

    第二种是方波、具有很容易捕获的宽脉冲。

    更合适的比较是在一行中设置 DOUTTGL31_0 两次、以创建窄脉冲。 或者、尝试在示波器上调高分辨率。

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

    感谢您的信息。