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.

[参考译文] MSP430F5324:在MCLK上在1.5MHz和2.0MHz之间切换

Guru**** 2393265 points
Other Parts Discussed in Thread: MSP430F5324

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/574745/msp430f5324-switching-between-1-5mhz-and-2-0mhz-on-mclk

部件号:MSP430F5324
主题中讨论的其他部件: MSP430WARE

您好,

我们目前正在使用MSP430F5324上的以下代码来设置MCLK,然后将频率从1.5MHz更改为2.0MHz,然后再将频率从返回和第四个更改为返回。

BIS.w  #SCG0,SR               ;禁用FLL控制回路

           CLr.w  &UCSCTL0               ;设置可能的最低DCOx,MODx

           MOV.w  #DCORSEL_3,&UCSCTL1    ;4.9 MHz标称DCO

           MOV.w  #FLLD_1 + 45,&UCSCTL2  ;将DCO乘法器设置为2.00MHz

                                           ;(N + 1)* FLLRef = Fdco

                                           ;(45 + 1)* 38K = 2.00MHz

                                           ;设置FLL Div = fDCOCLK/2

           BIC.w  #SCG0,SR               ;启用FLL控制回路

           无操作

           无操作

           无操作

           无操作

 

            无操作

           MOV.w  #0x63AF,R15

DELAY_L3   add.w  #0xFFFF,R15

           JC     Delay_L3

 

           ;循环直到XT1,XT2和DCO稳定

做什么4.   

            BIC.w  #XT2OFFG + XT1LFOFFG + DCOFFG,&UCSCTL7

                                           ;清除XT2,XT1,DCO故障标志

           BIC.w  #OFIFG,&SFRIFG1        ;清除故障标志

           bit.w  #OFIFG,&SFRIFG1        ;测试振荡器故障标志

           jc     do while4.

我们的问题是,我们是否只能更改粗体行中的值'45',或者是否需要重新运行整个代码循环以完成这种类型的交换? 你可以评论吗?

非常感谢您的帮助!

