Изменена логика работы с UART и обработки данных. Добавлен кольцевой буфер
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
#include "stm32g431xx.h"
|
#include "stm32g431xx.h"
|
||||||
|
|
||||||
#define USART3_START_BYTE 0x59
|
#define USART3_START_BYTE 0x59
|
||||||
|
#define USART3_BUF_SIZE 64
|
||||||
#define USART3_FRAME_SIZE 9
|
#define USART3_FRAME_SIZE 9
|
||||||
#define LIDAR_MIN_DIST 0.01f
|
#define LIDAR_MIN_DIST 0.01f
|
||||||
#define LIDAR_MAX_DIST 40.0f
|
#define LIDAR_MAX_DIST 40.0f
|
||||||
@@ -26,7 +27,7 @@ typedef struct
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint16_t distance; // meters
|
uint16_t distance; // cm
|
||||||
uint16_t strength;
|
uint16_t strength;
|
||||||
uint16_t temperature;
|
uint16_t temperature;
|
||||||
} lidar_data;
|
} lidar_data;
|
||||||
@@ -37,6 +38,9 @@ void TIM7_DAC_IRQHandler();
|
|||||||
void USART3_IRQHandler();
|
void USART3_IRQHandler();
|
||||||
void lidar_update(lidar_data* lidar);
|
void lidar_update(lidar_data* lidar);
|
||||||
|
|
||||||
|
uint8_t usart_available();
|
||||||
|
uint8_t usart_read();
|
||||||
|
|
||||||
void lidar_i2c2_init();
|
void lidar_i2c2_init();
|
||||||
static void i2c2_wait_txis();
|
static void i2c2_wait_txis();
|
||||||
static void i2c2_wait_stop();
|
static void i2c2_wait_stop();
|
||||||
|
|||||||
@@ -1,11 +1,8 @@
|
|||||||
#include "lidar.h"
|
#include "lidar.h"
|
||||||
|
|
||||||
volatile uint8_t usart3_index = 0;
|
volatile uint8_t usart3_rx_buf[USART3_BUF_SIZE];
|
||||||
volatile uint8_t usart3_checksum = 0;
|
static uint8_t usart3_rx_head = 0;
|
||||||
volatile uint8_t usart3_frame_ready = 0;
|
static uint8_t usart3_rx_tail = 0;
|
||||||
volatile uint8_t lidar_update_flag = 0;
|
|
||||||
static lidar_data_buf buffer;
|
|
||||||
static uint8_t* buff_data = (uint8_t*)&buffer;
|
|
||||||
|
|
||||||
void lidar_init()
|
void lidar_init()
|
||||||
{
|
{
|
||||||
@@ -78,7 +75,7 @@ void TIM7_DAC_IRQHandler()
|
|||||||
if (TIM7->SR & TIM_SR_UIF)
|
if (TIM7->SR & TIM_SR_UIF)
|
||||||
{
|
{
|
||||||
TIM7->SR &= ~TIM_SR_UIF;
|
TIM7->SR &= ~TIM_SR_UIF;
|
||||||
lidar_update_flag = 1;
|
//lidar_update_flag = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,42 +83,49 @@ void USART3_IRQHandler()
|
|||||||
{
|
{
|
||||||
if (USART3->ISR & USART_ISR_RXNE)
|
if (USART3->ISR & USART_ISR_RXNE)
|
||||||
{
|
{
|
||||||
uint8_t b = USART3->RDR;
|
usart3_rx_buf[usart3_rx_head] = USART3->RDR;
|
||||||
|
usart3_rx_head = (usart3_rx_head + 1) % USART3_BUF_SIZE;
|
||||||
if (usart3_index < 2)
|
|
||||||
{
|
|
||||||
if (b == USART3_START_BYTE)
|
|
||||||
buff_data[usart3_index++] = b;
|
|
||||||
}
|
|
||||||
else if (usart3_index < USART3_FRAME_SIZE)
|
|
||||||
buff_data[usart3_index++] = b;
|
|
||||||
|
|
||||||
if (usart3_index == USART3_FRAME_SIZE)
|
|
||||||
{
|
|
||||||
usart3_index = 0;
|
|
||||||
usart3_frame_ready = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t usart_available()
|
||||||
|
{
|
||||||
|
return usart3_rx_head != usart3_rx_tail;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t usart_read()
|
||||||
|
{
|
||||||
|
uint8_t data = usart3_rx_buf[usart3_rx_tail];
|
||||||
|
usart3_rx_tail = (usart3_rx_tail + 1) % USART3_BUF_SIZE;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
void lidar_update(lidar_data* lidar)
|
void lidar_update(lidar_data* lidar)
|
||||||
{
|
{
|
||||||
if (!lidar_update_flag)
|
static uint8_t frame[USART3_FRAME_SIZE];
|
||||||
return;
|
static uint8_t index = 0;
|
||||||
|
|
||||||
if (!usart3_frame_ready)
|
while(usart_available())
|
||||||
return;
|
{
|
||||||
|
uint8_t c = usart_read();
|
||||||
usart3_frame_ready = 0;
|
|
||||||
|
frame[index++] = c;
|
||||||
for (uint8_t i = 0; i < USART3_FRAME_SIZE; ++i) usart3_checksum += buff_data[i];
|
|
||||||
|
if (index == USART3_FRAME_SIZE)
|
||||||
if (buffer.checksum != usart3_checksum)
|
{
|
||||||
return;
|
uint8_t checksum = 0;
|
||||||
|
for (uint8_t i = 0; i < USART3_FRAME_SIZE - 1; ++i) checksum += frame[i];
|
||||||
lidar->distance = buffer.distance_l | (buffer.distance_h << 8);
|
|
||||||
lidar->strength = buffer.strength_l | (buffer.strength_h << 8);
|
if (checksum == frame[USART3_FRAME_SIZE - 1])
|
||||||
lidar->temperature = buffer.temp_l | (buffer.temp_h << 8);
|
{
|
||||||
|
lidar->distance = frame[2] | (frame[3] << 8);
|
||||||
|
lidar->strength = frame[4] | (frame[5] << 8);
|
||||||
|
lidar->temperature = frame[6] | (frame[7] << 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lidar_i2c2_init()
|
void lidar_i2c2_init()
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ int main(void)
|
|||||||
motors_init();*/
|
motors_init();*/
|
||||||
|
|
||||||
lidar_init();
|
lidar_init();
|
||||||
lidar_tim7_init();
|
// lidar_tim7_init();
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user