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/MSP430FR5972:MSP430FR5972

Guru**** 2595805 points
Other Parts Discussed in Thread: MSP430FR5972

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/707497/ccs-msp430fr5972-msp430fr5972

器件型号:MSP430FR5972

工具/软件:Code Composer Studio

你好!

我使用的是 CCS 8.1。

MSP430FR5972不能配置;-(

我需要时钟系统设置:

1) 1) 将 DCO 设置为8MHz

2) 2) ACLK =来自 LFMODCLK 和附加分频/2

我的代码是:

(笑声)

PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
//时钟系统设置
CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器

CSCTL1 &=~DCORSEL; // DCO 范围选择。 设置8MHz
CSCTL1的 DCO 设置!= DCOFSEL_6; //为8MHz

CSCTL2设置 DCO!= SELA_LFMODCLK; // 010b = LFMODCLK (ACLK == MODOSC/128)
CSCTL2!= SELS_DCOCLK; // 011b = DCOCLK
CSCTL2!= SELM__DCOCLK; // 011b = DCOCLK

CSCTL3!= DIVA__2; // ACLK 源分频器。 对 ACLK 时钟源的频率进行分频。 001b =/2
CSCTL3 &=~DIVS__1; // SMCLK 源分频器。 对 SMCLK 时钟源的频率进行分频。 000b =/1
CSCTL3 &&~DIVM__1; // MCLK 源分频器。 将 MCLK 时钟源的频率分频。 000b =/1

CSCTL4!= HFXTOFF; // 1b = HFXT 如果不用作 ACLK、MCLK 或 SMCLK
CSCTL4的源并且=~VLOOFF; // VLO 关闭。 该位关闭 VLO。 0b = VLO 在
CSCTL4上并且=~Ω SMCLKOFF;// SMCLK 关闭。 该位关闭 SMCLK。 0b =
CSCTL4上的 SMCLK!= LFXTOFF; // 1b =如果 LFXT 不用作 ACLK、MCLK 或 SMCLK 的源

,则它关闭// CSCTL5 ???
// CSCTL6 ???

CSCTL0_H = 0; 

(笑声)

正确吗?

