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/MSP430FR5969:通过蓝牙实现 MSP430语音控制

Guru**** 2502205 points
Other Parts Discussed in Thread: MSP430G2553, MSP430FR5969, MSP430G2253

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/672775/ccs-msp430fr5969-msp430-voice-control-over-bluetooth

器件型号:MSP430FR5969
主题中讨论的其他器件:MSP430G2553MSP430G2253MSPWARE

工具/软件:Code Composer Studio

在我的项目中 、我将使用 HC05蓝牙模块和 Android 应用通过蓝牙进行 MSP430语音控制 在此过程中、我将使用手机上的蓝牙 HC05来控制 MSP430板上的 LED。 我在本教程中提到了这个项目   、但这里的电路板是 MSP430G2553、我使用的是 MSP430FR5969、因此引脚配置完全不同、我非常困惑应该做些什么来使这个代码正常工作。

我对 MSP430非常了解。 我最初以为不会那么困难、但在这种情况下、我真的感到无助。 请帮助我进行所需的相关更改。 我在这里使用蓝牙 HC05代替 HC06。

这是教程中给出的代码-

/*
* MSP430G2253 USCIA UART 代码
*安东尼·斯克尼
* www.Coder-Tronics.com
* 2014年10月
*
*该代码可用于连接 HC06蓝牙适配器板。
*代码等待接收数据、然后调用 UART 中断、
*然后将接收到的缓冲区分配给变量 Rx_Data。 RX_Data 是
*在开关情况状态中使用、可根据操作各种功能
*通过蓝牙接收的 ASCII 代码。
*

#include

unsigned char Rx_Data = 0;//通过 UART 接收到的字节
unsigned int count = 0;//用于闪烁 LED 演示

int main (空)

/***设置系统时钟***/
WDTCTL = WDTPW + WDTHOLD;//停止 WDT
IF (CALBC1_1MHz =0xFF)//如果校准常数被擦除

while (1);//不加载,陷阱 CPU!

DCOCTL = 0;//选择最低 DCOx 和 MODx 设置
BCSCTL1 = CALBC1_1MHz;//设置 DCO
DCOCTL = CALDCO_1MHz;
/***设置 GPIO ***/
P1SEL = BIT1 + BIT2;// P1.1 = RXD、P1.2= TXD
P1SEL2 = BIT1 + BIT2;// P1.1 = RXD、P1.2=TXD
P1DIR |= BIT6 + BIT0;// P1.6设置为输出
P1OUT &=~(BIT6 + BIT0);// P1.6设置为低电平
/***设置 USCI A***/
UCA0CTL1 |= UCSSEL_2;// SMCLK
UCA0BR0 = 104;// 1MHz 9600
UCA0BR1 = 0;// 1MHz 9600
UCA0MCTL = UCBRS0;//调制 UCBRSx = 1
UCA0CTL1 &=~UCSWRST;//初始化 USCI 状态机
IE2 |= UCA0RXIE;//启用 USCI_A0 RX 中断
_bis_SR_register (LPM0_bits + GIE);//输入 LPM0、中断被启用

while (1)

开关(Rx_Data)

案例0x41://在命令上
//while (!(IFG2&UCA0TXIFG));// USCI_A0 TX 缓冲器准备就绪?
//UCA0TXBUF = 0x41;//发送8位字符
TA0CCTL0 &=~CCIE;//禁用 Timer0_A 中断
P1SEL &=~BIT6;// P1.6被选为 GPIO
P1OUT |= BIT6 + BIT0;// P1.0和 P1.6设置为高电平

中断;

案例0x42://关闭命令
//while (!(IFG2&UCA0TXIFG));// USCI_A0 TX 缓冲器准备就绪?
//UCA0TXBUF = 0x42;//发送8位字符
TA0CCTL0 &=~CCIE;//禁用 Timer0_A 中断
P1SEL &=~BIT6;// P1.6被选为 GPIO
P1OUT &=~(BIT6 + BIT0);// P1.0和 P1.6设置为低电平
中断;

案例0x46://闪存命令
//while (!(IFG2&UCA0TXIFG));// USCI_A0 TX 缓冲器准备就绪?
//UCA0TXBUF = 0x46;//发送8位字符
/*** Timer0_A 设置***/
TA0CCR0 |= 10000-1;//计数器值
TA0CCTL0 |= CCIE;//启用 Timer0_A 中断
TA0CTL |= TASSEL_2 + MC_1;// ACLK、向上计数模式(计数到 TA0CCR0)
/*** Timer0_A 设置***/
中断;

