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.

[参考译文] MSP430F5529:HID 键盘与 USB-UART

Guru**** 2591030 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1042396/msp430f5529-hid-keyboard-versus-usb-uart

器件型号:MSP430F5529

大家好、

我有一个项目、除其他读数/决定外、我需要:

-发送击键

-通过 Serial 向 GUI 报告数据

我有这两段代码、来自代码示例、它们是单独工作的、但当我将它们放在一起时不工作。 我想知道它是否完全不兼容(对于某些冲突/共享硬件资源):

代码1)来自 MSP430USB 开发程序 Package_5_20_06_03 > exmaple H8

#include

#include "driverlib.h"

#include "usb_config/descriptors.h"
#include "USB_API/USB_Common/device.h"
#include "USB_API/USB_Common/usb.h"//特定于 USB 的函数
#include "USB_API/USB_HID_API/usbhid.h"

#include "usb_app/keyboard.h"
/*
*注意:修改 hal.h 以选择特定的评估板并进行定制
*您自己的电路板。
*
#include "hal.h"

#include
//#include
#include


/*** 特定于应用的全局变量 /
volatile uint8_t button1 Pressed = false;
volatile uint8_t button2 Pressed = false;
volatile uint8_t keySendComplete = true;
uint8_t button1Buf[128]="ABC";
uint8_t button1StringLength;

void main (void)
//uint8_t i;

//WDT_A_HOLD (WDT_A_base);//停止看门狗计时器

WDTCTL = WDTPW + WDTHOLD;//停止 WDT

// USB API 所需的最小 Vcore 设置为 PMM_CORE_LEVEL_2。
PMM_setVCore (PMM_CORE_LEVEL_2);
USBHAL_initPorts ();//配置用于低功耗(输出低电平)的 GPIO
USBHAL_initClocks (8000000);//配置时钟。 MCLK=SMCLK=FLL=8MHz;ACLK=REFO =32kHz
USBHAL_initButtons();// Init 两个按钮
keyboard_init();// Init 键盘报告
USB_setup (true、true);// Init USB & events;如果存在主机,则连接

     _bis_SR_register (LPM0_bits + GIE);

__ENABLE_INTERRUPT ();//启用全局中断

while (1)


开关(USB_getConnectionState())

//在上枚举您的设备时执行此例
// USB 主机
实例 ST_ENUM_ACTIVE:

//使用中断输入 LPM0,直至按键
//_bis_SR_register (LPM0_bits + GIE);

/********* HID 键盘部分******** /
if (button1 Presed){

keyboard_press (button1Buf[0]);
while (!keySendComplete);
KeySendComplete =错误;
keyboard_release (button1Buf[0]);
keyboard_releaseAll();
while (!keySendComplete);
KeySendComplete =错误;

keyboard_press (button1Buf[1]);
while (!keySendComplete);
KeySendComplete =错误;
keyboard_release (button1Buf[1]);
while (!keySendComplete);
KeySendComplete =错误;

button1 Pressed = false;
button2 Pressed = false;

/*
button1StringLength = strlen ((const char *) button1Buf);
if (button2Presed){
keyboard_press (key_left_shift);
while (!keySendComplete);
KeySendComplete =错误;

(i=0;<button1StringLength; i++) {
keyboard_press (button1Buf[i]);
while (!keySendComplete);
KeySendComplete =错误;
keyboard_release (button1Buf[i]);
while (!keySendComplete);
KeySendComplete =错误;

keyboard_release (key_left_shift);
while (!keySendComplete);
KeySendComplete =错误;
button1 Pressed = false;
button2 Pressed = false;
*


中断;
//这些情况在设备断开连接时执行
//主机(意思是,未枚举);已枚举但已暂停
//由主机连接,或连接到没有 USB 主机的有源集线器
//存在。
案例 ST_PHYS_DISCONNECTED:
实例 ST_ENUM_Suspended:
案例 ST_PHYS_Connected:
_bis_SR_register (LPM3_bits + GIE);
_NOP();
中断;

//默认为瞬时状态执行
// ST_enum_in_progress。 通常、该状态仅持续少数几个状态
//秒。 确保在此状态下不进入 LPM3;USB
//此处正在进行通信,因此必须使用模式
//为 LPM0或有源 CPU。
实例 ST_ENUM_IN_PROGRESS:
默认值:;

}//while (1)
}//main()


/*
*==== UNMI_ISR ====
*
#if defined (__TI_Compiler_version__)||(__IAR_systems_ICC__)
#pragma vector = UNMI_Vector
_interrupt void UNMI_ISR (void)
#Elif defined (__GNU__)&&(__MSP430__)
void __attribute__((interrupt (UNMI_vector)) UNMI_ISR (void)
其他
找不到#ERROR 编译器!
#endif

开关(__evo_in_range (SYSUNIV、SYSUNIV_BUSIFG))

案例 SYSUNIV_NONE:
__no_operation();
中断;
SYSUNIV_NMIIFG 案例:
__no_operation();
中断;
SYSUNIV_OFIFG 案例:
UCS_clearFaultFlag (UCS_XT2OFFG);
UCS_clearFaultFlag (UCS_DCOFFG);
SFR_clearInterrupt (SFR_oscillator_FAULT_INTERRUPT);
中断;
案例 SYSUNIV_ACCVIFG:
__no_operation();
中断;
案例 SYSUNIV_BUSIFG:
//如果 CPU 在 USB 模块的同时访问 USB 内存
//挂起,可能会出现“总线错误”。 这会生成 NMI。 如果
// USB 在您的软件中自动断开连接,请设置 a
//在这里断点并查看执行是否成功。 请参阅
//编程人员指南以了解更多信息。
SYSBERRIV = 0;//清除总线错误标志
USB_disable();//Disable

代码2)从 MSP430F55xx_uscia0_UART_01.c 中删除、并对 USCI_A0进行了适当的调整以适应 USCI_A1:

void main (void)


WDTCTL = WDTPW + WDTHOLD;//停止 WDT

P4SEL |= BIT4+BIT4;// P3.3、4 = USCI_A0 TXD/RXD
UCA1CTL1 |= UCSWRST;//**将状态机置于复位状态**
UCA1CTL1 |= UCSSEL_2;// SMCLK
UCA1BR0 = 9;// 1MHz 115200 (请参阅用户指南)
UCA1BR1 = 0;// 1MHz 115200
UCA1MCTL |= UCBRS_1 + UCBRF_0;//调制 UCBRSx=1、UCBRFx=0
UCA1CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
UCA1IE |= UCRXIE;//启用 USCI_A0 RX 中断
_bis_SR_register (LPM0_bits + GIE);
__no_operation();//用于调试器
//UART


// while (1);

}//main()

//回显 RXed 字符,确认 TX 缓冲区已准备就绪
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCI_A1_vector
_interrupt void USCI_A1_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_A1_vector)) USCI_A1_ISR (void)
其他
错误编译器不受支持!
#endif

switch (__evo_in_range (UCA1IV、4))

情况0:中断;//向量0 -无中断
情况2://向量2 - RXIFG
while (!(UCA1IFG&UCTXIFG));// USCI_A0 TX 缓冲器准备就绪?
UCA1TXBUF = UCA1RXBUF;// TX -> RXED 字符
中断;
情况4:中断;//向量4 - TXIFG
默认值:break;

谢谢大家。

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

    您好、Sergio、

    我唯一看到的是这两个代码中有几个点、它们在这里进入低功耗模式。  也许可以先对其进行注释、看看这是否有用。

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

    您好、Sergio、

    我从您那里听说过几天,因此我假设您能够解决您的问题。
    如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。
    如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

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

    你好,Dennis,很抱歉,我的回复很晚了,实际上我不是全职工作,它更像是第二份工作(仅限周末):谢谢你的提示,很遗憾删除了所有 LPM 参考没有解决:/你认为,可能确实会有一些硬件冲突吗? 谢谢、

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

    您好、Sergio、

    可能。  如果不在 F5529 Launchpad 上设置代码、很难判断是否要尝试。

    合并代码后、是否尝试向 UART 发送数据、至少查看是否由于接收到的字节而向 UART ISR 生成中断和向量?

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

    Dennis、您好、哦、我正在使用  F5529 Launchpad。

    是的、我在 ISR 上有一个断点、当我打开 USB 代码时、它不会进入该断点。

    也许我别无选择、只能使用外部 USB-UART 转换器并将硬接线连接到 USCI_A0上的引脚? :/

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

    好的、基于您使用的是5529 Launchpad 和 USCI_A1、这是反向通道 UART。  只要您有 TXD 和 RXD 的跳线就位、当连接到 USB 时、该跳线应该可以用作应用 UART。  您看到的是这样的东西吗?

    您是否有示波器或逻辑探头来确认您在 F5529 RXD 引脚 P4.5上接收到字节?

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

    您好、Sergio、

    几天以来,我没有听到您的声音,因此我假设您能够解决您的问题。
    我要将此帖子的状态更改为“已解决”,但如果不是这种情况,请单击“这不能解决我的问题”按钮,并使用更多信息回复此主题。
    如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

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

    大家好、我有跳线、所以我有这样的视图(尽管 COM 编号不同)。

    实际上、我手头没有示波器、但我将尝试下一个示波器。 谢谢

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

    您好、Sergio、

    好的、让我们看看我们是否可以确认您的 UART 正在工作。  您需要在 PC 上运行某种类型的终端应用程序、例如 Tertera Term 或 Termite (我使用此终端应用程序)。

    接下来、 从 TI Resource Explorer 下载此示例代码。 (为了方便起见、我已将其附加到此帖子) 注意、您必须将所有引用从 UCA0更改为 UCA1。  不要忘记也修改 ISR 处理程序。

    理论上、如果一切正常、您应该能够在 PC 键盘上键入一个密钥、MSP430会将该字符回显到终端应用程序。  如果您看不到这种情况、请仔细检查终端应用程序是否配置为115200波特。  如果仍然没有任何内容、则在 ISR 中设置断点。  您是否得到接收中断?

    e2e.ti.com/.../MSP430F55xx_5F00_uscia0_5F00_uart_5F00_01.c

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

    大家好、Dennis、谢谢大家、但正如我在第一篇帖子中所说的、我已经这么做了、我实际上使用了 CCS 的终端-它起作用了。 仅当我添加/激活与将 USB 用作 HID 相对应的代码部分时、它才会停止工作。

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

    您好、Sergio、

    好的、如果您在调试模式下使用 CCS、但似乎没有执行任何操作、请停止程序。  调试器会将您置于代码中的什么位置?

    另一个要尝试的操作是在代码中的各个位置设置断点、并查看 CPU 是否达到该距离。  例如、CPU 是否完成时钟初始化?  CPU 是否完成 USCI 初始化?  USB? 等等  尝试按您的方式浏览整个代码、以查看 CPU 最终在哪里结束。

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

    您好、Sergio、

    我听说过您几天,因此我假设您能够推进您的项目。
    如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。
    如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。