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.

[参考译文] MSP430FR6989:FR6989的 DMA 问题

Guru**** 2581345 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/839258/msp430fr6989-dma-problem-of-fr6989

器件型号:MSP430FR6989

大家好、TI 人、

我正在使用 FR6989的 AES 和 DMA 对 RAM 处的一个卡尺进行解密、并将结果直接传输到 FRAM。 并找到目标地址是否在0xFFFF 以上、它总是失败的。

但是,如果目标地址低于0x10000,它会很好地工作。  需要您的帮助,提前感谢。

在这里、我连接了代码。(用于 MSP430 V6.50)的 IAR

e2e.ti.com/.../2766.AES_5F00_TEST.rar

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

    您好!

    您是否确认0xFFFF 以上的地址 已正确写入 DMAxSA? 您可能需要在调试模式下检查寄存器的位19-16以进行确认。

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

    [引用用户="Wei.Jeim Zhao"]

    您好!

    您是否确认0xFFFF 以上的地址 已正确写入 DMAxSA? 您可能需要在调试模式下检查寄存器的位19-16以进行确认。

    [/报价]

    您好,

    是的,我选择了“大模式”。

    此外、  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #include "msp430fr6989.h"
    #include "stdint.h"
    
    typedef 枚举
    {
    加密= 0x00、
    解密= 0x01、
    }AESMODE_t;
    typedef 枚举
    {
    false = 0、
    真= 1、
    中性= 2
    }bol_t;
    
    
    const uint8_t pincode[16]={0x11、0x22、0x33、0x44、0x55、0x66、0x77、0x88、0x99、0xAA、0xBB、0xCC、0xDD、0xEE、0xFF、0x00};
    
    
    uint16_t xx[16]={
    0x0011、0x2233、0x3344、0x4455、0x5566、0x6600、0x7788、0x8811、0x9933、0xAABB、0xBBCC、
    0xCCAA、0xDDD4、0x2AEE、0x57FF
    };
    
    __monitor bool_t aes128_ECB_Word (uint32_t MspAddr、uint16_t *输入、uint16_t WordCnt);
    void OpenFW_ZoneRW (void);
    void INLAM_FRAM_Alter (void);
    void InitAES_pincode (AESmode_t 模式);
    /*********
    SEG1:4400-EFFF
    SEG2:F000-FFFF
    SEG3:10000结束
    
    此代码位于 SEG2。SEG1\SEG3打开写权限。
    
    xx 为 chipertxt,AES 解密 xx 并传输(通过 DMA)
    seg3 (>0xFFFF)时的结果(plaintxt)总是失败的。 但是,如果解址在 seg1,
    这是可以的。
    
    
    
    (二 /
    void main( void ){
    
    //停止看门狗计时器以防止超时复位
    WDTCTL = WDTPW + WDTHOLD;
    InitAES_pincode(解密);
    AES128_ECB_Word (0x10000、xx、16);
    
    while (1);
    }
    
    
    
    
    /********
    (三 /
    __monitor bool_t aes128_ECB_Word (uint32_t MspAddr、uint16_t *输入、uint16_t WordCnt)
    {
    
    if (MspAddr & 1)
    返回 false;
    
    AESAST|=AESKEYWR;
    AESACTL0|=AESCMEN; // AESCMEN = 1、AESCMx = 00
    
    DMACTL0=DMA0TSEL_11 | DMA1TSEL_12; //设置 DMA 0-1触发器
    DMA0CTL=DMADD_0 | DMALEVEL | DMASRCINCR_0 | DMADSTINCR_3; //配置 DMA 0
    __data20_write_long (((uint32_t)&DMA0SA、(uint32_t)&AESADOUT); //源地址
    
    __data20_write_long (((uint32_t)&DMA0DA、(uint32_t) MspAddr); //目标地址
    DMA0SZ=WordCnt; //以字表示数据包大小
    
    
    OpenFW_ZoneRw();
    DMA0CTL|= DMAEN; //启用 DMA 0
    
    
    DMA1CTL=DMADD_0 | DMALEVEL | DMASRCINCR_3 | DMADSTINCR_0; //配置 DMA 1
    __data20_write_long (((uint32_t)&DMA1SA、(uint32_t)输入); //源地址
    __data20_write_long (((uint32_t)&DMA1DA、(uint32_t)&AESADIN); //目标地址
    DMA1SZ=WordCnt; //数据包字中的大小
    DMA1CTL|= DMAEN; //启用 DMA 1.
    
    AESACTL1=WordCnt>>3;
    while (!(DMA0CTL 和 DMAIFG));
    
    prohibe_FRAM_Alter();
    返回 true;
    }
    
    
    
    /********
    (三 /
    void OpenFW_ZoneRW (void)
    {
    
    MPUCTL0 = MPUPW;
    MPUSEGB1 = 0xF000>>4;
    MPUSEGB2 = 0x10000>>4;
    MPUSAM = MPUSEG1RE|MPUSEG1WE|
    MPUSEG2RE|MPUSEG2XE |
    MPUSEG3RE|MPUSEG3WE|
    MPUSEGIRE|MPUSEGIWE;
    MPUCTL0 = MPUPW | MPUENA;
    MPUCTL0_H = 0xDD;
    }
    
    
    /********
    
    (三 /
    void prohibe_FRAM_Alter (void)
    {
    
    MPUCTL0 = MPUPW;
    MPUSEGB1 = 0xF000>>4;
    MPUSEGB2 = 0x10000>>4;
    MPUSAM = MPUSEG1RE|MPUSEG2RE|MPUSEG2XE|
    MPUSEG3RE|MPUSEGIRE;
    
    MPUCTL0 = MPUPW | MPUENA;
    MPUCTL0_H = 0xDD;
    }
    
    
    /********
    
    (二 /
    __ROOT void InitAES_pincode (AESmode_t 模式)
    {
    uint16_t i;
    AESACTL0 = AESSWRST;
    
    if (decrypt == mode){
    AESACTL0=AESKL__128|AESOP0;}
    否则{
    AESACTL0=AESKL__128;
    }
    
    for (i=0;i<16;i++)
    {
    AESAKEY_L=pincode[i];
    }
    while (AESAST&AESBUSY);
    
    } 

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

    我想我找到了这个问题的原因。 不过、问题是如何实现这一点。 在一开始、我知道 bit16-bit19容易出错。

    因此,我使用“大模式”,并使用功能__data20_write_long()。  仍然会陷入这一陷阱。

    现在,我们来讨论另一个问题:如何将一个20位值写入 C 语言?的寄存器 DMAxSA /DMAxDA

    BTW、它是 AES 中 TI 示例代码的一部分。

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

    您好!

    我建议您转到编译器的指南或有关 __data20_write_long 函数的代码注释。 您可以得到函数参数的规则。

    但对于代码、您可以尝试在地址0x12000之前添加(uint32_t)、或将地址存储到变量中并将其指向函数。

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

    您好、Wei、

    我已经根据以下主题找到了解决方案:  

    https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/564374

    然后,我返回 IAR,找到有关此问题的更明确的说明。

    总之、感谢您的提示。 )