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.

[参考译文] MSP430FR2532:FLLWARNEN是否用于DCO/FLL温度漂移?

Guru**** 2587365 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/619765/msp430fr2532-is-fllwarnen-for-dco-fll-temp-drift

部件号:MSP430FR2532

大家好,

我已经能够设置我的控制器以使用计时器运行,运行中断等。 这方面的一切都很好。  我正在使用带有DCO/FLL的REFO作为时间基准。 没有晶体,因此不需要XT1。

我了解可以启用CSCTL7/FLLWARNEN,以便在FLL检测到DCO因温度而超出范围时生成中断。  不幸的是,DCO故障和XT1 OSC故障共享相同的NMI (参见SLAU445G中的图3-5)作为DCO故障。  两个CSCTL7/FLLUNLOCKHIS位根据需要保持0b00, 但 XT1 OSC故障始终生成(持续)。  因此,如果我启用SFRIE1/OFIE,则会不断生成XT1 OSC故障。  这就是为什么我一直在尝试禁用XT1和/或任何可能生成XT1 OSC故障的设备。  我已经厌倦了通过SR/OSCOFF关闭XT1 (这是一次很长的射击),CSCTL7/ENSTFCT1 (也不是真正正确的事情)以及其他一些我现在无法回忆的事情。

如果我想重新校准DCO/FLL,如果它漂移(比如由于温度),FLLWARNEN是不是该去的?

如果是,我在忽略什么?

如果不是,正确的机制是什么?

谢谢大家。

下面是一个代码;

#include <MSP430-h>

#define init_rate 0x3C // Timer0 A0速率(基于8 MHz MCLK)


静态持续无符号int blink_rate =

{ //较大的数字=较慢的闪烁速率

0x6000, // blink_cnt必须出现此信息才能缓慢闪烁

0x1000 // blink_cnt必须达到此值才能快速闪烁

};


unsigned int blink_rate = 0; // blink_rate索引[]

volatile unsigned int blink_cnt; //计数计时器中断到blink_rate_table[]时间,易失性以防止优化

无符号int测试=0;



////

MCLK振荡器=8 MHz

//如果需要大于8 MHz的值,则必须

//为FRAM添加等待//初始化



OSC_Init(void){



//__bis_sr_register (OSCOFF); //禁用LFXT1,可以尝试停止XT1.....,但它会再次出现。

__bis_sr_register (SCG0); //禁用FLL (在下面再次启用)

CSCTL3 |= SELREF_REFCLK; //将REFO设置为FLL参考源

CSCTL0 = 0; //清除DCO和MOD寄存器

CSCTL1 &=~(DCORSEL_7); //首先清除DCO频率选择位

CSCTL1 |= DCORSEL_3; //为8MHz设置DCORSEL = 0x02

CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz

__DELAY周期(3); //执行3xNOP以使设置生效

__BIC_SR_REGISTER (SCG0); //启用FLL

While (CSCTL7和(FLLUNLOCK0 | FLLUNLOCK1));//等待FLL锁定



CSCTL7 |=~(ENSTFCNT1 | FLLULUCFO| FLLULUNLOCK0 | FLLUNLOCK1); //禁用XT1计数器(它是后部疼痛)


CSCTL7 &=~(FLLUNLOCKHIS0 | FLLUNLOCKHIS1);//清除FLLUNLOCKHIS故障标记。

//当我们等待FLL锁定时,它们已经被设置。

CSCTL7 |= FLLWARNEN; //如果由于温度原因导致频率锁定松动,则启用中断

//SFRIE1 |= OFIE; //在SYS中启用FLL中断

//****** 取消注释上述行会导致不断生成XT1 NMI。 *****

}




////

Time_Base FLL丢失锁定中断服务例程

//

#pragma vector = UNMI_vector

__interrupt void UNMI_ISR(void)

{

__bis_sr_register (SCG0); //禁用FLL (在下面再次启用)

CSCTL3 |= SELREF_REFCLK; //将REFO设置为FLL参考源

CSCTL0 = 0; //清除DCO和MOD寄存器

CSCTL1 &=~(DCORSEL_7); //首先清除DCO频率选择位

CSCTL1 |= DCORSEL_3; //为8MHz设置DCORSEL = 0x02

CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz

__DELAY周期(3); //执行3xNOP以使设置生效

__BIC_SR_REGISTER (SCG0); //启用FLL

While (CSCTL7和(FLLUNLOCK0 | FLLUNLOCK1));//等待FLL锁定


CSCTL7 &=~(FLLUNLOCKHIS0 | FLLUNLOCKHIS1);//清除FLLUNLOCKHIS故障标记。

//在等待FLL锁定时,它们已被设置

。}










//

//初始化I/O引脚

//

void gPIO_Init(void)

{


//使未使用的引脚输出保持低功耗


P1REN = 0x00; //端口1电阻器关闭

P2REN = 0x00; //端口2电阻器关闭

P1SEL0 = 0x00; //使端口1成为简单的I/O端口

P1SEL1 = 0x00; //使端口1成为简单的I/O端口

P2SEL0 = 0x00; //使端口2成为简单的I/O端口

P2SEL1 = 0x00; //使端口2成为简单的I/O端口

P1DIR = 0x00; //现在将P1设置为输入方向

P2DIR || BIT7; //将WFP 2.7 设置为输出方向。 LED位于该针脚上


。}







