Add ble,gps,imu and others in threadx,need test

This commit is contained in:
2025-06-25 14:25:28 +08:00
parent 64f668fc5f
commit 957d1df05f
41 changed files with 3469 additions and 3025 deletions

View File

@@ -25,6 +25,9 @@ uint8_t rx_data; //
uint8_t uart_dma_rx_buf[UART_DMA_RX_BUF_SIZE];
RingBuffer ble_rx_ring = {0}; //<2F><>ʼ<EFBFBD><CABC>
MotorCommand cmd;
LocationData current_location = {0};
float imu_angle = 0.0f;
//<2F><>ʼ<EFBFBD><CABC>DMA<4D><41><EFBFBD>պ<EFBFBD><D5BA><EFBFBD>
void HCBle_InitDMAReception(void)
@@ -119,6 +122,7 @@ void HCBle_ExtractAndParseFrame(void)
// ? JSON<4F><4E><EFBFBD><EFBFBD>
if (strstr(json_buf, "leftSpeed") && strstr(json_buf, "rightSpeed")) {
sscanf(json_buf, "#{\"leftSpeed\":%d,\"rightSpeed\":%d}", &cmd.LeftSpeed, &cmd.RightSpeed);
tx_event_flags_set(&system_events,EVENT_BLE_COMMAND_RECEIVED,TX_OR);
//SetMotorSpeed(cmd.LeftSpeed, cmd.RightSpeed); <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
@@ -134,19 +138,30 @@ void HCBle_ExtractAndParseFrame(void)
}
}
#ifdef task
#ifdef TEST //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>app_thread.h<><68>
// BLE<4C><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ble_rx_task_entry(ULONG thread_input)
{
HCBle_InitDMAReception();
while(1)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HCBle_InitDMAReception();
while(1)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HCBle_ExtractAndParseFrame();
tx_thread_sleep(10);
}
}
void ble_tx_task_entry(ULONG thread_input) {
BLE_Message msg;
while(1) {
if (tx_queue_receive(&ble_tx_queue, &msg, TX_WAIT_FOREVER) == TX_SUCCESS) {
HCBle_SendData("%s", msg.data);
}
}
}
#endif

View File

@@ -7,7 +7,7 @@
#define RING_BUFFER_SIZE 256
#define UART_DMA_RX_BUF_SIZE 64
#define task 1
// HCBle <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>
typedef struct
{
@@ -39,4 +39,6 @@ extern LocationData current_location;
void HCBle_InitDMAReception(void);
void HCBle_ExtractAndParseFrame(void);
void ble_rx_task_entry(ULONG thread_input);
#endif

View File

@@ -1,2 +1,22 @@
#include "IMU.h"
#ifdef TEST
void imu_thread_entry(ULONG thread_input)
{
while (1)
{
// float imu_angle = GetIMUAngle();
float imu_angle = 96.0f; //<2F><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ֵ
current_location.angle = imu_angle;
tx_event_flags_set(&system_events, EVENT_IMU_DATA_READY, TX_OR);
tx_thread_sleep(100);
}
}
#endif

View File

@@ -3,5 +3,5 @@
#include "headfile.h"
void imu_thread_entry(ULONG thread_input);
#endif

View File

@@ -8,4 +8,26 @@ void Shake_Motor_Open(void)
void Shake_Motor_Close(void)
{
HAL_GPIO_WritePin(Shake_Motor_GPIO_Port,Shake_Motor_Pin,GPIO_PIN_RESET); // <20>͵<EFBFBD>ƽ<EFBFBD>ر<EFBFBD>
}
}
// <20><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƹ<EFBFBD><C6B9><EFBFBD>
void Shake_Motor_Left(void)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ: <20><><EFBFBD><EFBFBD>3<EFBFBD><33>
for(int i=0; i<3; i++)
{
HAL_GPIO_WritePin(Shake_Motor_GPIO_Port, Shake_Motor_Pin, GPIO_PIN_SET);
tx_thread_sleep(50);
HAL_GPIO_WritePin(Shake_Motor_GPIO_Port, Shake_Motor_Pin, GPIO_PIN_RESET);
tx_thread_sleep(100);
}
}
void Shake_Motor_Right(void)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ: <20><><EFBFBD><EFBFBD>1<EFBFBD><31>
HAL_GPIO_WritePin(Shake_Motor_GPIO_Port, Shake_Motor_Pin, GPIO_PIN_SET);
tx_thread_sleep(300);
HAL_GPIO_WritePin(Shake_Motor_GPIO_Port, Shake_Motor_Pin, GPIO_PIN_RESET);
}

View File

