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-CAPT-FR2633:CCS/MSP-CAPT-FR2633

Guru**** 2561130 points
Other Parts Discussed in Thread: CAPTIVATE-BSWP

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/599663/ccs-msp-capt-fr2633-ccs-msp-capt-fr2633

器件型号:MSP-CAPT-FR2633

工具/软件:Code Composer Studio

您好!

在我描述问题之前、我将解释我是如何到达那里的。 我正在开发 一款需要电容式触控的产品。 我已从电容式设计中心生成代码、以触发开发板上的 LED 作为入门。 然后、我制作了一个版本、不在 PC 上使用 UART 或 BulK_I2C、因此在触摸 CAPTIVATE-BSWP 焊盘按钮时独立打开板载 LED。 还将时钟更改为16MHz。 它检测到 while 循环中的触摸、完美!

接下来、我添加了驱动基于 WS2812的 RGB LED 条的代码软件。 它有一个计时器中断、用于对计数器进行计时。 在连续循环中、一个函数检查 定时器节拍是否大于或等于特定的量、并在 SPI 模式下通过 UCA0SIMO 的 UCA0TXBUF 向 LED 带输出一个图形。 接下来、我实现了电容式触控来触发此应用的启动、如 ON 按钮。 在 main()中,执行 RGB LED 条和 电容模块的初始化函数之后,在进入 while (1)连续循环之前,我有

CAPT_AppStart();                                             

CAPT_appSleep ();                                        

while (CAPT_appHandler()!= true);           //等待按钮被按下以继续。

START_TIMERA2;                                            // vector=TIMER2_A0_vector                  Timer 2 A2 cC0

 while (1)

    RGB_LED_Pattern ();                           //将图案输出到 WS2812 RGB LED 条

在检测到触控时、它会继续在环路中运行 LED 条形图。 我的问题是、如果我在 while (1)循环中添加电容式感应(见下文)、它将运行一次并停止。 请注意、 当我放置一个断点时、我注意到定时器中断仍在 TIMER2_A0_VECTOR ISR 中运行。

while (1)

    if (CAPT_appHandler ()=true)        //如果检测到触控

    {

           LED1_ON;                                      //打开板 LED

           __no_operation();

     }

     否则 LED1_OFF;

      RGB_LED_Pattern ();                          //将图案输出到 WS2812 RGB LED 条

令人困惑的是、如果我将 LED 例程从 while 环路中取出、并且只需保持电容式触控检查、电容式触控响应和循环以保持检查。

我已经缩小了在 我在 while (1)循环中调用的 CAPT_updateUI (&g_uiApp)函数中发生的事情的范围,但我无法解决此问题,也无法理解为什么我无法在连续循环中同时运行 LED 函数和 CAPT_appHandler()检查。 这可能 是一个低功耗模式问题、这是一个简单的修复方法、我在 CapTIvate 设计中心 生成的代码中找不到这一点。 如果有人能帮我解决这个问题、我很感激。 提前感谢您!

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

    您是否意味着代码在 TIMER2_A0_VECTOR ISR 中停止? 或其他任何地方?

    您能否共享 TIMER2_A0_Vector ISR 和 RGB_LED_Pattern()的代码;?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Wei、

    非常感谢您的回复。 定时器 ISR 中的代码不会停止。 它运行计时器 ISR 并按预期进行节拍、因为我在计时器 ISR 的开始和结束处放置了一个断点并进行了检查。 但是、在 main 的 while (1)循环中、它运行 RGB_LED_Pattern 函数一次并停止、因为我只能看到一个 LED 亮起并冻结。

    我已经复制并粘贴了您请求的2段代码。 RGB_LED_Pattern 函数中提到了另外两个函数、我也将其粘贴在底部。 尤其是因为其中一个中断会禁用并重新启用中断。

    //========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    // 2个 LED 移动-放置在 while (1) in main 中
    //========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    void RGB_LED_Pattern (无符号整型日光)

    if (timer2_a2_ticks >=擦拭速度)

    字符 j;//组合每个 LED 索引
    对于(j = 0;j < NUM_LED;j++) SET_LED_Color (j、0x00、0x00、 0x00);//清除所有 LED
    SET_LED_Color (white_LED_Pos、0xF0、0xF0、0xF0);//设置2个白色 LED
    SET_LED_Color (white_LED_Pos-1、0xF0、0xF0、0xF0);

    if (--white_LED_Pos <= 0) white_LED_Pos = NUM_LED; //将位置重置为最高 LED
    SEND_AND_Show_Strip ();
    timer2_A2_ticks = 0; //重置计时器节拍





    //========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //确定 LED 移动速度的定时器的中断矢量
    //========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    #pragma vector=TIMER2_A0_vector//计时器2 A2 cC0
    _interrupt void TIMER2_A0_ISR (void)

    TA2CCTL0 &=~CCIFG; //清除中断标志
    TA2CTL &=~TAIFG;

    timer2_a2_tICKs++; //递增 ISR 中的计时器节拍

    TA2CTL |= TACLR | MC1 | TASSEL_SMCLK; //清除计时器,从 SMCLK 获取,开始计数
    TA2CCTL0 |= CCIE; //再次启用中断
    TA2CTL |= TAIE;

    返回;




    RGB_LED_Pattern 函数中调用的其他两个函数如下所示、以备您参考:

    void set_LED_Color (unsigned int n、char r、char g、char b)

    LED[n].green = g;
    LED[n].RED = r;
    LED[n].blue = b;


    void Send_and_Show_Strip (void)

    _BIC_SR_register (GIE); //清除全局中断

    //设置每个 LED 的 RGB 颜色
    unsigned char i、j;
    对于(i = 0;i < NUM_LED;i++)

    char * rgb =(char*)&LED[i];//获取此位置 LED 的 GRB 颜色组合
    对于(j = 0;j < 3;j++) //按绿色-红色-蓝色顺序发送组合


    字符掩码= 0x80;
    while (掩码!= 0)

    while (!(UCA0IFG & UCTXIFG));//等待发送。 写入 UCB0TXBUF 将清零 UCTXIFG
    if (rgb [j]& mask)//首先检查第8位,然后检查7 6 5 ... 1 0,MSB 优先

    UCA0TXBUF = HIGH_CODE; //发送1

    其他

    UCA0TXBUF = LOW_CODE;//发送0

    MASK = MASK >> 1;//继续到下一个位并进行检查



    _delay_cycles (800); //如数据表所示、发送至少50us 的 RES 代码
    _bis_SR_register (GIE); //清除全局中断
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Wei、

    您是否有幸解决了这个问题 ?

    此致、

    Guyan