//

使用捕获/比较控件0初始化TimerA0

//

void TimerA0_C0_Init(void){



TA0CCTL0 = CCIE; //设置定时器A捕获-比较0

TA0CCR0 = INIT_RATE; //设置周期时间

TA0CTL = tassel__SMCLK | MC__UP; //配置计时器A0 clk源和操作模式

}////









Timer0 A0中断服务例程

//

#pragma矢量= TIMER0_A0_vector

__interrupt void Timer0_A0_ISR (void)

{

IF(Blink_cnt >= Blink_RATE_Blink_RATE[Blink_RATE]) //如果是时间,请更改LED

的状态{

P2OUT ^= 0x80; //使用专用或切换WFP 2.7 (LED)

blink_cnt = 0; //并在达到阈值时重置计数器

测试++;

如果(测试>= 20)

{

测试= 0;

如果(blink_rate == 1)

blink_rate = 0;

否则

blink_rate = 1;

}

}

否则

blink_cnt+; //否则,增加计数

器}////









main.c

//

void main(void){

WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器

//PM5CTL0 &=~LOCKLPM2; //禁用GPIO开机默认高阻抗模式

//以激活先前配置的端口设置





OSC初始化(); //将振荡器设置为MCLK =8 MHz

GPIO初始化(); //初始化GPIO引脚

TimerA0_C0_Init(); //初始化TimerA0和CCR0





__bis_sr_register (GIE); //启用中断

同时(1); //这只是临时的例子__bis_sr_register(LPM0_bits | GIE);对我正在俯瞰的SG0/1/OSCOFF/CPUOFF做了一些有趣的事情。


//__bis_sr_register (LPM0_bits | GIE); //在此处停车并进入低功率状态,相当于BIS #8,SR

//__no_operation(); //用于调试

}





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

    只是为了感兴趣,我一直在尝试去杀死XT1振荡器。  我根本不使用水晶。

    即使一开始我将XOUT和XIN引脚设置为输入,也要关闭SR中通过OSCOFF的示波器,然后清除XT1OFFG,

    XT1OFFG仍然设置!

    我在这里错过了一些东西…

    void main (void){

      WDTCTL = WDTPW | WDTHOLD;        //停止看门狗计时器

      P2SEL0 = 0x00;            //使端口2成为简单的I/O端口

      P2SEL1 = 0x00;            //使端口2成为简单的I/O端口

      __bis_sr_register (OSCOFF);        //禁用LFXT1

      CSCTL7 &=~(ENSTFCNT1 | FLLULULUPUC | XT1OFFG | DCOFFG);          //禁用XT1计数器(它是后部疼痛)

      CSCTL7 &=~XT1OFFG;  //模具!

      CSCTL7 &=~XT1OFFG; //模具!

      CSCTL7 &=~XT1OFFG; /DIE!     

    ...

    ...

    ...

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

    发布代码时,请使用文本框右下角的"使用丰富格式"链接。 进入此菜单后,要插入代码,请单击</>框,它将设置代码的格式以提高可读性。 我已经编辑了您的上述帖子,以反映这一点。

    您是否尝试过通过在CSCTL6寄存器中设置XT1AUTOOFF位来完全关闭XT1? 执行此操作后,您可能需要清除一次XT1故障标志,但根据我的理解,它应该可以防止再次触发它。 请记住,如果选择XT1来获取任何时钟(包括FLL),则XT1AUTOOFF位将不起作用。 您需要小心地将每个时钟显式设置为默认配置的某些时钟为XT1,但当由于故障安全机制而无法使用时,请回退到REFO。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的注意。

    与CS部分本身一样,此部分具有许多选项,导致许多复杂的相互依赖性(如果A,则B,除非C和D在E关闭时打开,但G可能会弹出,而不会警告更改所有内容,等等)。  这在设计时是很好的,很有趣的,但是,"可能"变化的项目会带来波纹问题。  XT1AUTOOFF不会关闭XT1 osc。  仅 当另一个振荡器/时钟源运行良好且其所有选项设置正确时,它才会关闭XT1 osc。  但与XT1的情况一样,它"可能"再次出现。
    我有一些工作(一旦DCO/FLL稳定,关闭XT1OFFG和ENSTFCNT1,打开XT1AUTOOFF),但当我后来设置WDT时,尽管设置了XT1AUTOOFF,XT1还是重新开始工作。  我间接(A然后B导致C,因为D等)影响MCLK,导致XT1恢复。  这一问题已得到纠正,现在情况“似乎”正常。
    "可能"改变的事物的影响并不能使人们对使用此零件进行设计充满信心。
    对于零件的基本时钟,我可以在某种程度上理解这种类型的芯片设计;如果没有时钟,零件就会停止,但这种设计确实有两种方式。  在这种关系的深度(如果是A,那么是B等)和“可以”之间,人们永远不知道他们在这一过程中忽略了一个“但”或“例外”。  只是因为某件事看起来像预期的那样工作,是吗,尽管进行了彻底的测试?
    祝你一切顺利,感谢你抽出时间。