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.

[参考译文] CCS/MSP-EXP430F5529:GPIO 的切换速率

Guru**** 1144750 points
Other Parts Discussed in Thread: ADC1173, MSP430F5529
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/838285/ccs-msp-exp430f5529-toggle-rate-of-gpio

器件型号:MSP-EXP430F5529
主题中讨论的其他器件:ADC1173MSP430F5529

工具/软件:Code Composer Studio

大家好、

我有一个关于任何 GPIO 切换速率的简单问题。

假设我通过设置 DCO 将5529设置为在25MHz 下运行、现在我将像这样切换控制器的任何引脚。

P2DIR |= BIT2;

while (1)

P2OUT |= BIT2;

P2OUT &=~ BIT2;

}  

因此、我在 P2.2上得到了大约2.3MHz 的方波。

我的问题是、如果我将 DCO 设置为25MHz、那么为什么我的 P2.2无法以相同的速率切换?

为什么它显示2.3MHz?

我希望 GPIO 的最大切换速率适用于我的项目。

请给我任何建议。

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

    您好、Mohit,

    在 C 语言中,一个线路程序不仅占用一个机器周期(1~12或更多)、 因此它不会达到25MHz 的速度。

    同时、在高频切换的情况下、还需要考虑 I/O 端口的上升和下降时间。

    顺便说一下、 您需要多高的切换频率? 过去是什么?

    此致

    Johnson

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

    尊敬的 Johnson:

    我的最终用途是生成一个正弦波、我具有16个正弦值点、幅值有128个变化、从而形成一个128行和16列的2-D arry。

    IM 使用 ADC1173模数转换器、该转换器通过其(0-7引脚)以二进制位的形式提供数字输出、我可以从这些引脚一次性读取我的整个端口(P3IN)。

    读取端口后、我想通过命令 PAOUT = DATA[来自 ADC1173][0-15列的十六进制值]切换(使用一些16位十六进制值) Porta (Port1+Port2) 该列位于 for 循环中。 因此、行的选择是从  将信号数字化到8位的 ADC113、 列的选择是连续0-15循环的。 它现在馈送到另一个 IC AD9760、该 IC 获取并行10位数据以生成正弦波。

    此外、当它完成列、即 REACH 列值为15时、它还将触发任何端口引脚。

    最后、我想保存我的 CPU 时钟、并希望 PIN 触发速度至少~900kHz

    unsigned short int DataRead;
    SetDco ();//DCO 设置为25MHz
    P4DIR |= BIT0;
    寄存器 int plow = P4OUT &~BIT0;
    寄存器 int Pohigh = P4OUT | BIT0;
    PADIR |= 0x3FF;//
    
    
    仅需要16个引脚、while (1)
    {
    DataRad=(短整型) P3IN;
    for (i=0;i<16;i++)
    {
    PAOUT = Data[DataRad][i];//这里的数据是2-D arry、由128行和16列组成。 该数据提取频率需要约为~2.5-2.8MHz
    }
    
    P4OUT =高电平;//每次完成 for 循环后,触发引脚至少~900kHz
    P4OUT =刨煤机;
    } 

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

    您好、Mohit、

    正如我在上次答复中所说的、  一个行程序不仅占用一个机器周期(1~12或更多)、 您可以看到编译的结果、如下图所示:

      

    同时、I/O 端口在切换过程中需要一些时间。 测试结果如下图所示。

    然后 我测试了 MCLK = 25MHz 时的切换结果、如下所示:

    结果表明、最高频率可以达到您描述的2.3MHz、但此时的波形并不完美。

    此致

    Johnson

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

    [引用用户="Mohit Kumar "]

    假设我通过设置 DCO 将5529设置为在25MHz 下运行、现在我将像这样切换控制器的任何引脚。

    (笑声)

    因此、我在 P2.2上得到了大约2.3MHz 的方波。

    我的问题是、如果我将 DCO 设置为25MHz、那么为什么我的 P2.2无法以相同的速率切换?

    为什么它显示2.3MHz?

    我希望 GPIO 的最大切换速率适用于我的项目。

    [/报价]

    使用 MSP430F5529将值从寄存器写入端口(mov.b R5、&P2OUT)将花费3个 MCLK 周期。 将值从存储器写入端口(mov.b @R5+、&P2OUT)需要4个 MCLK 周期。 DMA 速度更快、将在2个 MCLK 周期内将值从存储器复制到端口(CPU 在 DMA 期间停止)。 为了实现精确的端口输出时序、您应该使用汇编器和周期数(按示波器而不是 GUI)。 多了、多了(对于 MSP430F5xx)。 最后、我切换到 Cortex M0+、它可以在48MHz 的1个 MCLK 周期内将值从寄存器写入端口。

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

    您好、Zrno Soli、

    感谢您的建议、IAM 与 DMA 非常新、因此、如果我将整个 C 代码移动到 DMA、我会怎么做。

    考虑了哪些步骤?

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

    5xx 系列数据表中介绍了 DMA 外设。 将模式(字节大小数组)存储到 RAM 或闪存、并触发 DMA (复制原点以字节递增)、源地址和大小 均为 P2OUT 作为目标地址(字节大小不递增)。 CPU 将停止、直至 DMA 完成作业。 如果这太快、只需将 MCLK 除以2、4…… 在触发 DMA 之前、在 DMA 之后返回到完全 MCLK。

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

    您好、Mohit、

    有关 DMA 的配置和使用,请参阅《用户指南》文档的第11章。

    这些 Web 链接可能对您有用:

    http://www.ti.com/lit/ug/slau208q/slau208q.pdf

    http://dev.ti.com/tirex/explore/node?node=APUjYegWGBIttazMHD7lsg__IOGqZri__LATEST

    此致

    Johnson

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

    你好  

    我的源是 具有16个正弦波值(rfdata)的数组、我的目标是 PAOUT、其中我仅使用10个引脚实现10位分辨率、因此我使用0x3FF。

    在深入研究 DMA 后,我修改了代码 LIL 位并获得了输出,但问题是,在25MHz DCO 时,DCO IM 仅获得大约~398kHz 的频率,因此我如何加速系统以从 AD9760获得最小1MHz 的正弦波。

    这是我的修改代码。

    修改是将 DMASBDB 更改为 DMASWDW、将 DMA 大小更改为16。

    请查找随附的文件并阐明突出显示的行。

    #include 
    #include 
    void SetVcoreUp (unsigned int level);
    void SetDco ();
    unsigned int rfdata[16]={0x200、0x2C3、0x369、0x3D8、0x3FF、0x3D8、0x369、0x2C3、0x200、0x13B、0x96、0xLD 0x26、0x26、0x96、0x13B};
    +MAIN (
    
    HOWDTTL)={WDTWDTINT //停止 WDT
    PADIR |= 0x3FF; // PA 输出引脚
    
    P7DIR |= BIT7; // AD9760
    P7SEL 的时钟引脚|= BIT7;
    SetDco(); //在25MHz
    
    DMACTL0 = DMA0TSEL_1;
    __data20_write_long ((uintptr_t)&DMA0SA、(uintptr_t)&rfdata);
    //源块地址
    __data20_write_long ((uintptr_t)&DMA0DA,(uintptr_t)&PAOUT);
    //目标单地址
    DMA0SZ = 16; // 16正弦值
    DMA0CTL = DMADD_4 + DMASRCINCR_3 + DMASWDW + DMAEN;//报表单次传输、inc src、字节到字节传输、启用 DMASWDW
    
    TA0CCR0 = 2; // char freq = TACLK/CCR0
    TA0CCR2 = 1; //对于 DMA0触发
    器 TA0CTL = tassel_2 + MC_1; // ACLK,向上计数模式*/
    } 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    另请参阅:

    https://e2e.ti.com/support/microcontrollers/msp430/f/166/p/839145/3108176#3108176