@@ -5,5 +5,7 @@
void Shake_Motor_Open(void);
void Shake_Motor_Close(void);
// <20><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƹ<EFBFBD><C6B9><EFBFBD>
void Shake_Motor_Left(void);
void Shake_Motor_Right(void);
#endif

View File

@@ -62,22 +62,24 @@ void HCSR04_Trigger(void)
}
#ifdef HCSR_TEST
#ifdef TEST
void ultrasonic_task_entry(ULONG thread_input) {
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
DWT_Init();
while (1) {
HCSR04_Trigger();
ULONG actual_flags;
ULONG events;
if (tx_event_flags_get(&ultrasonic_event, EVENT_ECHO_DONE, TX_OR_CLEAR,
&actual_flags, TX_WAIT_FOREVER) == TX_SUCCESS) {
&events, TX_WAIT_FOREVER) == TX_SUCCESS) {
if (distance_cm < 30) {
// ִ<>б<EFBFBD><D0B1>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>񶯡<EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>
tx_event_flags_set(&system_events,EVENT_OBSTACLE_DETECTED,TX_OR);// ִ<>б<EFBFBD><D0B1>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>񶯡<EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>
}
}
tx_thread_sleep(50); // ÿ<>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 50 ticks
tx_thread_sleep(50); // ÿ<>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 50 ticks 20Hz <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
}
}
#endif
@@ -85,6 +87,8 @@ void ultrasonic_task_entry(ULONG thread_input) {
/*******
Echo <20><><EFBFBD><EFBFBD><EBB2B6><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
@@ -103,8 +107,8 @@ void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
uint32_t delta = (ic_val2 > ic_val1) ? (ic_val2 - ic_val1) : (0xFFFF - ic_val1 + ic_val2);
distance_cm = delta / 58;
// ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD>
// tx_event_flags_set(&ultrasonic_event, EVENT_ECHO_DONE, TX_OR);
// ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD> ȡ<><C8A1>ע<EFBFBD><D7A2><EFBFBD>Ի<EFBFBD><D4BB>Ѳ<EFBFBD><D1B2><EFBFBD><EFBFBD>߳<EFBFBD>
tx_event_flags_set(&ultrasonic_event, EVENT_ECHO_DONE, TX_OR);
}
}
}

View File

@@ -22,4 +22,5 @@ pulse to the trigger input to start the ranging
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Trig Ϊ<>ߵ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><DCB5>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD> HAL_GPIO_WritePin(..., RESET); HAL_Delay(); <20><>һ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
******/
void HCSR04_Trigger(void);
void ultrasonic_task_entry(ULONG thread_input);
#endif

115
fun/gps.c
View File

@@ -1,5 +1,11 @@
#include "gps.h"
//#define TEST 1 //<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><><C8A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ԽӴ<D4BD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>
#define parse 1 // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
/**
<EFBFBD><EFBFBD>ʾ: <20><>Ȼ BLE <20>Լ<EFBFBD> GPS<50><53><EFBFBD><EFBFBD>DMA+ UART<52><54><EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ
BLE --- DMA + IDLE <20>ж<EFBFBD> ѭ<><D1AD> DMA + <20><><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UART IDLE
@@ -17,47 +23,12 @@ extern DMA_HandleTypeDef handle_GPDMA1_Channel3;
uint8_t GPS_DMA_RX_BUF[GPS_DMA_RX_BUF_LEN]; //<2F><><EFBFBD><EFBFBD>DMA<4D><41><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
_GPSData GPS;
// TEST <20>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ĵ<EFBFBD><C4B4>룬else֮<65><D6AE><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC>뵽Thread X<><58>ʵ<EFBFBD>ʿ<EFBFBD><CABF>ƴ<EFBFBD><C6B4><EFBFBD>
#ifdef TEST
//void GPS_DMA_Start(void)
//{
// HAL_UART_Receive_DMA(&huart2,GPS_DMA_RX_BUF,GPS_DMA_RX_BUF_LEN);
// __HAL_DMA_ENABLE_IT(huart2.hdmarx,DMA_IT_HT); //<2F><EFBFBD><EBB4AB><EFBFBD>ж<EFBFBD>
// __HAL_DMA_ENABLE_IT(huart2.hdmarx,DMA_IT_TC); //ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
//}
void GPS_Init(void)
{
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, GPS_DMA_RX_BUF, GPS_DMA_RX_BUF_LEN);
__HAL_DMA_DISABLE_IT(&handle_GPDMA1_Channel3, DMA_IT_HT); // <20><><EFBFBD>ð봫<C3B0><EBB4AB>
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance == USART2)
{
// <20><><EFBFBD><EFBFBD> Size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(GPS.GPS_Buffer,GPS_DMA_RX_BUF,Size);
GPS.GPS_Buffer[Size] = '\0';
GPS.isGetData = 1; //<2F><><EFBFBD>ݽ<EFBFBD><DDBD>ձ<EFBFBD>־λ<D6BE><CEBB>Ϊ1
//<2F><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HAL_UARTEx_ReceiveToIdle_DMA(&huart2,GPS_DMA_RX_BUF,GPS_DMA_RX_BUF_LEN);
__HAL_DMA_DISABLE_IT(&handle_GPDMA1_Channel3,DMA_IT_HT);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void GPS_Data_CLR(void)
{
memset(GPS_DMA_RX_BUF,0,GPS_DMA_RX_BUF_LEN);
}
#ifdef parse
// GPS<50><53><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>
void parseGpsBuffer()
@@ -172,7 +143,6 @@ void parseGpsBuffer()
*/
#endif
// ת<><D7AA><EFBFBD>Ƕ<EFBFBD>
double Convert_to_degrees(char *data)
{
@@ -181,11 +151,82 @@ double Convert_to_degrees(char *data)
double min = temp - deg * 100;
return deg + (min / 60.0);
}
#else // <20>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Thread X
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void GPS_Data_CLR(void)
{
memset(GPS_DMA_RX_BUF,0,GPS_DMA_RX_BUF_LEN);
}
//void GPS_DMA_Start(void)
//{
// HAL_UART_Receive_DMA(&huart2,GPS_DMA_RX_BUF,GPS_DMA_RX_BUF_LEN);
// __HAL_DMA_ENABLE_IT(huart2.hdmarx,DMA_IT_HT); //<2F><EFBFBD><EBB4AB><EFBFBD>ж<EFBFBD>
// __HAL_DMA_ENABLE_IT(huart2.hdmarx,DMA_IT_TC); //ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
//}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance == USART2)
{
// <20><><EFBFBD><EFBFBD> Size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(GPS.GPS_Buffer,GPS_DMA_RX_BUF,Size);
GPS.GPS_Buffer[Size] = '\0';
GPS.isGetData = 1; //<2F><><EFBFBD>ݽ<EFBFBD><DDBD>ձ<EFBFBD>־λ<D6BE><CEBB>Ϊ1
//<2F><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HAL_UARTEx_ReceiveToIdle_DMA(&huart2,GPS_DMA_RX_BUF,GPS_DMA_RX_BUF_LEN);
__HAL_DMA_DISABLE_IT(&handle_GPDMA1_Channel3,DMA_IT_HT);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫʹ<D2AA>õ<EFBFBD>ThreadX <20>Ͱ<EFBFBD>gps.h<>е<EFBFBD> TEST <20><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#ifdef TEST
void gps_thread_entry(ULONG thread_input)
{
GPS_Init();
static int gps_first_fix_sent = 0;
while (1)
{
ULONG events;
tx_event_flags_get(&system_events, EVENT_GPS_DATA_READY, TX_OR_CLEAR, &events, TX_WAIT_FOREVER);
parseGpsBuffer();
if (GPS.isParseData && GPS.isUsefull)
{
current_location.lat = Convert_to_degrees(GPS.latitude);
current_location.lon = Convert_to_degrees(GPS.longitude);
tx_event_flags_set(&system_events, EVENT_LOCATION_UPDATED, TX_OR);
BLE_Message msg;
msg.msg_type = 1;
snprintf(msg.data, sizeof(msg.data), "#{\"lat\":%.6f,\"lon\":%.6f,\"angle\":%.2f}\n",
current_location.lat,
current_location.lon,
current_location.angle);
tx_queue_send(&ble_tx_queue, &msg, TX_WAIT_FOREVER);
if (!gps_first_fix_sent)
{
gps_first_fix_sent = 1;
BLE_Message fix_msg;
fix_msg.msg_type = 2;
snprintf(fix_msg.data, sizeof(fix_msg.data), "#{\"info\":\"GPS fixed and ready\"}\n");
tx_queue_send(&ble_tx_queue, &fix_msg, TX_WAIT_FOREVER);
}
}
}
}
#endif

View File

@@ -8,8 +8,6 @@
#define GPS_DMA_RX_BUF_LEN 200 //<2F>ɸ<EFBFBD><C9B8><EFBFBD>NMEA<45><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define TEST 1 //<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><><C8A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ԽӴ<D4BD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>
#define parse 1 // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
// <20><><EFBFBD><EFBFBD>gps<70><EFBFBD><E1B9B9>
#define GPS_Buffer_Length 80
@@ -35,4 +33,7 @@ typedef struct GPSData
extern _GPSData GPS;
extern uint8_t GPS_DMA_RX_BUF[GPS_DMA_RX_BUF_LEN];
void gps_thread_entry(ULONG thread_input);
#endif