情况0x3E://增加命令
中断;

情况0x3C://减少命令
中断;

案例0x31:// 1命令
中断;

情况0x32:// 2命令
中断;

案例0x33:// 3命令
中断;

案例0x34:// 4命令
中断;

案例0x35:// 5命令
中断;

默认值:break;

_bis_SR_register (LPM0_bits);//输入 LPM0、中断被启用

// USCI A 中断处理程序
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCIAB0RX_vector
_interrupt void USCI0RX_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCIAB0RX_vector)) USCI0RX_ISR (void)
其他
错误编译器不受支持!
#endif

RX_Data = UCA0RXBUF;//将接收到的字节分配给 RX_Data
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//唤醒 CPU

#pragma vector=TIMER0_A0_VECTOR // Timer0 A0中断服务例程
_interrupt void Timer0_A0 (void){

count++;
如果(计数== 10)

P1OUT ^= BIT0 + BIT6;// P1.0切换(红色 LED)
计数= 0;

我会遇到以下错误:

说明资源路径位置类型
#10010链接期间遇到错误;"UART.OUT"未构建 UART C/C++问题
#10234-D 未解析的符号仍然存在 UART C/C++问题
未解析的符号 BCSCTL1、首先在./main.obj UART C/C++问题中引用
未解析的符号 CALBC1_1MHz、首先在./main.obj UART C/C++问题中引用
未解析的符号 CALDCO_1MHz、首先在./main.obj UART C/C++问题中引用
未解析的符号 DCOCTL、首先在./main.obj UART C/C++问题中引用
未解析的符号 IE2、首先在./main.obj UART C/C++问题中引用
未解析的符号 P1DIR、首先在./main.obj UART C/C++问题中引用
未解析的符号 P1OUT、首先在./main.obj UART C/C++问题中引用
未解析的符号 P1SEL、首先在./main.obj UART C/C++问题中引用
未解析的符号 P1SEL2、首先在./main.obj UART C/C++问题中引用
未解析符号 UCA0BR0、首先在./main.obj UART C/C++问题中引用
未解析的符号 UCA0BR1、首先在./main.obj UART C/C++问题中引用
未解析的符号 UCA0CTL1、首先在./main.obj UART C/C++问题中引用
未解析的符号 UCA0MCTL、首先在./main.obj UART C/C++问题中引用

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

    让我看看我是否可以为您解决这些差异。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的... 请这样做。。。

    谢谢你  

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

    您好、Mahima、

    我浏览了代码、并用 MSP430FR5969外设的 MSPWARE 库中提供的示例代码替换了时钟启动和 UART 配置以及中断。  我建议单独下载或安装在 Code Composer Studio 中、并使用所有真正有用的示例。

    代码会编译。  让它以您想要的方式运行、由您决定。

    希望这对您有所帮助。

    e2e.ti.com/.../6165.main.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢。 我尝试了该代码、它编译时没有错误。 但当我在 Android 应用程序上提供语音命令时、它不执行这些命令。 应用程序或程序上没有错误、但它无法正常工作。 因此,我检查了输出 GPIO 引脚 p1.6,这对我来说是没有意义的,因为它应该连接到板载内置 LED。 因此、我将输出 GPIO 引脚更改为 p1.0

    #include


    unsigned char Rx_Data = 0;//通过 UART 接收到的字节
    unsigned int count = 0;//用于闪烁 LED 演示

    int main (空)

    /***设置系统时钟***/
    WDTCTL = WDTPW + WDTHOLD;//停止 WDT

    /***设置 GPIO ***/

    P2SEL1 = BIT5 | BIT6;// P2.5 = TXD、P2.6 = RXD

    P1OUT &=~0x01;// P1.0设置为输出

    P1DIR |= 0x01;// P1.6设置为低电平

    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;

    //时钟系统设置
    CSCTL0_H = CSKEY >> 8;//解锁 CS 寄存器
    CSCTL1 = DCOFSEL_6;//将 DCO 设置为8MHz
    CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;//设置 SMCLK = MCLK = DCO
    // ACLK = VLOCLK
    CSCTL3 = DIVA__1 | DIVS_8 | DIVM__1;//将所有分频器设置为1
    CSCTL0_H = 0;//锁定 CS 寄存器


    /***设置 USCI A***/
    //将 USCI_A0配置为 UART 模式
    UCA0CTLW0 = UCSWRST;//将 eUSCI 置于复位状态
    UCA0CTLW0 |= UCSSEL_SMCLK;// CLK = SMCLK
    //波特率计算
    // 800000000 /(16*9600)= 52.083
    //分数部分= 0.083
    //用户指南表21-4:UCBRSx = 0x04
    // UCBRFx = int ((52.083-52)*16)= 1.
    UCA0BR0 = 52;// 8000000/16/9600
    UCA0BR1 = 0x00;
    UCA0MCTLW |= UCOS16 | UCBRF_1;
    UCA0CTLW0 &=~UCSWRST;//初始化 eUSCI
    UCA0IE |= UCRXIE;//启用 USCI_A0 RX 中断

    _bis_SR_register (LPM0_bits + GIE);//输入 LPM0、中断被启用

    while (1)

    开关(Rx_Data)

    案例0x41://在命令上
    //while (!(IFG2&UCA0TXIFG));// USCI_A0 TX 缓冲器准备就绪?
    //UCA0TXBUF = 0x41;//发送8位字符
    TA0CCTL0 &=~CCIE;//禁用 Timer0_A 中断
    P1SEL1 &=~BIT0;// P1.6被选为 GPIO
    P1OUT |= BIT0;// P1.0和 P1.6设置为高电平

    中断;

    案例0x42://关闭命令
    //while (!(IFG2&UCA0TXIFG));// USCI_A0 TX 缓冲器准备就绪?
    //UCA0TXBUF = 0x42;//发送8位字符
    TA0CCTL0 &=~CCIE;//禁用 Timer0_A 中断
    P1SEL1 &=~BIT6;// P1.6被选为 GPIO
    P1OUT &=~(BIT0);// P1.0和 P1.6设置为低电平
    中断;

    案例0x46://闪存命令
    //while (!(IFG2&UCA0TXIFG));// USCI_A0 TX 缓冲器准备就绪?
    //UCA0TXBUF = 0x46;//发送8位字符
    /*** Timer0_A 设置***/
    TA0CCR0 |= 10000-1;//计数器值
    TA0CCTL0 |= CCIE;//启用 Timer0_A 中断
    TA0CTL |= TASSEL_2 + MC_1;// ACLK、向上计数模式(计数到 TA0CCR0)
    /*** Timer0_A 设置***/
    中断;

    情况0x3E://增加命令
    中断;

    情况0x3C://减少命令
    中断;

    案例0x31:// 1命令
    中断;

    情况0x32:// 2命令
    中断;

    案例0x33:// 3命令
    中断;

    案例0x34:// 4命令
    中断;

    案例0x35:// 5命令
    中断;

    默认值:break;

    _bis_SR_register (LPM0_bits);//输入 LPM0、中断被启用




    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=USCI_A0_Vector
    _interrupt void USCI_A0_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((中断(USCI_A0_Vector)) USCI_A0_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    switch (__evo_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))

    USCI_NONE 案例:中断;
    USCI_UART_UCRXIFG 案例:
    RX_Data = UCA0RXBUF;
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//唤醒 CPU
    中断;
    案例 USCI_UART_UCTXIFG:中断;
    案例 USCI_UART_UCSTTIFG:中断;
    案例 USCI_UART_UCTXCPTIFG:中断;




    #pragma vector=TIMER0_A0_VECTOR // Timer0 A0中断服务例程
    _interrupt void Timer0_A0 (void){

    count++;
    如果(计数== 10)

    P1OUT ^= BIT0 + BIT6;// P1.0切换(红色 LED)
    计数= 0;



    但问题是、它仍然无法正常工作。 我应该怎么做? 现在会出现什么错误?

    请帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、那么您需要做的是以某种方式检查 BLE 模块和 MSP 之间是否存在通信。
    如果您有示波器或某种类型的逻辑探头、请检查 MSP 中的 RX 引脚、以查看在发送 Android 命令时引脚是否切换。
    如果您没有任何方法来探测 RX 引脚、则尝试在 USCI_A0_ISR 中设置一个断点来查看是否生成了一个中断。 这是查看数据是否传入的间接方法。

    此外、在仔细观察代码后、我在开关的默认语句中看到 MSP 被放回 LPM0中、但 GIE (全局中断)不会被重新启用。 尝试用以下代码替换该行:

    _bis_SR_register (LPM0_bits + GIE);//输入 LPM0、中断被启用
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Mahima、

    我们收到了回复、现在已经过去了、因此我假设您的一切正常、并将解决此问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉、我本周忙于学术工作。 我无法实施您建议的解决方案。 我将在这个周末试用、并将告诉您项目的当前状态。 非常感谢您的支持。

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

    我正在检查是否取得了任何进展。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的。 感谢你的帮助。