-Amanda

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Xt1和XT2不受更改的影响,只要未超出范围,DCO就不会出现故障(这将需要参考时钟故障)。

    如果您可以使用DCO时钟,但实际尚未使用新值,则可以忽略延迟循环。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amanda,您好!

    每当您更改DCO频率时,您都需要执行FLL回路,以确保DCO稳定,并且您的频率正确。 您想经常在1.5 -2MHz之间切换的任何特殊原因? 如果您需要为某些外围设备提供单独的频率,则可以为MCLK和SMCLK设置单独的分隔器。 有些模块甚至可以进一步划分时钟以用于其用途。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。 您是否知道我们可以运行的任何示例代码,并且基于ACLK (外部晶体)的MCLK可以获得1.5MHz的频率,仅用于测试?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amanda,您好!

    我们没有这方面的具体例子,因为这是不可能的。 有关如何配置UCS的详细信息,请参阅用户指南中5.1 部分(图5.1)中的统一时钟系统图。 如图所示,MCLK不能由ACLK采购,但可由XT1直接采购。 但是,XT1的信号路径不包括任何类型的乘法器/预校准器。 此信号路径中仅存在分禾器。 如果需要1.5MHz,则必须划分DCO时钟,在旁路模式下使用XT1进行1.5MHz的数字输入,在高频模式下使用XT1,并使用1.5MHz XTAL,或使用类似于XT2最后两个选项的选项。

    如果您想获得所需的配置方面的帮助,您能解释一下为什么需要1.5MHz和2MHz? 您正在使用哪些需要这些特定频率的模块?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    根据您的反馈,客户似乎能够让事情半完整地运作。 我们遇到了一个新问题(无法详细了解为什么需要切换)。

    不,当客户在IAR环境中运行他的程序时,一切正常,但当他独立运行时,其输出不相同。  代码是在设备进入睡眠模式时等待循环中断。 在循环过程中,接收到50个中断。 当我们使用IAR实现代码时, 每次发生中断时,MCLK都会被激活('correct behaviour (正确行为)'-请参阅附件)。 当我们单独运行它时,情况并非如此('incorrect behavior'-请参阅附件)。 在所附图像中,Channel0表示ACLK,Channel1表示MCLK,而Channel2表示中断脉冲。

    我们所看到的内容是否与已经讨论过的内容有关? 您以前见过这种情况吗?

    不正确的行为-  

    正确行为-  

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

    您看到的是在调试模式下运行代码时掩蔽的竞争条件。 连接调试器并启用EEM时,芯片内的代码执行速度会减慢。 这可能允许模块或处理相互赶上,从而隐藏独立运行芯片时出现的竞争条件。 从所提供的信息来看,它们运行MCLK的速度很可能太慢,无法正确处理中断。 请记住,MCLK控制CPU执行速度。 这就是为什么在不同的时钟(如定时器或(e)USI)需要某些模块时,MSP430为不同的时钟源提供了多种选项的原因。 这些时钟源可以以不同的速度提供不同的外设,有时可以由模块内的分频器进一步调整。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Jace:

    Ali已开始实施我们在离线状态下讨论的解决方案,但遇到了障碍。 每次打开晶体管时,他都会激活线圈,需要关闭-->打开-->关闭线圈几微秒。 如果他使用设置/重置模式,GPIO将打开至少两倍于ACLK (2*26us)的时间,结果太长。 我们是否错过了您提议的方法,或者您能否想出一种方法来克服这种滞后?

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

    如果二极管的切换速度比ACLK允许的速度更快,则他需要更快的时基来完成此操作。 如果需要第一个时基,则第二个时钟输入速度更快的计时器可以执行此序列,您可以使用第一个计时器通过中断来控制第二个计时器。 如果Ali能够绘制一个时间图表,准确展示他的需求,这可能会有所帮助。 从这一点出发,将更容易确定时间基准和计时器方案,以满足这一需要。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Jace:

    Ali提供了更多信息。 似乎他已经实施了与您建议的内容接近的内容。

    在日常工作中,他最初将MCLK设置为2MHz,然后将TimerB设置为31个脉冲。 接着,他启动ACLK,启用WFP 2.7 中断线路,等待ACLK的下降边缘中断CPU。 在通过2.7 ACLK中断CPU后,他将定时器B设置为1.2毫秒或2.2毫秒的延迟。

    他认为问题的原因可能是他如何将CPU置于低功耗模式。 这就是他所看到的:

    1) 如果他在第46行和第86行中设置SCG1,则只接收与原始31个ACLK脉冲相关的4-5个脉冲:

    2) 如果他重置第46行中的SCG1并在第86行中再次设置它,他在第一位中接收到30个脉冲,而在以下位中只接收到24个脉冲:

    3) 如果重置行46 (类似于下面代码中的行50)和行86 (实际上是下面代码中的行94)中的SCG1,则每位将接收30个脉冲:

    第三种设置是可以接受的,但DCO在位内被激活,电流消耗较高。 他认为,如果不设置SCG1,DCO将被激活,这也是高电流的原因。 是这样吗? 您能否评论一下我们可能做错了什么? 如果您仍需要时间图,我也可以请求。

    代码如下:

    检查计时器:
    ;初始化DCO至2.0 MHz
    BIS.w #SCG0,SR ;禁用FLL控制回路
    CLr.w &UCSCTL0 ;设置尽可能低的DCOx,MODx
    MOV.w #DCORSEL_3,&UCSCTL1 ;4.9 MHz标称DCO
    
    MOV.w #FLLD_1 + 51,&UCSCTL2;将DCO乘法器设置为2.0MHz
    
    ;(N + 1)* FLLRef = Fdco
    ;(51 + 1)* 3.8912万 = 2.0 MHz
    ;设置FLL Div = fDCOCLK
    BIC.w #SCG0,SR ;启用FLL控制回路
    
    ;当DCO范围位已完成
    时,DCO的最坏情况下稳定时间;更改为n x 32 x 32 x f_FLL_reference。 有关
    优化,请参见5xx UG中的UCS章节。
    ;32 x 32 x 2.45 MHz/ 3.2768万 Hz=7.6563万= MCLK周期,以便DCO稳定下来
    无操作
    MOV.w #0x63AF,R15
    Delay_L3 add.w #0xFFFF,R15
    jc Delay_L3
    
    ;循环直到XT1,XT2和DCO稳定
    DO_WHILE4 BIC.w #XT2OFFG + XT1LFOFFG + DCOFFG,&UCSCTL7
    ;清除XT2,XT1,DCO故障标志
    BIC.w #OFIFG,&SFRIFG1 ;清除故障标志
    bit.w #OFIFG,&SFRIFG1 ;测试振荡器故障标志
    jc 做什么4.
    
    
    BIS.B #BIIT2,OPMODE
    ;设置Xmit标志
    MOV #59,R4;
    
    MOV &TB0R,R15 ;当前计时器计数为R15;
    
    ;; 将定时器设置为31次脉冲。
    ;
    CHK_TIMER0:
    添加 #1Fh,R15 ;将31添加到当前
    MOV R15,&TB0CCR2 ;移动以比较REG #2
    MOV #0010H,&TB0CCTL2;启用COMPARE2中断
    
    BIS.B #BIT0,&P1SEL ;设置ACLK
    
    CLL.B &P2IFG
    ;CLR P2 Interflags
    BIS.B #BIT7,&P2IE
    ;启用WFP 2.7 中断(为NEG XISION设置)
    ;A线路46
    ; MOV #0058H,SR ;低频率等待WFP 2.7 INTERR或
    MOV #00D8H,SR ;低频率等待WFP 2.7 INTERR或
    无操作 ; COMPARE2中断
    ;`2.7 中断向量到'P2INTR'
    `CMP2向量间向量到"三丁二氧化三"
    
    ;P2INTR的RTI返回休眠状态
    ;低功耗模式。
    ;TBINTX的RTI在启用OSC的情况下返回
    CLR B &P2IE
    
    CLR B &P2IFG
    
    
    BIC.B #BIT0,&P1SEL;从输出中删除ACLK (输出=0)
    
    12月R4 ;少一点
    CMP #57,R4
    JHS CHK_TIME2
    ;否
    
    
    RLC.B Buffer +6;
    将缓冲区旋转左侧一位
    RLC.B缓冲器+5 ;..
    RLC.B buffer+4;..
    RLC.B buffer+3;字符串旋转.MSBIT以携带
    RLC.B缓冲器+2 ;..
    RLC.B buffer+1;..
    RLC.B buffer+0;..
    
    Jnc CHK_TIME2
    
    
    添加 84号,R15
    JMP CHK_TIMER3
    
    
    CHK_TIMER2:添加
    #2DH,R15
    
    CHK_TIMER3:MOV
    r15,&TBCCR2;移动以比较REG #2 (INTR已启用)
    ;B行86
    ; MOV #0058H,SR;低频率等待COMPARE2中断
    MOV #00D8H,SR;低频率等待COMPARE2中断
    无操作 ;
    ;已删除具有LO FREQ模式的CMP2内部RTI
    
    
    TST R4;是否所有位都移出?
    JNZ Chk_TIMER0;否
    ;是的
    CLR &TB0CCTL2;禁用Comp2中断
    BIC.B #BIIT2,OPMODE;清除Xmit标志
    ;
    ;将DCO时钟设置回1.5 MHz。
    ;
    ;初始化DCO至1.5MHz
    双宽 #SCG0,SR ;禁用FLL控制回路
    CLR &UCSCTL0 ;设置尽可能低的DCOx,MODx
    MOV (室上性 #DCORSEL_3,&UCSCTL1 ;3.0 MHz标称DCO
    MOV (室上性 #FLLD_1 + 38,&UCSCTL2;为2.45MHz设置DCO乘法器
    ;(N + 1)* FLLRef = Fdco
    ;(74+1)*3.2768万=2.45MHz
    ;设置FLL Div = fDCOCLK/2
    带 #SCG0,SR ;启用FLL控制回路
    
    ;当DCO范围位已完成
    时,DCO的最坏情况下稳定时间;更改为n x 32 x 32 x f_FLL_reference。 有关
    优化,请参见5xx UG中的UCS章节。
    ;32 x 32 x 2.45 MHz/ 3.2768万 Hz=7.6563万= MCLK周期,以便DCO稳定下来
    无操作
    MOV.w #0x63AF,R15
    Delay_L9 add.w #0xFFFF,R15
    jc Delay_L9.
    
    ;循环直到XT1,XT2和DCO稳定
    ;DO_WHILE2 BIC.w #XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG,&UCSCTL7
    DO_WHILE8 BIC.w #XT2OFFG + XT1LFOFFG + DCOFFG,UCSCTL7
    ;清除XT2,XT1,DCO故障标志
    BIC.w #OFIFG,&SFRIFG1 ;清除故障标志
    bit.w #OFIFG,&SFRIFG1 ;测试振荡器故障标志
    jc DO _while8
    RETA
    ;.. 

    再次感谢您与我们一起帮助解决此问题!

    -Amanda

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

    请参阅用户指南中的图1-6操作模式,了解在低功率模式下,部件处于不同低功率模式的设置以及在这些低功率模式下芯片中关闭的设置。 表1-2操作模式将对此进行进一步的扩展(在用户指南的下一页中)。 您可以从表中看到,DCO在不同的LPM上处于打开状态,具体取决于它是否提供了某些时钟以及是否请求了这些时钟。 另请参阅表"从低功耗模式唤醒和重置"(数据表中的第55页,修订版D),了解从不同LPM唤醒的时间。 这些唤醒时间受SVS设置和MCLK时钟速度的影响。 我建议提高MCLK应用程序的速度,因为他正在执行的计时特定任务现在由ACLK/计时器控制。 这样,他从LPM中走出来的速度稍微快一些,做了需要做的事情,然后睡了更长时间。 这将降低长期的平均电流消耗。 他可能还需要更改SVS设置才能更快唤醒。 同时请注意与此部分相关的PMM勘误表。 其中一些与SVS设置和LPM有关。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨,Jace,

    您是否有记录如何设置SVS的示例代码?

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

    我们部件的所有代码示例均位于MSP430Ware内。 MSP430Ware可以在CCS -> TI资源管理器中独立找到,也可以在云中通过TI资源管理器找到,网址为dev.ti.com。 至于特定于SVS的示例,我认为我们在典型的代码示例样式中没有SVS的示例。 在整个代码示例中确实会对PMM进行一些更改;但是,我们确实通过我们的驱动程序库提供了PMM的一些示例。 还可以在MSP430Ware中找到驱动程序库及其示例。