我无法使用 Timer2:-(
我认为问题是所有频率调谐错误...

代码为:

//开始初始化 Timer2_A0 ---


TA2CTL = tassel__SMCLK; // Timer_A 时钟源选择00b = TAxCLK 01b = ACLK 10b = SMCLK
//TA2CTL!= tassel_2; // Timer_A 时钟源选择00b = TAxCLK 01b = ACLK 10b = SMCLK
TA2CTL &&~ID_1; // Timer A 输入分频器:0 =/1,1 =/2,2 -/4,3 -/8
TA2CTL!= MC__UP; // Timer A 模式控制:1 -最高 CCR0
TA2CTL!= TAIFG; // Timer_A 中断标志0b =无中断挂起
TA2CTL!= TAIE; // Timer_A 中断使能。 该位启用 TAIFG 中断请求。 0b =中断被禁用1b =中断被启用

TA2CCTL0 &=~μ F CAP; //捕获模式0b =比较模式1b =捕获模式
TA2CCTL0 &=~OUTMOD_0; // PWM 输出模式:0 *//
/TAC2TL0!= OUTMOD_1; // PWM 输出模式:1 -设置*/
//TA2CCTL0 &=~COV;
//TA2CCTL0 &=~CCIFG;
TA2CCTL0 |= COV;
TA2CCTL0 |= CCIFG;

//TA2EX0 &=~TAIDEX_0; // Timer_A 输入分频器扩展:/1

TA2CCTL0!= CCIE; //捕获/比较中断使能。 该位启用相应 CCIFG 标志的中断请求。 0b =中断被禁用1b =中断被启用
//TA2CCTL0 &=~CCIE;//捕捉/比较中断使能。 0b =中断被禁用

TA2CCR0 = 16000 - 1;//每秒500个中断

//结束初始化 Timer2_A0,---

正确吗?

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

    你(们)好

    我注意到您的代码中有很多与第7行中的代码类似的行。

    CSCTL1!= DCOFSEL_6;

    您是要检查它是否存在不等性、还是意味 着"或等效"它是这样的?

    CSCTL1 |= DCOFSEL_6;

    代码中使用!=的语句仅检查!的两个大小中的两个参数是否不相等。   它们 实际上不会设置寄存器中任何位的值。  =会将寄存器设置为其当前值、并按位将另一个值"或"设置。

    您能否解释一下此代码的用途?  按照我的理解、您尝试将 DCO 设置为8MHz、选择 LFMODCLK 作为 ACLK 的源、并使用 Timer2每秒生成500个中断。  所有这些都是完全正确的吗?

    不需要

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

    感谢您的回答!

    CSCTL1! = DCOFSEL_6;

    我用不同的 C 语言编译器编写、但更像是"Kernighan + Richie C"。
    我所写的结构-我的意思是:
    若要设置我想要的位而不更改其他位:
    P1DIR |= BIT4;P1OUT |= BIT4;//将 P1.4设置为输出方向

    在不更改其他位的情况下重置我需要的位:
    P1DIR &=~ BIT0;P1OUT &=~ BIT0;//将 P1.0设置为输入方向

    "按位或"-如果其中一个相应位为1、则运算的_RESULT_为1、否则为0。

    设置为1 P1OUT 端口的零位(例如)可以如下所示:

    P1OUT = 0x01;//十六进制表示法

    P1OUT = 0b00000001;//二进制记录

    P1OUT = 1;//十进制表示法
    但与此同时、我们"破坏"(覆盖)了所有其他在 P1OUT 中击败的人。
    我只需要安装一个来自端口(寄存器)的位、而不更改其余位。

    如果我们只想在1中设置零位(例如)、而不想触摸其他位?

    在这种情况下、您需要使用"按位 OR":

    将零位置1
    P1OUT = P1OUT | 0x01;
    或使用化合物分配
    P1OUT |= 0x01;
    因此、我们仅更改了端口的零位。

    "按位操作不"-将位的值改为相反的值。
    此操作与按位操作不能用于将特定位复位为零。

    复位零位
    P1OUT &= 0xFE;

    P1OUT &=~ 0x01;

    在这样的记录中、我们将一个位放入要置零的单元中、然后反转生成的数字、现在应用生成的掩码。 因此、我们仅在第一个位放置0。

    并且应编写程序代码,以便以后可以读取:)

    我尝试将 DCO 设置为8MHz、选择 LFMODCLK 作为 ACLK 的源、

    并使用 Timer2每秒生成500个中断。

    是的。 正确。

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

    我无法使用 Timer2:-(

    代码:

    (笑声)

    (笑声)
    void _system_pre_init (void)
    {
    //在此插入低级初始化*/
    WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
    
    _禁用中断();//Это специальная команда! это не прерывание μ A。
    
    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置
    //时钟系统设置
    CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
    
    CSCTL1 = 0;
    CSCTL1!= DCOFSEL_6; //将 DCO Мгц 设置为8MHz ---установка частоты 8_M Ω
    
    CSCTL2 != SELA_LFMODCLK; // 010b = LFMODCLK (ACLK == MODOSC/128)
    CSCTL2!= SELS_DCOCLK; // 011b = DCOCLK
    CSCTL2!= SELM__DCOCLK; // 011b = DCOCLK
    
    CSCTL3!= DIVA__2; // ACLK 源分频器。 对 ACLK 时钟源的频率进行分频。 001b =/2
    CSCTL3 &=~DIVS__1; // SMCLK 源分频器。 对 SMCLK 时钟源的频率进行分频。 000b =/1
    CSCTL3 &&~DIVM__1; // MCLK 源分频器。 将 MCLK 时钟源的频率分频。 000b =/1
    
    CSCTL4!= HFXTOFF; // 1b = HFXT 如果不用作 ACLK、MCLK 或 SMCLK
    CSCTL4的源并且=~VLOOFF; // VLO 关闭。 该位关闭 VLO。 0b = VLO 在
    CSCTL4上并且=~Ω SMCLKOFF;// SMCLK 关闭。 该位关闭 SMCLK。 0b =
    CSCTL4上的 SMCLK!= LFXTOFF; // 1b =如果 LFXT 不用作 ACLK、MCLK 或 SMCLK 的源
    
    ,则它关闭// CSCTL5 ???
    // CSCTL6 ???
    
    CSCTL0_H = 0; //锁定 CS 寄存器
    
    
    //开始初始化 Timer2_A0,-------------------------------------------------------
    
    TA2CTL = 0;//所有位复位为=0
    TA2CTL = tassel_SMCLK + ID_1 + MC_UP + TACLR;
    
    //
    tassel_SMCLK; // Timer_A 时钟源选择00b = TAxCLK 01b = ACLK 10b = SMCLK
    TASSEL_2; // Timer_A 时钟源选择00b = TAxCLK 01b = ACLK 10b = SMCLK
    ID_1; // Timer A 输入分频器:0 =/1,1 =/2,2 -/4,3 -/8
    MC__UP; // Timer A 模式控制:1 -最高 CCR0
    TAIFG; // Timer_A 中断标志0b =无中断挂起1b =中断挂起
    TAIE; // Timer_A 中断使能。 该位启用 TAIFG 中断请求。 0b =中断被禁用1b =中断被启用
    TACLR; // Timer_A 清零。
    */
    
    TA2CCTL0 = 0;//所有位复位为=0
    TA2CCTL0 &=~CAP; //捕获模式0b =比较模式1b =捕获模式
    
    //TA2EX0 &=~TAIDEX_0; // Timer_A 输入分频器扩展:/1
    TA2EX0 = 0;
    
    TA2CCR0 = 1000 - 1;//可能是每秒1000? 但是真的=122(244)每秒;((
    
    TA2CCTL0=CCIE;
    //结束初始化 Timer2_A0 ------------------
    
    __bis_SR_register (GIE);
    
    __ENABLE_INTERRUPT();
    
    }...
    
    
    
    // Timer2_A0中断服务例程-------------------------------------------------------
    #pragma vector = TIMER2_A0_VECTOR
    __INTERRUPT void Timer2_A0_ISR (void)
    {
    
    P4OUT ^= BIT2; //使用异或(设置-复位 LED)切换 P4.2
    
    __no_operation(); //对于调试
    器}
    ... 

    (笑声)

    工作! 但是…

    TA2CCR0 = 1000 - 1;   可能是每秒80000 / 1000 = 8000闪存 LED? 是-否?

    如果8MHz/1000=8000? 真的吗? ;)

    在我的示波器中,我看到了122Hz (曲折:122Hz=0和122Hz=1)

    一.E: 80000 / 65573 = 122 ???

    8-(

    但实际上=122(244)每秒;-(

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

    你(们)好

    我看到您仍然有一些感叹号"!"、其中您应该有或运算符"|"。  要解决此问题,请在上面的代码中将 e2!=更改为|=。  

    另一个问题是以下几行

    CSCTL3 &=~DIVS__1;   // SMCLK 源分频器。 对 SMCLK 时钟源的频率进行分频。 000b =/1

    CSCTL3 &=~DIVM__1;   // MCLK 源分频器。 将 MCLK 时钟源的频率分频。 000b =/1

    DIVS__1和 DIVM__1都等于0x0000。  因此、当您运行这些行时、它们不执行任何操作、因为它们已设置

    CSCTL3 = CSCTL3 & 0xFFFF;

    它首先不会更改 CSCTL3。  要解决此问题、请在对其进行其他更改之前设置 CSCTL = 0。

    最后、如果您希望每秒生成500个中断、则引脚将每2毫秒切换一次。  使用8MHz 时钟时、这意味着您需要在触发中断之前对计数器进行计数以达到16000个周期。

    我使用以下代码在逻辑分析仪上获取以下输出。  我对您的原始代码进行了尽可能少的更改。

    #include 
    int main (void)
    {
    /*在此处插入低级初始化*/
    
    WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
    _disable_interrupt ();
    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置
    //时钟系统设置
    CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
    CSCTL1 = 0;
    CSCTL1 |= DCOFSEL_6; //将 DCO 设置为8MHz
    
    
    CSCTL2 |= SELA_LFMODCLK; // 010b = LFMODCLK (ACLK =MODOSC/128)
    CSCTL2 |= SELs__DCOCLK; // 011b = DCOCLK
    CSCTL2 |= SELM__DCOCLK; // 011b = DCOCLK
    
    CSCTL3 = 0; //将所有源分频器设置为1
    CSCTL3 |= DIVA__2; // ACLK 源分频器。 对 ACLK 时钟源的频率进行分频。 001b =/2
    
    CSCTL4 |= HFXTOFF; // 1b = HFXT 如果不用作 ACLK、MCLK 或 SMCLK 的源、则关闭
    CSCTL4 &=~VLOOFF; // VLO 关闭。 该位关闭 VLO。 0b = VLO 打开
    CSCTL4 &=~SMCLKOFF;// SMCLK 关闭。 该位关闭 SMCLK。 0b = SMCLK 打开
    CSCTL4 |= LFXTOFF; // 1b =如果 LFXT 不用作 ACLK、MCLK 或 SMCLK 的源、则它关闭
    
    CSCTL0_H = 0; //锁定 CS 寄存器
    
    //开始初始化 Timer2_A0,-------------------------------------------------------
    //TA2CTL = 0;//所有位复位为=0
    TA2CTL = TASSEL_SMCLK + ID_1 + MC_UP + TACLR;
    
    /*
    TASSEL_SMCLK; // Timer_A 时钟源选择00b = TAxCLK 01b = ACLK 10b = SMCLK
    TASSEL_2; // Timer_A 时钟源选择00b = TAxCLK 01b = ACLK 10b = SMCLK
    ID__1; // Timer A 输入分频器:0 =/1、1 =/2、2 -/4、3 -/8
    MC__UP; // Timer A 模式控制:1 -一直到 CCR0
    TAIFG; // Timer_A 中断标志0b =无中断挂起1b =中断挂起
    TAIE; // Timer_A 中断使能。 该位启用 TAIFG 中断请求。 0b =中断被禁用1b =中断被启用
    TACLR; // Timer_A 清零。
    *
    
    
    TA2CCTL0 = 0;//所有位复位为=0
    TA2CCTL0 &=~μ F 电容器; //捕获模式0b =比较模式1b =捕获模式
    //TA2EX0 &=~TAIDEX_0; // Timer_A 输入分频器扩展:/1
    TA2EX0 = 0;
    TA2CCR0 = 16000 - 1;//(8000000周期/ 1秒)*(1秒/ 500个中断)= 16000个周期/中断
    TA2CCTL0 = CCIE;
    
    //设置 P4方向和输出;
    P4DIR |= BIT2;
    P4OUT |= BIT2;
    
    
    //结束初始化 Timer2_A0 -------------------------------------------------------
    
    _bis_SR_register (GIE);
    _enable_interrupt ();
    while (1){}
    //
    
    Timer2_A0中断服务例程-------------------------------------------------------
    
    #pragma vector = TIMER2_A0_VECTOR
    __INTERRUPT void Timer2_A0_ISR (void)
    
    {
    P4OUT ^= BIT2; //使用异或(设置-复位 LED)切换 P4.2
    __no_operation(); //对于调试器
    }
    

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

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

    非常感谢你们的帮助!