SLAZ389AG October   2012  – August 2021 MSP430FR5736

 

  1.   1
  2.   2
  3.   3
  4.   4
  5.   5
    1.     6
    2.     7
      1.      8
      2.      9
    3.     10
  6.   11
    1.     12
    2.     13
    3.     14
    4.     15
    5.     16
    6.     17
    7.     18
    8.     19
    9.     20
    10.     21
    11.     22
    12.     23
    13.     24
    14.     25
    15.     26
    16.     27
    17.     28
    18.     29
    19.     30
    20.     31
    21.     32
    22.     33
    23.     34
    24.     35
    25.     36
    26.     37
    27.     38
    28.     39
    29.     40
    30.     41
    31.     42
    32.     43
    33.     44
    34.     45
    35.     46
    36.     47
  7.   48

DMA14

DMA Module

Category

Functional

Function

DMA misses trigger from asynchronous source and all subsequent transfers/triggers

Description

If DMA module is used in edge-triggered mode
AND
the trigger source (e.g. TimerA, TimerB, USCI or ADC10) is running with an asynchronous clock (e.g. MODOSC, VLO or external crystal clock) versus DMA clock (MCLK),
AND
the DMA trigger occurs while the CPU is in active mode, then the DMA module might miss an edge trigger and then all subsequent edge triggers.

This leads to a missing DMA transfer cycle. The DMA size address register (DMAxSZ) will note decrement, and the trigger source (corresponding module flag) is not cleared. Due to this, the expected DMA interrupt is not executed and the DMA hangs.

Workaround

To prevent the issue entirely, run DMA and module from the same clock source(e.g. MCLK, SMCLK with same source as MCLK, etc) to prevent asynchronous events.

To detect the issue:
Use overflow flags found in many modules (e.g. ADC10OVIFG) to detect DMA lockup
OR
Use the WDT at the system-level to detect a hang-up.

After detection, recover operation by clearing the DMA trigger source interrupt flag, clearing the data to be transferred, and re-initializing both the DMA and the module for the trigger source. If the trigger source is unknown, trigger a software BOR reset by setting the PMMSWBOR bit in the PMMCTL0 register.