file-type

STM8S操作LT8920实现SBUS接收机源码解析

版权申诉

ZIP文件

5星 · 超过95%的资源 | 1.31MB | 更新于2025-04-12 | 127 浏览量 | 2 评论 | 1 下载量 举报 收藏
download 限时特惠:#11.90
标题和描述提到的文件为“Sbus_STM8S操作LT8920_stm8SBUS接收机_源码.zip”,这涉及了几个关键知识点,包括STM8S微控制器、LT8920芯片以及SBUS通信协议。下面将详细解读这些知识点。 1. STM8S微控制器: STM8S是STMicroelectronics(意法半导体)生产的一系列8位微控制器产品线,该系列基于ST的STM8内核,适用于成本敏感型的嵌入式应用。STM8S系列的微控制器通常具有较高的性能、丰富的外设接口以及丰富的内存配置选项。其内部集成了多种通信接口,例如UART、SPI、I2C以及CAN等。开发者可以使用C语言或者汇编语言通过ST提供的开发工具(如IAR、STVD等)来编写程序。 2. LT8920芯片: LT8920是一款由LATTICE(莱迪思半导体)推出的针对数字视频应用的MIPI-DSI到LVDS桥接芯片。它允许用户将MIPI-DSI格式的信号转换为LVDS(Low Voltage Differential Signaling)信号。这种转换使得它可以与多种显示面板兼容,特别是那些使用LVDS接口的面板。LT8920支持高达8个通道,可以支持高达1080P的显示分辨率,为嵌入式系统中的显示提供了灵活性和高效性。 3. SBUS通信协议: SBUS是一种无线通信协议,广泛应用于遥控车、飞机和多旋翼飞行器等无线电控制领域。SBUS由Futaba公司开发,能够同时发送16个通道的数据,具有很高的集成度和抗干扰能力。SBUS协议使用单线串行接口,允许与接收器的直接连接,传输的数据包括舵机控制信号、飞行器状态信息等。SBUS协议常常被用在模型飞机的遥控器和接收器中,因其较高的通道数量能够满足复杂的控制需求。 4. 文件内容及其应用场景: 从文件名“Sbus_STM8S操作LT8920_stm8SBUS接收机_源码.zip”可以推断,压缩包内应含有STM8S微控制器操作LT8920芯片,并实现与SBUS协议兼容的接收机的源代码。这可能涉及到对LT8920进行配置,接收SBUS信号,并将其转换为STM8S微控制器可以处理的格式,以便进一步控制相关设备或读取数据。例如,在一个遥控车辆或者无人机项目中,可以使用STM8S微控制器来解码SBUS信号,然后根据信号控制电机、舵机等执行元件的运作。 5. 开发和调试过程: 利用源码文件,开发者首先需要配置STM8S的开发环境,安装必要的编译器和调试工具。接下来进行源码的导入和编译,确保程序能够无误地在开发板上运行。在调试过程中,开发者可能需要使用串口调试助手等工具来监测SBUS信号的接收情况,并观察STM8S微控制器的处理结果,确保LT8920与STM8S之间的通信正确无误。 总结来说,该压缩包文件涉及了嵌入式系统开发中的硬件选择、软件编程、协议理解以及调试等多个方面。对于有志于无线遥控、机器人控制或者嵌入式系统开发的工程师和技术爱好者而言,该源码包具有较高的学习和应用价值。通过深入理解文件内容并结合实际的硬件组件,可以进行从设计、编程到最终产品实现的一系列实践活动。

相关推荐

filetype

