diff --git a/CAR.ioc b/CAR.ioc index 193dc86..4e36b4b 100644 --- a/CAR.ioc +++ b/CAR.ioc @@ -3,7 +3,8 @@ CAD.formats= CAD.pinconfig= CAD.provider= Dma.Request0=USART2_RX -Dma.RequestsNb=1 +Dma.Request1=USART2_TX +Dma.RequestsNb=2 Dma.USART2_RX.0.Direction=DMA_PERIPH_TO_MEMORY Dma.USART2_RX.0.Instance=DMA1_Channel6 Dma.USART2_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE @@ -13,6 +14,15 @@ Dma.USART2_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE Dma.USART2_RX.0.PeriphInc=DMA_PINC_DISABLE Dma.USART2_RX.0.Priority=DMA_PRIORITY_HIGH Dma.USART2_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority +Dma.USART2_TX.1.Direction=DMA_MEMORY_TO_PERIPH +Dma.USART2_TX.1.Instance=DMA1_Channel7 +Dma.USART2_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.USART2_TX.1.MemInc=DMA_MINC_ENABLE +Dma.USART2_TX.1.Mode=DMA_NORMAL +Dma.USART2_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.USART2_TX.1.PeriphInc=DMA_PINC_DISABLE +Dma.USART2_TX.1.Priority=DMA_PRIORITY_MEDIUM +Dma.USART2_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority File.Version=6 GPIO.groupedBy=Group By Peripherals KeepUserPlacement=false @@ -72,6 +82,7 @@ MxCube.Version=6.12.0 MxDb.Version=DB.6.0.120 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.DMA1_Channel6_IRQn=true\:3\:0\:true\:false\:true\:true\:true\:true +NVIC.DMA1_Channel7_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.EXTI15_10_IRQn=true\:2\:0\:true\:false\:true\:true\:true\:true NVIC.ForceEnableDMAVector=false diff --git a/Core/Inc/stm32f1xx_it.h b/Core/Inc/stm32f1xx_it.h index bd67008..a4550ab 100644 --- a/Core/Inc/stm32f1xx_it.h +++ b/Core/Inc/stm32f1xx_it.h @@ -56,6 +56,7 @@ void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); void DMA1_Channel6_IRQHandler(void); +void DMA1_Channel7_IRQHandler(void); void TIM2_IRQHandler(void); void TIM4_IRQHandler(void); void USART1_IRQHandler(void); diff --git a/Core/Src/dma.c b/Core/Src/dma.c index f3db5b2..823f15d 100644 --- a/Core/Src/dma.c +++ b/Core/Src/dma.c @@ -46,6 +46,9 @@ void MX_DMA_Init(void) /* DMA1_Channel6_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 3, 0); HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn); + /* DMA1_Channel7_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn); } diff --git a/Core/Src/stm32f1xx_it.c b/Core/Src/stm32f1xx_it.c index 1c3f5e6..d1c75b9 100644 --- a/Core/Src/stm32f1xx_it.c +++ b/Core/Src/stm32f1xx_it.c @@ -58,6 +58,7 @@ extern TIM_HandleTypeDef htim2; extern TIM_HandleTypeDef htim4; extern DMA_HandleTypeDef hdma_usart2_rx; +extern DMA_HandleTypeDef hdma_usart2_tx; extern UART_HandleTypeDef huart1; extern UART_HandleTypeDef huart2; /* USER CODE BEGIN EV */ @@ -216,6 +217,20 @@ void DMA1_Channel6_IRQHandler(void) /* USER CODE END DMA1_Channel6_IRQn 1 */ } +/** + * @brief This function handles DMA1 channel7 global interrupt. + */ +void DMA1_Channel7_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Channel7_IRQn 0 */ + + /* USER CODE END DMA1_Channel7_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_usart2_tx); + /* USER CODE BEGIN DMA1_Channel7_IRQn 1 */ + + /* USER CODE END DMA1_Channel7_IRQn 1 */ +} + /** * @brief This function handles TIM2 global interrupt. */ diff --git a/Core/Src/usart.c b/Core/Src/usart.c index f0a8fb1..051cc8a 100644 --- a/Core/Src/usart.c +++ b/Core/Src/usart.c @@ -27,6 +27,7 @@ UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; DMA_HandleTypeDef hdma_usart2_rx; +DMA_HandleTypeDef hdma_usart2_tx; /* USART1 init function */ @@ -161,6 +162,22 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx); + /* USART2_TX Init */ + hdma_usart2_tx.Instance = DMA1_Channel7; + hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE; + hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_usart2_tx.Init.Mode = DMA_NORMAL; + hdma_usart2_tx.Init.Priority = DMA_PRIORITY_MEDIUM; + if (HAL_DMA_Init(&hdma_usart2_tx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart2_tx); + /* USART2 interrupt Init */ HAL_NVIC_SetPriority(USART2_IRQn, 3, 0); HAL_NVIC_EnableIRQ(USART2_IRQn); @@ -209,6 +226,7 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) /* USART2 DMA DeInit */ HAL_DMA_DeInit(uartHandle->hdmarx); + HAL_DMA_DeInit(uartHandle->hdmatx); /* USART2 interrupt Deinit */ HAL_NVIC_DisableIRQ(USART2_IRQn); diff --git a/Peripheral/Inc/bluetooth.h b/Peripheral/Inc/bluetooth.h index 856f8af..59b15c7 100644 --- a/Peripheral/Inc/bluetooth.h +++ b/Peripheral/Inc/bluetooth.h @@ -4,5 +4,6 @@ #include "main.h" void BLUETOOTH_Init(void); +void BLUETOOTH_Send(const char *str, ...); #endif diff --git a/Peripheral/Inc/control.h b/Peripheral/Inc/control.h index 24c2799..926a45c 100644 --- a/Peripheral/Inc/control.h +++ b/Peripheral/Inc/control.h @@ -15,6 +15,7 @@ extern uint8_t mode; void CONTROL_CommonCmd(uint8_t type, uint8_t state); +void CONTROL_Servo(uint8_t degree); void CONTROL_RGB(uint8_t r, uint8_t g, uint8_t b); void CONTROL_Mode(uint8_t new_mode, uint8_t state); diff --git a/Peripheral/Src/bluetooth.c b/Peripheral/Src/bluetooth.c index 5ec1d50..04913c9 100644 --- a/Peripheral/Src/bluetooth.c +++ b/Peripheral/Src/bluetooth.c @@ -1,33 +1,50 @@ #include "bluetooth.h" #include "usart.h" #include "control.h" +#include "line_seek.h" +#include "infrared.h" +#include "hcsr04.h" +#include "timer.h" #include #include -#include "syscalls.h" +#include +#include -#define BUFFER_SIZE 100 +#define BUFFER_SIZE 255 #define MESSAGE_SIZE 19 #define CMD_NUM 9 -static int8_t rxBuffer[BUFFER_SIZE], txBuffer[10000]; +static int8_t rxBuffer[BUFFER_SIZE], txBuffer[BUFFER_SIZE]; static uint16_t txLen; static uint8_t cmdIndex; +void sendSensor(void) +{ + static uint8_t line_seek[5]; + strcpy(line_seek, LineSeek_GetStatusStr()); + for (uint8_t i = 0; i < 5; ++i) + line_seek[i] ^= 1; + BLUETOOTH_Send("$4WD,CSB%u,PV-,GS-,LF%s,HW%hhu%hhu,GM-#", + (uint32_t)round((double)sonor_distance / 10), + line_seek, + !INFRARED_GetL(), + !INFRARED_GetR()); +} + void BLUETOOTH_Init(void) { HAL_UARTEx_ReceiveToIdle_IT(&huart2, rxBuffer, 100); - // HAL_UART_Receive_IT(&huart2, txBuffer + txLen, 1); + TIMER_AddLoopEvent(EVENT_BLUETOOTH, sendSensor, 200); } -// void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) -// { -// if (huart == &huart2) -// { -// ++txLen; -// if (txLen == 10000) -// txLen = 0; -// } -// } +void BLUETOOTH_Send(const char *str, ...) +{ + va_list args; + va_start(args, str); + vsprintf(txBuffer, str, args); + va_end(args); + HAL_UART_Transmit_DMA(&huart2, txBuffer, strlen(txBuffer)); +} void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { @@ -65,6 +82,8 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) break; // 舵机云台 case 'P': + sscanf(rxBuffer + 5, "%*3s%hu", num); + CONTROL_Servo(180 - num[0]); break; // 七彩灯 case 'C': @@ -73,15 +92,6 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) break; } } - // my_printf(&huart2, rxBuffer); - // strcpy(txBuffer + txLen, rxBuffer); - // if (txLen + Size >= 9999) - // txLen = 0; - // else - // txLen += Size; - // txBuffer[txLen] = '\0'; - // if (strcmp(rxBuffer, "$send#") == 0) - // my_printf(&huart2, txBuffer); BLUETOOTH_Init(); } } diff --git a/Peripheral/Src/control.c b/Peripheral/Src/control.c index e5afd94..4932216 100644 --- a/Peripheral/Src/control.c +++ b/Peripheral/Src/control.c @@ -2,16 +2,18 @@ #include "hcsr04.h" #include "led.h" #include "motor.h" +#include "buzzer.h" +#include "servo.h" #define CMD_MOVE 0 #define CMD_ROTATE 1 #define CMD_BUZZER 2 #define CMD_SPEED 3 -// #define CMD_SHAKE 4 +#define CMD_SERVO 4 // #define CMD_SING 5 #define CMD_LED 6 // #define CMD_FIRE 7 -// #define CMD_SERVO 8 +#define CMD_SERVO_RESET 8 // 小车默认速度 static int8_t speed = 20; @@ -21,11 +23,10 @@ void carMove(uint8_t state); void carSpin(uint8_t state); void callBuzzer(uint8_t state); void setSpeed(uint8_t state); -// void shake(uint8_t state); +void setServo(uint8_t state); // void sing(uint8_t state); void setLed(uint8_t state); // void fire(uint8_t state); -// void servo(uint8_t state); void CONTROL_CommonCmd(uint8_t type, uint8_t state) { @@ -43,21 +44,28 @@ void CONTROL_CommonCmd(uint8_t type, uint8_t state) case CMD_SPEED: setSpeed(state); break; - // case CMD_SHAKE: - // break; + case CMD_SERVO: + setServo(state); + break; // case CMD_SING: // break; case CMD_LED: setLed(state); break; - // case CMD_FIRE: - // break; - // case CMD_SERVO: - // break; + // case CMD_FIRE: + // break; + case CMD_SERVO_RESET: + SERVO_Init(); + break; } } -void CONTROL_RGB(uint8_t r, uint8_t g, uint8_t b) +inline void CONTROL_Servo(uint8_t degree) +{ + SERVO_Rotate(degree); +} + +inline void CONTROL_RGB(uint8_t r, uint8_t g, uint8_t b) { LED_Start(LED_ALL); LED_SetDuty(r, g, b); @@ -121,7 +129,7 @@ void carMove(uint8_t state) } } -void carSpin(uint8_t state) +inline void carSpin(uint8_t state) { if (state == 1) MOTOR_SetDuty(speed, -speed); @@ -129,11 +137,9 @@ void carSpin(uint8_t state) MOTOR_SetDuty(-speed, speed); } -void callBuzzer(uint8_t state) +inline void callBuzzer(uint8_t state) { - HAL_GPIO_WritePin(FM_K2_POWERC_GPIO_Port, FM_K2_POWERC_Pin, GPIO_PIN_RESET); - HAL_Delay(200); - HAL_GPIO_WritePin(FM_K2_POWERC_GPIO_Port, FM_K2_POWERC_Pin, GPIO_PIN_SET); + BUZZER_StartTimed(5); } void setSpeed(uint8_t state) @@ -148,6 +154,14 @@ void setSpeed(uint8_t state) speed = 20; } +void setServo(uint8_t state) +{ + if (state == 1) + SERVO_Rotate(180); + else if (state == 2) + SERVO_Rotate(0); +} + void setLed(uint8_t state) { LED_Start(LED_ALL); diff --git a/Peripheral/Src/hcsr04.c b/Peripheral/Src/hcsr04.c index d8df96a..f46e603 100644 --- a/Peripheral/Src/hcsr04.c +++ b/Peripheral/Src/hcsr04.c @@ -66,6 +66,6 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) // 测距完毕回调,执行完自定义任务后将sonor_state置0 __attribute__((weak)) void Sonar_CP_Callback() { - my_printf(HUART2, "distance = %d (mm)\n", sonor_distance); + my_printf(HUART1, "distance = %d (mm)\n", sonor_distance); sonor_state = 0; } diff --git a/Service/Inc/timer.h b/Service/Inc/timer.h index 79c38af..9e31a2f 100644 --- a/Service/Inc/timer.h +++ b/Service/Inc/timer.h @@ -5,7 +5,7 @@ #define EVENT_LED 0 #define EVENT_BUZZER 1 -#define EVENT_HCSR04 2 +#define EVENT_BLUETOOTH 2 #define EVENT_SERVO 3 #define EVENT_MAX 4 diff --git a/Service/Src/timer.c b/Service/Src/timer.c index 1bd0e91..ecec7f7 100644 --- a/Service/Src/timer.c +++ b/Service/Src/timer.c @@ -38,6 +38,7 @@ void TIMER_AddLoopEvent(uint8_t type, void (*func)(void), uint16_t loop_time) void TIMER_DelLoopEvent(uint8_t type) { event[type].enabled = 0; + time_lcm /= event[type].time; } void TIMER_Count(void)