使用stm32解析富斯i6接收机(IBUS) |
您所在的位置:网站首页 › 无人机接收机怎么接线的 › 使用stm32解析富斯i6接收机(IBUS) |
文章目录
1、通信协议解析说明2、驱动程序设计3、实测4、使用串口空闲中断+DMA接收5、源码
1、通信协议解析说明
常见的官方遥控器大概如下所示: 然后官方也公开了通信协议 从官网我们可以获取到的协议原文如下: 首先是配置时钟,这里是时钟一定要拉到最高,不然通信的时候波特率会出问题(起因是我第一次忘了配然后一直通信失败,读不出准确的数据) 首先是在打开接收中断 我们知道,这里其实就是处理个数据而已所以我们改为数据包即可,代码如下: #define USART_DMA_RX_BUFFER_MAXIMUM 64 // DMA缓冲区大小 extern DMA_HandleTypeDef hdma_usart2_rx; uint8_t FUSI_rx_buffer[USART_DMA_RX_BUFFER_MAXIMUM]; //串口1的DMA接收缓冲区 uint16_t FUSI_rx_len; // DMA一次空闲中断接收到的数据长度 uint8_t FUSI_data[USART_DMA_RX_BUFFER_MAXIMUM]; // DMA接收数据缓存区 uint16_t channel[IBUS_USER_CHANNELS]; void UART_DMA_start(void) { for(uint8_t i = 0;i uint16_t channel_buffer[IBUS_MAX_CHANNLES] = {0}; if(FUSI_data[0] == IBUS_LENGTH && FUSI_data[1] == IBUS_COMMAND40) { checksum_cal = 0xffff - FUSI_data[0] - FUSI_data[1]; for(int i = 0; i for(int j = 0; j //当触发了串口空闲中断 if ((__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET)) { if (huart->Instance == USART2) { __HAL_UART_CLEAR_IDLEFLAG(huart); HAL_UART_DMAStop(huart); FUSI_rx_len = USART_DMA_RX_BUFFER_MAXIMUM - (__HAL_DMA_GET_COUNTER(&hdma_usart2_rx)); memcpy(FUSI_data, FUSI_rx_buffer, USART_DMA_RX_BUFFER_MAXIMUM); memset(FUSI_rx_buffer, 0, USART_DMA_RX_BUFFER_MAXIMUM); while (HAL_UART_Receive_DMA(&huart2, (uint8_t *)FUSI_rx_buffer, USART_DMA_RX_BUFFER_MAXIMUM) != HAL_OK) ; IBUS_READ_CHANNEL(IBUS_USER_CHANNELS); } //下面添加其他串口的处理函数 } }之后在初始话部分开启DMA,并在中断处调用即可! 5、源码fly_ibus.c /* * fly_ibus.c * * Created on: Feb 13, 2022 * Author: LX */ #include "fly_ibus.h" uint8_t rx_buffer[32] = {0}; uint16_t channel[IBUS_USER_CHANNELS] = {0}; uint16_t checksum_cal, checksum_ibus; void IBUS_INIT() { HAL_UART_Receive_IT(IBUS_UART, rx_buffer, 32); } void IBUS_READ_CHANNEL(uint8_t user_channels) { uint16_t channel_buffer[IBUS_MAX_CHANNLES] = {0}; if(rx_buffer[0] == IBUS_LENGTH && rx_buffer[1] == IBUS_COMMAND40) { checksum_cal = 0xffff - rx_buffer[0] - rx_buffer[1]; for(int i = 0; i for(int j = 0; j |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |