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.

[参考译文] MSP430FR5969:DMA 和 ACCTEIFG PUC

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/567993/msp430fr5969-dma-and-accteifg-puc

器件型号:MSP430FR5969

您好!

我使用 DMA 将数据从 FRAM 区域传输到 SPI。 SPI 时钟为8MHz。

几次之后、由于 ACCTEIFG、我有一个 PUC。

当 MSP-FET430处于激活状态时、这种情况永远不会发生。

我在数据表中看到:注:当系统频率配置为>8MHz 时、ACCTEIFG 位可能会在调试模式下置位、与等待状态(NWAITS)无关。 在这种情况下、它不是 FRAM 访问违规。 ACCTEIFG 位不会触发 PUC 或更改 SYSRSTIV 寄存器的值。

但 MSP 不>8MHz, 它=8MHz。

当源地址为 FRAM 区域时、在没有 ACCTEIFG PUC 的情况下、如何使用 DMA?

此致

好的

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    似乎与 LPM 模式相关。 如果我不使用 LPM0模式、则不会出现此问题。 勘误表讨论了 LPM1及以上的问题、但没有讨论 LPM0。
    LPM0是否是 DMA 的问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否有任何 TI 代码示例可用于管理具有 DMA 的低功耗模式?

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

    您能否提供一个简单的代码示例来演示您所观察到的问题? LPM0期间的 FRAM 电源状态应保持其之前处于激活模式的状态、以便 FRPWR 保持置位并且 FRAM LDO 未被停用、因此不会触发此勘误表。 您是否尝试使用不同的等待状态或 CPU 频率? 类似的 E2E 帖子供参考: e2e.ti.com/.../1335037

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

    您好、Ryan、

    代码如下:

    时钟配置:

    PJSEL0 |=(BIT5 + BIT4);// LF
    
    CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
    CSCTL1 = DCOFSEL_6; // 8MHz
    CSCTL2 = SELA_LFXTCLK | SEL__DCOCLK | SELM_DCOCLK;// ACLK 源选择 LFXTCLK;设置 SMCLK = MCLK = DCO
    CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; //将除 SMCLK 以外的分频器设置为1:/8
    CSCTL4 &=~LFXTOFF;
    
    _DELAY_CYCLES (1000);
    操作
    {
    CSCTL5 &=~(LFXTOFFG + HFXTOFFG); //清除 XT1故障标志
    SFRIFG1 &=~OFIFG;
    } while (SFRIFG1&OFIFG); //测试振荡器故障标志
    CSCTL0_H = 0;
    

    DMA 配置:

    /*清除任何挂起标志*/
    UCA1IFG &=~(UCRXIFG | UCTXIFG);
    
    /*获取块*/
    /*源 DMA 地址:数据缓冲区。 *
    DMA0SA =(无符号短整型)数据; // FRAM 存储器区域
    /*目标 DMA 地址:SPI 发送寄存器。 *
    DMA0DA = UCA1TXBUF_;
    /*要传输的块的大小*/
    DMA0SZ = SD_blocksize;
    
    /* DMA 触发器为 SPI 发送*/
    DMACTL0 = DMA0TSEL__UCA1TXIFG;
    
    /*配置 DMA 传输*/
    DMA0CTL =
    DMADT_0 |/*单次传输模式*/
    DMADSTBYTE |/*源字节模式*
    DMASRCBYTE |/*目的字节模式*/
    DMAEN |/*启用 DMA *
    DMAIE |/* DMA 中断使能*/
    DMASRCINCR1 | DMASRCINCR0;//递增源地址*/
    
    /*通过发送第一个字节"开始块"令牌来启动传输*/
    UCA1TXBUF = SD_TOK_WRITE_STARTLOCK;// 512字节
    

    LPM 模式:

                      _low_power_mode_0 ();

    DMA IRQ:

    #pragma vector = dma_vector
    __interrupt void dma_IRQ (void)
    {
    U16 val;
    
    Val = DMAIV;
    如果(val = 0x02)
    {
    DMA0CTL = 0;//停止 DMA 0 */
    Scheduler_SetEvents (SOFT_EVENT_WITSD);// attente fin USD
    }
    
    __BIC_SR_REGISTER_ON_EXIT (LPM0_Bits);
    }
    

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

    您好 Mitch、

    我无法重新创建问题、请查看我开发的以下示例:

    #include 
    
    CHAR DATA[8]={0x00、0x01、0x02、0x03、0x04、 0x05、0x06、0x07};
    
    /*
    main.c
    */
    int main (void){
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    P2SEL1 |= BIT4 | BIT5 | BIT6; // USCI_A1操作
    PJSEL0 |=(BIT5 + BIT4);// LF
    
    PM5CTL0 &=~LOCKLPM5;
    
    CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
    CSCTL1 = DCOFSEL_6; // 8MHz
    CSCTL2 = SELA_LFXTCLK | SEL__DCOCLK | SELM_DCOCLK;// ACLK 源选择 LFXTCLK;设置 SMCLK = MCLK = DCO
    CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; //将除 SMCLK 以外的分频器设置为1:/8
    CSCTL4 &=~LFXTOFF;
    
    _DELAY_CYCLES (1000);
    操作
    {
    CSCTL5 &=~(LFXTOFFG + HFXTOFFG); //清除 XT1故障标志
    SFRIFG1 &=~OFIFG;
    } while (SFRIFG1&OFIFG); //测试振荡器故障标志
    CSCTL0_H = 0;
    
    //为 SPI 操作配置 USCI_A1
    UCA1CTLW0 = UCSWRST; //**将状态机置于重置中**
    UCA1CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB;// 3引脚、8位 SPI 主器件
    //时钟极性高,MSB
    UCA1CTLW0 |= UCSSEL_SMCLK; // SMCLK
    UCA1BR0 = 0x02; ///2
    UCA1BR1 = 0; //
    UCA1MCTLW = 0; //无调制
    UCA1CTLW0 &=~UCSWRST; //**初始化 USCI 状态机**
    UCA1IE &=~UCRXIE; //禁用 USCI_A0 RX 中断
    
    /*清除任何挂起标志*/
    UCA1IFG &=~(UCRXIFG);
    
    /*获取块*/
    /*源 DMA 地址:数据缓冲区。 *
    //配置 DMA 通道0
    __data16_write_addr ((unsigned short)&DMA0SA、(unsigned long)&data);
    //源块地址
    __data16_write_addr ((无符号短整型)&DMA0DA、(无符号长整型)&UCA1TXBUF);
    //目标单个地址
    /*要传输的块的大小*/
    DMA0SZ = 8;
    
    /* DMA 触发器为 SPI 发送*/
    DMACTL0 = DMA0TSEL__UCA1TXIFG;
    
    /*配置 DMA 传输*/
    DMA0CTL =
    DMADT_0 |/*单次传输模式*/
    DMADSTBYTE |/*源字节模式*
    DMASRCBYTE |/*目的字节模式*/
    DMAEN |/*启用 DMA *
    DMAIE |/* DMA 中断使能*/
    DMALEVEL |
    DMASRCINCR1 | DMASRCINCR0;//递增源地址*/
    
    _bis_SR_register (LPM0_bits + GIE); //输入带中断的 LPM3
    
    while (1)
    {
    __no_operation();
    }
    }
    
    #pragma vector = dma_vector
    __interrupt void dma_IRQ (void)
    {
    长 val;
    
    Val = DMAIV;
    
    _DELAY_CYCLES (100);
    
    DMA0CTL |= DMAEN; // DMA0启用
    }
    

    此致、Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ryan、
    感谢您的回答、我将尝试对其进行测试。 我有几点看法:
    我的数据缓冲器位于 FRAM 区域、而不是 RAM 区域。
    传输大小为一个 µSD 扇区、因此为512字节。 几个字节完全没有问题。
    此致
    好的
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #include 
    
    #pragma PERSISTENT (DATA)
    无符号字符数据[256]={0x00、0x01、0x02、0x03、0x04、 0x05、0x06、0x07、0x08、0x09、 0x0A、0x0B、0x0C、0x0D、0x0E、 0x0F、
    0x10、0x01、0x02、0x03、 0x04、0x05、0x06、0x07、0x08、 0x09、0x0A、0x0B、0x0C、0x0D、 0x0E、0x0F、
    0x20、0x01、0x02、 0x03、0x04、0x05、0x06、0x07、 0x08、0x09、0x0A、0x0B、0x0C、 0x0D、0x0E、0x0F、
    0x30、0x01、 0x02、0x03、0x04、0x05、0x06、 0x07、0x08、0x09、0x0A、0x0B、 0x0C、0x0D、0x0E、0x0F、
    0x40、 0x01、0x02、0x03、0x04、0x05、 0x06、0x07、0x08、0x09、0x0A、 0x0B、0x0C、0x0D、0x0E、0x0F、
    0x50、0x01、0x02、0x03、0x04、 0x05、0x06、0x07、0x08、0x09、 0x0A、0x0B、0x0C、0x0D、0x0E、 0x0F、
    0x60、0x01、0x02、0x03、 0x04、0x05、0x06、0x07、0x08、 0x09、0x0A、0x0B、0x0C、0x0D、 0x0E、0x0F、
    0x70、0x01、0x02、 0x03、0x04、0x05、0x06、0x07、 0x08、0x09、0x0A、0x0B、0x0C、 0x0D、0x0E、0x0F、
    0x80、0x01、 0x02、0x03、0x04、0x05、0x06、 0x07、0x08、0x09、0x0A、0x0B、 0x0C、0x0D、0x0E、0x0F、
    0x90、 0x01、0x02、0x03、0x04、0x05、 0x06、0x07、0x08、0x09、0x0A、 0x0B、0x0C、0x0D、0x0E、0x0F、
    0xA0、0x01、0x02、0x03、0x04、 0x05、0x06、0x07、0x08、0x09、 0x0A、0x0B、0x0C、0x0D、0x0E、 0x0F、
    0xB0、0x01、0x02、0x03、 0x04、0x05、0x06、0x07、0x08、 0x09、0x0A、0x0B、0x0C、0x0D、 0x0E、0x0F、
    0xC0、0x01、0x02、 0x03、0x04、0x05、0x06、0x07、 0x08、0x09、0x0A、0x0B、0x0C、 0x0D、0x0E、0x0F、
    0xD0、0x01、 0x02、0x03、0x04、0x05、0x06、 0x07、0x08、0x09、0x0A、0x0B、 0x0C、0x0D、0x0E、0x0F、
    0xE0、 0x01、0x02、0x03、0x04、0x05、 0x06、0x07、0x08、0x09、0x0A、 0x0B、0x0C、0x0D、0x0E、0x0F、
    0xF0、0x01、0x02、0x03、0x04、 0x05、0x06、0x07、0x08、0x09、 0x0A、0x0B、0x0C、0x0D、0x0E、 0x0F};
    
    /*
    main.c
    */
    int main (void){
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    P2SEL1 |= BIT4 | BIT5 | BIT6; // USCI_A1操作
    PJSEL0 |=(BIT5 + BIT4);// LF
    
    PM5CTL0 &=~LOCKLPM5;
    
    CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
    CSCTL1 = DCOFSEL_6; // 8MHz
    CSCTL2 = SELA_LFXTCLK | SEL__DCOCLK | SELM_DCOCLK;// ACLK 源选择 LFXTCLK;设置 SMCLK = MCLK = DCO
    CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; //将除 SMCLK 以外的分频器设置为1:/8
    CSCTL4 &=~LFXTOFF;
    
    _DELAY_CYCLES (1000);
    操作
    {
    CSCTL5 &=~(LFXTOFFG + HFXTOFFG); //清除 XT1故障标志
    SFRIFG1 &=~OFIFG;
    } while (SFRIFG1&OFIFG); //测试振荡器故障标志
    CSCTL0_H = 0;
    
    //为 SPI 操作配置 USCI_A1
    UCA1CTLW0 = UCSWRST; //**将状态机置于重置中**
    UCA1CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB;// 3引脚、8位 SPI 主器件
    //时钟极性高,MSB
    UCA1CTLW0 |= UCSSEL_SMCLK; // SMCLK
    UCA1BR0 = 0x02; ///2
    UCA1BR1 = 0; //
    UCA1MCTLW = 0; //无调制
    UCA1CTLW0 &=~UCSWRST; //**初始化 USCI 状态机**
    UCA1IE &=~UCRXIE; //禁用 USCI_A0 RX 中断
    
    /*清除任何挂起标志*/
    UCA1IFG &=~(UCRXIFG);
    
    /*获取块*/
    /*源 DMA 地址:数据缓冲区。 *
    //配置 DMA 通道0
    __data16_write_addr ((unsigned short)&DMA0SA、(unsigned long)&data);
    //源块地址
    __data16_write_addr ((无符号短整型)&DMA0DA、(无符号长整型)&UCA1TXBUF);
    //目标单个地址
    /*要传输的块的大小*/
    DMA0SZ = 256;
    
    /* DMA 触发器为 SPI 发送*/
    DMACTL0 = DMA0TSEL__UCA1TXIFG;
    
    /*配置 DMA 传输*/
    DMA0CTL =
    DMADT_0 |/*单次传输模式*/
    DMADSTBYTE |/*源字节模式*
    DMASRCBYTE |/*目的字节模式*/
    DMAEN |/*启用 DMA *
    DMAIE |/* DMA 中断使能*/
    DMALEVEL |
    DMASRCINCR1 | DMASRCINCR0;//递增源地址*/
    
    _bis_SR_register (LPM0_bits + GIE); //输入带中断的 LPM3
    
    while (1)
    {
    __no_operation();
    }
    }
    
    #pragma vector = dma_vector
    __interrupt void dma_IRQ (void)
    {
    长 val;
    
    Val = DMAIV;
    
    _DELAY_CYCLES (100);
    
    DMA0CTL |= DMAEN; // DMA0启用
    }
    

    此致、Ryan