SBUS协议学习
目錄
文章目錄
- 目錄
- 摘要
- 1.什么是SBUS協議
- 2. STM32 解析 SBUS協議
- 2.1初始化串口接收
- 2.2配置串口中斷服務函數
- 2.3進行SBUS數據解析
- 2.4在任務中調用
- 2.5相關變量和定義
- 3.獲取數據
摘要
本節主要記錄自己學習SBUS協議的過程,歡迎批評指正!!!這里參考下面這個博客:sbus協議解析
1.什么是SBUS協議
SBUS是一個接收機串行總線輸出,通過這根總線,可以獲得遙控器上所有通道的數據。目前很多模型及無人機電子設備都支持SBUS總線的接入。使用SBUS總線獲取通道數據,效率高的,而且節省硬件資源,只需要一根線即可獲取所有通道的數據。
- 特點1:SBUS總線使用的是TTL電平的反向電平,即標準TTL中的1取反為0,而0則取反為1,串口波特率為100000,數據位為8位,2個停止位,偶校驗。
- 特點2:SBUS一幀數據的長度為25個字節,其中第"0"個字節為幀頭:0x0f;第24個字節為幀尾:0x00;從第1個字節到第22個字節為1-16號比例通道的數據字節;第23字節中,第7位為數字開關通道17通道,第6位為數字開關通道18通道。第5位為幀狀態標志為(判斷是否丟幀),用于控制接收機上的LED的狀態,第4位為失控保護激活標志位,此位為1時,表示接收機進入失控保護狀態。
- 特點3:SBUS為什么是16個通道?因為22x8=11x16,每個通道用11bit表示,范圍是0-2047。兩幀之間的時間間隔4ms(高速模式),約7ms一幀。
具體的SBUS介紹,可以參考官網信息sbus協議官網地址
2. STM32 解析 SBUS協議
2.1初始化串口接收
void Sbus_Init(uint32_t bound) {//GPIO???úéè??GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //ê1?üUSART3ê±?óRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //ê1?üGPIOBê±?ó//USART3_RX GPIOB.113?ê??ˉGPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//????ê?è?GPIO_Init(GPIOB, &GPIO_InitStructure);//3?ê??ˉGPIOB11//USART3_RX NVIC ????NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//?à??ó??è??3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //×óó??è??0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μàê1?üNVIC_Init(&NVIC_InitStructure); //?ù?Y???¨μ?2?êy3?ê??ˉVIC??′??÷//USART3 3?ê??ˉéè??USART_InitStructure.USART_BaudRate = bound;//′??ú2¨ì??êUSART_InitStructure.USART_WordLength = USART_WordLength_8b;//×?3¤?a8??êy?Y??ê?USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò???í£?1??USART_InitStructure.USART_Parity = USART_Parity_No;//?T????D£?é??USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//?Tó2?têy?Yá÷????USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //ê?·¢?£ê?USART_Init(USART3, &USART_InitStructure); //3?ê??ˉ′??ú3USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//?a??′??ú?óêü?D??USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);USART_Cmd(USART3, ENABLE); //ê1?ü′??ú3}2.2配置串口中斷服務函數
void USART3_IRQHandler(void) {uint8_t res;uint8_t clear = 0;static uint8_t Rx_Sta = 1;if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){res =USART3->DR;USART3_RX_BUF[Rx_Sta++] = res;}else if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET){clear = USART3->SR;clear = USART3->DR;USART3_RX_BUF[0] = Rx_Sta - 1;Rx_Sta = 1;} }2.3進行SBUS數據解析
void Sbus_Data_Count(uint8_t *buf) {sbus_ch[ 0] = ((int16_t)buf[ 2] >> 0 | ((int16_t)buf[ 3] << 8 )) & 0x07FF;sbus_ch[ 1] = ((int16_t)buf[ 3] >> 3 | ((int16_t)buf[ 4] << 5 )) & 0x07FF;sbus_ch[ 2] = ((int16_t)buf[ 4] >> 6 | ((int16_t)buf[ 5] << 2 ) | (int16_t)buf[ 6] << 10 ) & 0x07FF;sbus_ch[ 3] = ((int16_t)buf[ 6] >> 1 | ((int16_t)buf[ 7] << 7 )) & 0x07FF;sbus_ch[ 4] = ((int16_t)buf[ 7] >> 4 | ((int16_t)buf[ 8] << 4 )) & 0x07FF;sbus_ch[ 5] = ((int16_t)buf[ 8] >> 7 | ((int16_t)buf[ 9] << 1 ) | (int16_t)buf[10] << 9 ) & 0x07FF;sbus_ch[ 6] = ((int16_t)buf[10] >> 2 | ((int16_t)buf[11] << 6 )) & 0x07FF;sbus_ch[ 7] = ((int16_t)buf[11] >> 5 | ((int16_t)buf[12] << 3 )) & 0x07FF;sbus_ch[ 8] = ((int16_t)buf[13] << 0 | ((int16_t)buf[14] << 8 )) & 0x07FF;sbus_ch[ 9] = ((int16_t)buf[14] >> 3 | ((int16_t)buf[15] << 5 )) & 0x07FF;sbus_ch[10] = ((int16_t)buf[15] >> 6 | ((int16_t)buf[16] << 2 ) | (int16_t)buf[17] << 10 ) & 0x07FF;sbus_ch[11] = ((int16_t)buf[17] >> 1 | ((int16_t)buf[18] << 7 )) & 0x07FF;sbus_ch[12] = ((int16_t)buf[18] >> 4 | ((int16_t)buf[19] << 4 )) & 0x07FF;sbus_ch[13] = ((int16_t)buf[19] >> 7 | ((int16_t)buf[20] << 1 ) | (int16_t)buf[21] << 9 ) & 0x07FF;sbus_ch[14] = ((int16_t)buf[21] >> 2 | ((int16_t)buf[22] << 6 )) & 0x07FF;sbus_ch[15] = ((int16_t)buf[22] >> 5 | ((int16_t)buf[23] << 3 )) & 0x07FF; }2.4在任務中調用
void Loop_Task_5ms(void) {Sbus_Data_Count(USART3_RX_BUF); }2.5相關變量和定義
uint8_t USART3_RX_BUF[26]; uint16_t sbus_ch[18]; //í¨μàêy?Y uint8_t sbus_rc_flag = 0; #ifndef __SBUS__H__ #define __SBUS__H__ #include "uart.h" extern uint8_t USART3_RX_BUF[26]; extern uint16_t sbus_ch[18]; //í¨μàêy?Y extern uint8_t sbus_rc_flag ; void Sbus_Init(uint32_t bound); void Sbus_Data_Count(uint8_t *buf); #endif3.獲取數據
總結
- 上一篇: java ognl表达式_java --
- 下一篇: TQ210——S5PV210串口通信