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.

[参考译文] MSP430FR2476:更改处理器和查找时钟设置帮助...

Guru**** 2524550 points
Other Parts Discussed in Thread: MSP430F2132, MSP430FR2476, LP-MSP430FR2476

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/978042/msp430fr2476-changing-processors-and-looking-for-clock-set-up-help

器件型号:MSP430FR2476
主题中讨论的其他器件:MSP430F2132

您好!

我将通过软件从 MSP430F2132移植到 MSP430FR2476。  我无法使 UART 工作(接收数据时无法发送任何数据、中断也不会触发)。  我找到了这篇文章并开始介绍:
https://www.ti.com/lit/an/slaa734a/slaa734a.pdf?ts=1612820504636&ref_url=https%253A%252F%252Fwww.google.com%252F

我到了建议检查时钟频率的程度、我发现了一个问题...

下面是用于初始化时钟的2132代码中的内容:

//内存段 A 有效、所以用校准值初始化 DCO
// DCOCTL:从 CALDCO_1MHz 中拉取 DCOx 和 MODx
// BCSCTL1:从 CALBC1_1MHz 中拉取 RSELx (也设置 XT2OFF=1、XTS=0、
// DIVA = 00、XT5V = 0)
// BCSCTL2:SELMx=00 (DCOCLK)、DIVMx=00 (DIF1)、SELS =0 (DCOCLK)、
// DIVXs=00 (DIV1),DCOR=0 (内部)
DCOCTL = CALDCO_8MHZ;
BCSCTL1 = CALBC1_8MHZ;
BCSCTL2 = 0;

根据我对文档的理解、2476具有非常不同的时钟结构、因此我最终从 OutOfBox_LP-MSP430FR2476软件示例复制了 CS_init、并尝试调整这些值以将 MCLK 和 SMCLK 设置为8MHz。  我使用逻辑分析仪查看了时钟、它们实际上是1.667至2.5MHz。  我尝试将设置改回示例、现在我有:

#define CS_MCLK_REGLEVE_FREQUENCY IN_kHz 16000 // MCLK 的目标频率、单位为 kHz
#define CS_MCLK_FLLREF_Ratio 488 // MCLK/FLLRef 比率

(笑声)

静态 bool CS_init (void)

bool RetVal = true;

//根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
//在配置时钟系统之前在8MHz 以上运行。
FRAMCTL_configureWaitStateControl (FRAMCTL_ACCESS_TIME_CYCESS_1);

//设置 DCO FLL 基准= REFO
cs_initClockSignal (
CS_FLLREF、
CS_REFOCLK_SELECT、
CS_CLOCK 分频器_1
);

//set ACLK = REFO
cs_initClockSignal (
CS_ACLK、
CS_REFOCLK_SELECT、
CS_CLOCK 分频器_1
);

CS_initFLLPam param ={0};

//设置比率/所需的 MCLK 频率、初始化 DCO、保存修整值
RetVal = CS_initFLCalculateTrim (
CS_MCLK_frequed_in_kHz、
CS_MCLK_FLLREF_Ratio、
参数(&P)
);

//清除所有 OSC 故障标志
CS_clearAllOscFlagsWithTimeout (1000);

返回 RetVal;

我预计为16MHz、但逻辑分析仪显示为1MHz:

当我更改上面的两个#defines 时、频率会发生变化、但不会达到我所期望的频率。。。

我是否应该设置其他内容?  我是否甚至根据原始2132代码中的内容采取了正确的方法?

提前感谢您的帮助!

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

    您好、Henry、

    我建议您查看此处理器的 UART 示例、这些示例可在 Resource Explorer 中的以下位置找到:

    https://dev.ti.com/tirex/explore/node?node=AKTwCkgQg9Z0vk0pj8kphQ__IOGqZri__LATEST 

    BR、
    Leo  

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

    感谢您的链接。  我尝试使用 了示例中的 msp430fr267x_CS_01.c、这些示例说明了这一点  

    // MSP430FR267x 演示-将 MCLK 配置为源自 DCO 的8MHz。

    我取出了引脚分配和 WDT 停止、因为我之前在代码中就有过这种情况。  这就是我现在拥有的:

    #include 
    
    static void Software_Trim (); //获取最佳 DCOFTRIM 值
    #define MCLK_FREQ_MHz 的软件调整8. // MCLK = 8MHz
    
    void CS_init (void)
    {
    _bis_SR_register (SCG0); //禁用 FLL
    CSCTL3 |= SELREF_REFOCLK; //将 REFO 设置为 FLL 基准源
    CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;// DCOFTRIM = 3、DCO 范围= 8MHz
    CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
    _DELAY_CYCLES (3);
    _BIC_SR_register (SCG0); //启用 FLL
    Software_Trim (); //软件调整以获得最佳 DCOFTRIM 值
    
    
    CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
    //默认 DCODIV 为 MCLK 和 SMCLK 源
    }
    
    static void Software_Trim ()
    {
    unsigned int oldDcotTap = 0xFFFF;
    unsigned int newDcoTap = 0xFFFF;
    unsigned int newDcoDelta = 0xFFFF;
    unsigned int bestDcoDelta = 0xFFFF;
    unsigned int csCtl0Copy = 0;
    unsigned int csCtl1Copy = 0;
    无符号 int csCtl0Read = 0;
    无符号 int csCtl1Read = 0;
    unsigned int dcoFreqTrim = 3;
    unsigned char endLoop = 0;
    
    操作
    {
    CSCTL0 = 0x100; // DCO 抽头= 256
    操作
    {
    CSCTL7 &=~DCOFFG; //清除 DCO 故障标志
    } while (CSCTL7 & DCOFFG); //测试 DCO 故障标志
    
    __DELAY_CYCLLES ((unsigned int) 3000 * MCLK_FREQ_MHz);//等待 FLL 锁定状态(FLLUNLOCK)保持稳定
    //建议等待24个经过分频的 FLL 参考时钟周期
    while (((CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1))和&((CSCTL7 & DCOFFG)= 0));
    
    CSCCtl0Read = CSCTL0; //读取 CSCTL0
    CSCCtl1Read = CSCTL1; //读取 CSCTL1
    
    oldDcoTap = newDcoTap; //记录上次的 DCOTAP 值
    NewDcoTap = csCtl0Read & 0x01ff; //获取此次的 DCOTAP 值
    dcoFreqTrim =(csCtl1Read & 0x0070)>>4;//获取 DCOFTRIM 值
    
    if (newDcoTap < 256) // DCOTAP < 256
    {
    newDcoDelta = 256 - newDcoTap; // DCPTAP 和256之间的增量值
    if ((oldDcotap!= 0xFFFF)&&(oldDcotap >= 256)// DCOTAP 交叉256
    endLoop = 1; //停止 while 循环
    其他
    {
    dcoFreqTrim --;
    CSCTL1 =(csCtl1Read &(~DCOFTRIM))|(dcoFreqTrim<4);
    }
    }
    其他 // DCOTAP >= 256
    {
    newDcoDelta = newDcoTap - 256; // DCPTAP 和256之间的增量值
    if (oldDcoTap < 256) // DCOTAP 交叉256
    endLoop = 1; //停止 while 循环
    其他
    {
    dcoFreqTrim++;
    CSCTL1 =(csCtl1Read &(~DCOFTRIM))|(dcoFreqTrim<4);
    }
    }
    
    if (newDcoDelta < bestDcoDelta) //记录最接近256的 DCOTAP
    {
    csCtl0Copy = csCtl0Read;
    csCtl1Copy = csCtl1Read;
    bestDcoDelta = newDcoDelta;
    }
    
    }while (endLoop =0); //轮询直至 endLoop = 1
    
    CSCTL0 = csCtl0Copy; //重新加载锁定的 DCOTAP
    CSCTL1 = csCtl1Copy; //重新加载锁定的 DCOFTRIM
    while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));//轮询直到 FLL 被锁定
    } 

    遗憾的是、我的 MCLK 和 SMCLK 看起来与以前一样、1.667至2.5MHz、具有大量抖动。  此外、我的 ACLK 频率为32.89kHz……

    我注意到该文件的名称包括 MSP430FR267x、但它位于 MSP430FR2476文件夹中、因此我认为它应该兼容...

    我还可以尝试其他什么吗?  谢谢。。。

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

    您好、Henry、

    您的逻辑探头是否可能以低于2 * 8MHz 的频率进行采样、并且您是否看到混叠问题?  您能否确认采样频率是多少?

    BR、
    Leo

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

    您好、Leo、

    我刚才也想检查一下这个问题。  我实际上只是以5ms/s 的速度进行采样  我关闭了一些通道、并能够增加它。  时钟按预期以8MHz 运行。

    非常感谢您的帮助!