7.12飞控TM4C123G和openmv通信
遇到的问题:无法判断飞控接收到的openmv的数据是否正确,方案一:用匿名上位机查看飞控接受到的数据,但是由于匿名通信协议调试不出来,只能另外找方法来查看数据是否正确
解决方法:用一块stm32f1指南针芯片作为调试工具,用野火调试助手查看
具体实现流程:
1.tm4c串口2接收openmv的数据存在缓存数组中
2.然后把缓存数组通过串口3发送给stm32
3.stm32将接受到的数据发送给野火串口调试助手,若接受到的数据在串口助手上显示正确则说明飞控正确的接受并解析到了一帧完整的数据。
一、openmv部分:
1.openmv实现的功能,找红色的色块
2.openmv数据帧格式:
帧头:0xaa//一个字节 目的地址:0x61(凌霄飞控硬件地址)//一个字节 帧ID:0x70//一个字节 数据内容长度(不包括帧头帧尾,只包括openMV的数据内容长度):假设为四个(色块的数据)//一个字节 数据内容://四个字节 一个帧一共8个字节。
3.代码实现:
while(True):
clock.tick()
img = sensor.snapshot()
blobs = img.find_blobs([red_threshold_01])
cx=0;cy=0;
if blobs:
max_b = find_max(blobs)
#如果找到了目标颜色
cx=max_b[5]
cy=max_b[6]
cw=max_b[2]
ch=max_b[3]
img.draw_rectangle(max_b[0:4]) # rect
img.draw_cross(max_b[5], max_b[6]) # cx, cy
FH = bytearray([0xAA,0x61,0x70,0x04,cx,cy,cw,ch])
uart.write(FH)
print(clock.fps())
二、TM4C123G部分:
1.帧头||目的地址||ID||数据长度||数据内容8
2.用TM4C123G的串口2接受openmv数据,用串口3发送给stm32
3.代码实现:
void AnoOPENMV_GetOneByte(uint8_t data)
{
static u8 _data_len = 0, _data_cnt = 0;
static u8 rxstate = 0;
if (rxstate == 0 && data == 0xAA)
{
rxstate = 1;
_datatemp_openmv[0] = data;
}
else if (rxstate == 1 && (data == 0xff || data == 0x61))
{
rxstate = 2;
_datatemp_openmv[1] = data;
}
else if (rxstate == 2&&data == 0x70)
{
rxstate = 3;
_datatemp_openmv[2] = data;
}
else if (rxstate == 3 && data < 250)
{
rxstate = 4;
_datatemp_openmv[3] = data;
_data_len = data;
_data_cnt = 0;
}
else if (rxstate == 4 && _data_len > 0)
{
_data_len--;
_datatemp_openmv[4 + _data_cnt++] = data;
if (_data_len == 0)
rxstate = 5;
}
else
{
rxstate = 0;
}
}
#define U2GetOneByte AnoOPENMV_GetOneByte
void UART2_IRQHandler(void)
{
uint8_t com_data;
uint32_t flag = ROM_UARTIntStatus(UART4_BASE,1);
ROM_UARTIntClear(UART4_BASE,flag);
while(ROM_UARTCharsAvail(UART4_BASE))
{
com_data=ROM_UARTCharGet(UART4_BASE);
U2GetOneByte(com_data);
}
if(flag & UART_INT_TX)
{
DrvUart2TxCheck();
}
}
void U3Send_OmvToPc(uint8_t *data)
{
u8 datanum = (*(data+3)+4);
DrvUart3SendBuf(data,datanum);
}
三、stm32调试工具部分
1.这里我用的是串口5的Rx,接收飞控芯片TM4C的串口Tx,然后串口5的Tx接stm32板子上内嵌的ttl-usb芯片的Rx
2.串口:
(1)串口的分配:串口1usb转串口用掉了;串口3wifi用掉了;串口2,4,5空闲
(2)对应的引脚图:串口2 PA2,PA3;串口4 PC10,PC11;串口5 PD2,PC12
3.代码实现:
static void NVIC_Configuration_5(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void USART_Config_5(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(DEBUG_USARTx, &USART_InitStructure);
NVIC_Configuration_5();
USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
USART_Cmd(DEBUG_USARTx, ENABLE);
}
void DEBUG_USART_IRQHandler(void)
{
uint8_t ucTemp;
if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
{
ucTemp = USART_ReceiveData(DEBUG_USARTx);
USART_SendData(DEBUG_USARTx,ucTemp);
}
}
四、接线图示意图:
注意:
(1)openmv的Tx接TM4C的串口2的Rx,GND接GND
(2)TM4C的串口3的Tx接stm32的串口5的Rx,GND接GND
(3)stm32通过usb转串口接电脑上位机
(4)由于飞控串口通过4根杜邦线引出来的,从左到右的顺序位vcc,gnd,Tx,Rx由于当时调试的时候这四根先的接线错误,导致调试了一整个下午才成功。(浪费了很多时间)。
((最开始测试的时候是没有接GND)当时测试的时候,stm32部分接受数据是完全没有问题的,但是我们先用飞控用死循环一直发送0x01进行最简单的检测,32任然无法接受数据,断定不是程序的问题。然后检查接线的问题,最后了查出原因)
(5)当串口调试助手显示到接受的数据之后,发现数据有误,不是原来设定的一帧数据,可以判断飞控能够发送数据,但是可能是由于波特率设置太高了设置成了500000(太快),导致PC机(串口调试助手)接受数据有误,改成115200,就接收正常了。
五、最后上图,一下午的成果呜呜呜~~~~~
|