为什么插上STlink烧录后,在串口调试助手查找不到对应的COM端口,怎么通过sbus打印出数据 #include "Sbus.h" //将sbus信号转化为通道值 SBUS_CH_Struct SBUS_CH; uint8_t update_sbus(uint8_t *buf) { int i; if (buf[23] == 0) { SBUS_CH.ConnectState = 1; SBUS_CH.CH1 = ((int16_t)buf[ 1] >> 0 | ((int16_t)buf[ 2] << 8 )) & 0x07FF; SBUS_CH.CH2 = ((int16_t)buf[ 2] >> 3 | ((int16_t)buf[ 3] << 5 )) & 0x07FF; SBUS_CH.CH3 = ((int16_t)buf[ 3] >> 6 | ((int16_t)buf[ 4] << 2 ) | (int16_t)buf[ 5] << 10 ) & 0x07FF; SBUS_CH.CH4 = ((int16_t)buf[ 5] >> 1 | ((int16_t)buf[ 6] << 7 )) & 0x07FF; SBUS_CH.CH5 = ((int16_t)buf[ 6] >> 4 | ((int16_t)buf[ 7] << 4 )) & 0x07FF; SBUS_CH.CH6 = ((int16_t)buf[ 7] >> 7 | ((int16_t)buf[ 8] << 1 ) | (int16_t)buf[9] << 9 ) & 0x07FF; SBUS_CH.CH7 = ((int16_t)buf[ 9] >> 2 | ((int16_t)buf[10] << 6 )) & 0x07FF; SBUS_CH.CH8 = ((int16_t)buf[10] >> 5 | ((int16_t)buf[11] << 3 )) & 0x07FF; SBUS_CH.CH9 = ((int16_t)buf[12] << 0 | ((int16_t)buf[13] << 8 )) & 0x07FF; SBUS_CH.CH10 = ((int16_t)buf[13] >> 3 | ((int16_t)buf[14] << 5 )) & 0x07FF; SBUS_CH.CH11 = ((int16_t)buf[14] >> 6 | ((int16_t)buf[15] << 2 ) | (int16_t)buf[16] << 10 ) & 0x07FF; SBUS_CH.CH12 = ((int16_t)buf[16] >> 1 | ((int16_t)buf[17] << 7 )) & 0x07FF; SBUS_CH.CH13 = ((int16_t)buf[17] >> 4 | ((int16_t)buf[18] << 4 )) & 0x07FF; SBUS_CH.CH14 = ((int16_t)buf[18] >> 7 | ((int16_t)buf[19] << 1 ) | (int16_t)buf[20] << 9 ) & 0x07FF; SBUS_CH.CH15 = ((int16_t)buf[20] >> 2 | ((int16_t)buf[21] << 6 )) & 0x07FF; SBUS_CH.CH16 = ((int16_t)buf[21] >> 5 | ((int16_t)buf[22] << 3 )) & 0x07FF; // printf("CH1:%d\r\n",SBUS_CH.CH1); // printf("CH2:%d\r\n",SBUS_CH.CH2); // printf("CH3:%d\r\n",SBUS_CH.CH3); // printf("CH4:%d\r\n",SBUS_CH.CH4); // printf("CH5:%d\r\n",SBUS_CH.CH5); // printf("CH6:%d\r\n",SBUS_CH.CH6); // printf("CH7:%d\r\n",SBUS_CH.CH7); return 1; } else { SBUS_CH.ConnectState = 0; return 0; } }

filetype

uint8_t SBUS_GetRxData(uint16_t *pbuf) { if (sbus_rx_ok) { // 解码16个通道数据(修正括号问题) pbuf[0] = (sbus_rx_buf[1] | (sbus_rx_buf[2] << 8)) & 0x07FF; pbuf[1] = ((sbus_rx_buf[2] >> 3) | (sbus_rx_buf[3] << 5)) & 0x07FF; pbuf[2] = ((sbus_rx_buf[3] >> 6) | (sbus_rx_buf[4] << 2) | (sbus_rx_buf[5] << 10)) & 0x07FF; pbuf[3] = ((sbus_rx_buf[5] >> 1) | (sbus_rx_buf[6] << 7)) & 0x07FF; pbuf[4] = ((sbus_rx_buf[6] >> 4) | (sbus_rx_buf[7] << 4)) & 0x07FF; pbuf[5] = ((sbus_rx_buf[7] >> 7) | (sbus_rx_buf[8] << 1) | (sbus_rx_buf[9] << 9)) & 0x07FF; pbuf[6] = ((sbus_rx_buf[9] >> 2) | (sbus_rx_buf[10] << 6)) & 0x07FF; pbuf[7] = ((sbus_rx_buf[10] >> 5) | (sbus_rx_buf[11] << 3)) & 0x07FF; pbuf[8] = (sbus_rx_buf[12] | (sbus_rx_buf[13] << 8)) & 0x07FF; pbuf[9] = ((sbus_rx_buf[13] >> 3) | (sbus_rx_buf[14] << 5)) & 0x07FF; pbuf[10] = ((sbus_rx_buf[14] >> 6) | (sbus_rx_buf[15] << 2) | (sbus_rx_buf[16] << 10)) & 0x07FF; pbuf[11] = ((sbus_rx_buf[16] >> 1) | (sbus_rx_buf[17] << 7)) & 0x07FF; pbuf[12] = ((sbus_rx_buf[17] >> 4) | (sbus_rx_buf[18] << 4)) & 0x07FF; pbuf[13] = ((sbus_rx_buf[18] >> 7) | (sbus_rx_buf[19] << 1) | (sbus_rx_buf[20] << 9)) & 0x07FF; pbuf[14] = ((sbus_rx_buf[20] >> 2) | (sbus_rx_buf[21] << 6)) & 0x07FF; pbuf[15] = ((sbus_rx_buf[21] >> 5) | (sbus_rx_buf[22] << 3)) & 0x07FF; sbus_rx_ok = 0; // 清除接收标志 return 1; } return 0; } 上面代码是对SBUS协议进行接收并解析。 根据上面协议解析遥控器通道1到通道4打到最小时,解析结果和原数据如下: c1=0306 c2=0306 c3=0306 c4=0306 c5=1694 c6=1694 c7=1694 c8=1000 c9=0306 c10=1694 c11=0306 c12=1694 0F 32 91 89 4C 64 E2 69 4F 7B 1A 7D 32 F1 B4 4C 3C 0D 40 00 02 10 80 00 00 根据上面协议解析遥控器通道1到通道4打到最大时,解析结果和原数据如下: c1=1693 c2=1693 c3=1693 c4=1693 c5=1694 c6=1694 c7=1694 c8=1000 c9=0306 c10=1694 c11=0306 c12=1694 0F 9D EE 74 A7 3B ED 69 4F 7B 1A 7D 32 F1 B4 4C 3C 0D 40 00 02 10 80 00 00 遥控器的中间值解析后为1000,现在使用STM32H723的串口9根据上面的协议模拟遥控器发送SBUS协议,写一个完整的代码,每行代码带详细注释,区分.c和.h文件,其中串口9的发送初始化已经完成,如下: void MX_UART9_Init(void) { /* USER CODE BEGIN UART9_Init 0 */ /* USER CODE END UART9_Init 0 */ /* USER CODE BEGIN UART9_Init 1 */ /* USER CODE END UART9_Init 1 */ huart9.Instance = UART9; huart9.Init.BaudRate = 100000; huart9.Init.WordLength = UART_WORDLENGTH_8B; huart9.Init.StopBits = UART_STOPBITS_2; huart9.Init.Parity = UART_PARITY_EVEN; huart9.Init.Mode = UART_MODE_TX; huart9.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart9.Init.OverSampling = UART_OVERSAMPLING_16; huart9.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart9.Init.ClockPrescaler = UART_PRESCALER_DIV1; huart9.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_TXINVERT_INIT; huart9.AdvancedInit.TxPinLevelInvert = UART_ADVFEATURE_TXINV_ENABLE; if (HAL_UART_Init(&huart9) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetTxFifoThreshold(&huart9, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetRxFifoThreshold(&huart9, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_DisableFifoMode(&huart9) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN UART9_Init 2 */ /* USER CODE END UART9_Init 2 */ }

filetype

#include "flex_core/RemoteControlParser.hpp" #include <cstdlib> #include <cstdio> #include <cstring> #include <sys/types.h> #include <unistd.h> RemoteControlDataParser::RemoteControlDataParser(std::string name):Node(name){ remote_control_serial_ = std::make_shared<QSerialPort>(); remote_ctrl_msg_pub_ = this->create_publisher<flex_msgs::msg::RemoteControl>("remote_ctrl_data", rclcpp::QoS(100)); InitRemoteCtrlSerialport("/dev/ttyUSB0"); connect(remote_control_serial_.get(), SIGNAL(readyRead()), this, SLOT(ReadRemoteControlSerialDataCallback())); std::thread remote_ctl_thread = std::thread(&RemoteControlDataParser::NodeSpinThread, this); remote_ctl_thread.detach(); } bool RemoteControlDataParser::InitRemoteCtrlSerialport(const std::string port_name)const{ remote_control_serial_->setPortName(QString::fromStdString(port_name)); remote_control_serial_->setBaudRate(100000); remote_control_serial_->setDataBits(QSerialPort::Data8); remote_control_serial_->setParity(QSerialPort::EvenParity); remote_control_serial_->setStopBits(QSerialPort::TwoStop); remote_control_serial_->setFlowControl(QSerialPort::NoFlowControl); if (remote_control_serial_->open(QIODevice::ReadWrite)) { RCLCPP_INFO_STREAM(this->get_logger(),"Open Remote Receive Serial Success in: "<<remote_control_serial_->portName().toStdString()); return true; }else{ RCLCPP_INFO_STREAM(this->get_logger(),"Open Remote Receive Serial Failed in: "<< port_name); return false; } } void RemoteControlDataParser::ReadRemoteControlSerialDataCallback(){ // qint64 rece_len = remote_control_serial_->bytesAvailable(); QByteArray received_buffer = remote_control_serial_->readAll(); if (!received_buffer.isEmpty()) { flex_msgs::msg::RemoteControl remote_ctl_msg; rclcpp::Clock clock; remote_ctl_msg.header.stamp = clock.now(); Parser(received_buffer,remote_ctl_msg); remote_ctrl_msg_pub_->publish(remote_ctl_msg); } } void RemoteControlDataParser::Parser(const QByteArray &sbus_buf, flex_msgs::msg::RemoteControl &rc_ctrl){ auto sbus_buf_temp = reinterpret_cast<unsigned char *>(const_cast<char *>(sbus_buf.data())); rc_ctrl.channels_value[0] = static_cast<int16_t>((sbus_buf_temp[1] | (sbus_buf_temp[2] << 8)) & 0x07ff); rc_ctrl.channels_value[1] = static_cast<int16_t>(((sbus_buf_temp[2] >> 3) | (sbus_buf_temp[3] << 5)) & 0x07ff); rc_ctrl.channels_value[2] = static_cast<int16_t>(((sbus_buf_temp[3] >> 6) | (sbus_buf_temp[4] << 2) | (sbus_buf_temp[5] << 10)) & 0x07ff); rc_ctrl.channels_value[3] = static_cast<int16_t>(((sbus_buf_temp[5] >> 1) | (sbus_buf_temp[6] << 7)) & 0x07ff); rc_ctrl.channels_value[4] = static_cast<int16_t>(((sbus_buf_temp[6] >> 4) | (sbus_buf_temp[7] << 4)) & 0x07ff); rc_ctrl.channels_value[5] = static_cast<int16_t>(((sbus_buf_temp[7] >> 7) | (sbus_buf_temp[8] << 1) | (sbus_buf_temp[9] << 9)) & 0x07ff); rc_ctrl.channels_value[6] = static_cast<int16_t>(((sbus_buf_temp[9] >> 2) | (sbus_buf_temp[10] << 6)) & 0x07ff); rc_ctrl.channels_value[7] = static_cast<int16_t>(((sbus_buf_temp[10]>> 5) | (sbus_buf_temp[11] << 3)) & 0x07ff); rc_ctrl.channels_value[8] = static_cast<int16_t>(((sbus_buf_temp[12]<< 0) | (sbus_buf_temp[13] << 8)) & 0x07ff); rc_ctrl.channels_value[9] = static_cast<int16_t>(((sbus_buf_temp[13]>> 3) | (sbus_buf_temp[14] << 5)) & 0x07ff); } 运行结果QSocketNotifier: Can only be used with threads started with QThread [INFO] [1757998424.558090814] [remote_control_node]: Open Remote Receive Serial Success in: ttyUSB0 terminate called after throwing an instance of 'std::bad_weak_ptr' what(): bad_weak_ptr [ros2run]: Aborted

资源评论
用户头像
武藏美-伊雯
2025.05.10
这款文档资源提供了针对STM8S微控制器操作LT8920 SBUS接收机的详细源码,对于需要进行相关硬件编程的开发者来说非常实用。🌋
用户头像
是因为太久
2025.04.27
该资源包非常有助于快速实现STM8S微控制器与LT8920 SBUS接收机的通信,适用于飞控、遥控等领域。
mYlEaVeiSmVp
  • 粉丝: 2371
上传资源 快速赚钱