Compare commits

...

2 Commits

Author SHA1 Message Date
EN
a76a286859 更新蜂鸣器模块 2024-07-19 12:33:18 +08:00
EN
e1c3c733f0 完善蓝牙协议 2024-07-19 12:32:54 +08:00
13 changed files with 122 additions and 41 deletions

13
CAR.ioc
View File

@ -3,7 +3,8 @@ CAD.formats=
CAD.pinconfig= CAD.pinconfig=
CAD.provider= CAD.provider=
Dma.Request0=USART2_RX 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.Direction=DMA_PERIPH_TO_MEMORY
Dma.USART2_RX.0.Instance=DMA1_Channel6 Dma.USART2_RX.0.Instance=DMA1_Channel6
Dma.USART2_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE 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.PeriphInc=DMA_PINC_DISABLE
Dma.USART2_RX.0.Priority=DMA_PRIORITY_HIGH Dma.USART2_RX.0.Priority=DMA_PRIORITY_HIGH
Dma.USART2_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority 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 File.Version=6
GPIO.groupedBy=Group By Peripherals GPIO.groupedBy=Group By Peripherals
KeepUserPlacement=false KeepUserPlacement=false
@ -72,6 +82,7 @@ MxCube.Version=6.12.0
MxDb.Version=DB.6.0.120 MxDb.Version=DB.6.0.120
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false 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_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.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.EXTI15_10_IRQn=true\:2\:0\:true\:false\:true\:true\:true\:true
NVIC.ForceEnableDMAVector=false NVIC.ForceEnableDMAVector=false

View File

@ -56,6 +56,7 @@ void DebugMon_Handler(void);
void PendSV_Handler(void); void PendSV_Handler(void);
void SysTick_Handler(void); void SysTick_Handler(void);
void DMA1_Channel6_IRQHandler(void); void DMA1_Channel6_IRQHandler(void);
void DMA1_Channel7_IRQHandler(void);
void TIM2_IRQHandler(void); void TIM2_IRQHandler(void);
void TIM4_IRQHandler(void); void TIM4_IRQHandler(void);
void USART1_IRQHandler(void); void USART1_IRQHandler(void);

View File

@ -46,6 +46,9 @@ void MX_DMA_Init(void)
/* DMA1_Channel6_IRQn interrupt configuration */ /* DMA1_Channel6_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 3, 0); HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn); 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);
} }

View File

@ -58,6 +58,7 @@
extern TIM_HandleTypeDef htim2; extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim4; extern TIM_HandleTypeDef htim4;
extern DMA_HandleTypeDef hdma_usart2_rx; extern DMA_HandleTypeDef hdma_usart2_rx;
extern DMA_HandleTypeDef hdma_usart2_tx;
extern UART_HandleTypeDef huart1; extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2; extern UART_HandleTypeDef huart2;
/* USER CODE BEGIN EV */ /* USER CODE BEGIN EV */
@ -216,6 +217,20 @@ void DMA1_Channel6_IRQHandler(void)
/* USER CODE END DMA1_Channel6_IRQn 1 */ /* 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. * @brief This function handles TIM2 global interrupt.
*/ */

View File

@ -27,6 +27,7 @@
UART_HandleTypeDef huart1; UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2; UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_rx; DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;
/* USART1 init function */ /* USART1 init function */
@ -161,6 +162,22 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx); __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 */ /* USART2 interrupt Init */
HAL_NVIC_SetPriority(USART2_IRQn, 3, 0); HAL_NVIC_SetPriority(USART2_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn); HAL_NVIC_EnableIRQ(USART2_IRQn);
@ -209,6 +226,7 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
/* USART2 DMA DeInit */ /* USART2 DMA DeInit */
HAL_DMA_DeInit(uartHandle->hdmarx); HAL_DMA_DeInit(uartHandle->hdmarx);
HAL_DMA_DeInit(uartHandle->hdmatx);
/* USART2 interrupt Deinit */ /* USART2 interrupt Deinit */
HAL_NVIC_DisableIRQ(USART2_IRQn); HAL_NVIC_DisableIRQ(USART2_IRQn);

View File

@ -4,5 +4,6 @@
#include "main.h" #include "main.h"
void BLUETOOTH_Init(void); void BLUETOOTH_Init(void);
void BLUETOOTH_Send(const char *str, ...);
#endif #endif

View File

@ -15,6 +15,7 @@
extern uint8_t mode; extern uint8_t mode;
void CONTROL_CommonCmd(uint8_t type, uint8_t state); 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_RGB(uint8_t r, uint8_t g, uint8_t b);
void CONTROL_Mode(uint8_t new_mode, uint8_t state); void CONTROL_Mode(uint8_t new_mode, uint8_t state);

View File

@ -1,33 +1,50 @@
#include "bluetooth.h" #include "bluetooth.h"
#include "usart.h" #include "usart.h"
#include "control.h" #include "control.h"
#include "line_seek.h"
#include "infrared.h"
#include "hcsr04.h"
#include "timer.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "syscalls.h" #include <stdarg.h>
#include <math.h>
#define BUFFER_SIZE 100 #define BUFFER_SIZE 255
#define MESSAGE_SIZE 19 #define MESSAGE_SIZE 19
#define CMD_NUM 9 #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 uint16_t txLen;
static uint8_t cmdIndex; 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) void BLUETOOTH_Init(void)
{ {
HAL_UARTEx_ReceiveToIdle_IT(&huart2, rxBuffer, 100); 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) void BLUETOOTH_Send(const char *str, ...)
// { {
// if (huart == &huart2) va_list args;
// { va_start(args, str);
// ++txLen; vsprintf(txBuffer, str, args);
// if (txLen == 10000) va_end(args);
// txLen = 0; HAL_UART_Transmit_DMA(&huart2, txBuffer, strlen(txBuffer));
// } }
// }
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) 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; break;
// 舵机云台 // 舵机云台
case 'P': case 'P':
sscanf(rxBuffer + 5, "%*3s%hu", num);
CONTROL_Servo(180 - num[0]);
break; break;
// 七彩灯 // 七彩灯
case 'C': case 'C':
@ -73,15 +92,6 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
break; 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(); BLUETOOTH_Init();
} }
} }

View File

@ -11,10 +11,16 @@ inline void BUZZER_Start()
inline void BUZZER_Stop() inline void BUZZER_Stop()
{ {
HAL_GPIO_WritePin(FM_K2_POWERC_GPIO_Port, FM_K2_POWERC_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(FM_K2_POWERC_GPIO_Port, FM_K2_POWERC_Pin, GPIO_PIN_SET);
if (state == 1)
{
state = 0;
TIMER_DelLoopEvent(EVENT_BUZZER);
}
} }
void BUZZER_StartTimed(uint8_t time) void BUZZER_StartTimed(uint8_t time)
{ {
state = 1;
BUZZER_Start(); BUZZER_Start();
TIMER_AddLoopEvent(EVENT_BUZZER, BUZZER_Stop, time * 100); TIMER_AddLoopEvent(EVENT_BUZZER, BUZZER_Stop, time * 100);
} }

View File

@ -2,16 +2,18 @@
#include "hcsr04.h" #include "hcsr04.h"
#include "led.h" #include "led.h"
#include "motor.h" #include "motor.h"
#include "buzzer.h"
#include "servo.h"
#define CMD_MOVE 0 #define CMD_MOVE 0
#define CMD_ROTATE 1 #define CMD_ROTATE 1
#define CMD_BUZZER 2 #define CMD_BUZZER 2
#define CMD_SPEED 3 #define CMD_SPEED 3
// #define CMD_SHAKE 4 #define CMD_SERVO 4
// #define CMD_SING 5 // #define CMD_SING 5
#define CMD_LED 6 #define CMD_LED 6
// #define CMD_FIRE 7 // #define CMD_FIRE 7
// #define CMD_SERVO 8 #define CMD_SERVO_RESET 8
// 小车默认速度 // 小车默认速度
static int8_t speed = 20; static int8_t speed = 20;
@ -21,11 +23,10 @@ void carMove(uint8_t state);
void carSpin(uint8_t state); void carSpin(uint8_t state);
void callBuzzer(uint8_t state); void callBuzzer(uint8_t state);
void setSpeed(uint8_t state); void setSpeed(uint8_t state);
// void shake(uint8_t state); void setServo(uint8_t state);
// void sing(uint8_t state); // void sing(uint8_t state);
void setLed(uint8_t state); void setLed(uint8_t state);
// void fire(uint8_t state); // void fire(uint8_t state);
// void servo(uint8_t state);
void CONTROL_CommonCmd(uint8_t type, uint8_t state) void CONTROL_CommonCmd(uint8_t type, uint8_t state)
{ {
@ -43,8 +44,9 @@ void CONTROL_CommonCmd(uint8_t type, uint8_t state)
case CMD_SPEED: case CMD_SPEED:
setSpeed(state); setSpeed(state);
break; break;
// case CMD_SHAKE: case CMD_SERVO:
// break; setServo(state);
break;
// case CMD_SING: // case CMD_SING:
// break; // break;
case CMD_LED: case CMD_LED:
@ -52,12 +54,18 @@ void CONTROL_CommonCmd(uint8_t type, uint8_t state)
break; break;
// case CMD_FIRE: // case CMD_FIRE:
// break; // break;
// case CMD_SERVO: case CMD_SERVO_RESET:
// break; 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_Start(LED_ALL);
LED_SetDuty(r, g, b); 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) if (state == 1)
MOTOR_SetDuty(speed, -speed); MOTOR_SetDuty(speed, -speed);
@ -129,11 +137,9 @@ void carSpin(uint8_t state)
MOTOR_SetDuty(-speed, speed); 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); BUZZER_StartTimed(5);
HAL_Delay(200);
HAL_GPIO_WritePin(FM_K2_POWERC_GPIO_Port, FM_K2_POWERC_Pin, GPIO_PIN_SET);
} }
void setSpeed(uint8_t state) void setSpeed(uint8_t state)
@ -148,6 +154,14 @@ void setSpeed(uint8_t state)
speed = 20; 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) void setLed(uint8_t state)
{ {
LED_Start(LED_ALL); LED_Start(LED_ALL);

View File

@ -66,6 +66,6 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
// 测距完毕回调执行完自定义任务后将sonor_state置0 // 测距完毕回调执行完自定义任务后将sonor_state置0
__attribute__((weak)) void Sonar_CP_Callback() __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; sonor_state = 0;
} }

View File

@ -5,7 +5,7 @@
#define EVENT_LED 0 #define EVENT_LED 0
#define EVENT_BUZZER 1 #define EVENT_BUZZER 1
#define EVENT_HCSR04 2 #define EVENT_BLUETOOTH 2
#define EVENT_SERVO 3 #define EVENT_SERVO 3
#define EVENT_MAX 4 #define EVENT_MAX 4

View File

@ -38,6 +38,7 @@ void TIMER_AddLoopEvent(uint8_t type, void (*func)(void), uint16_t loop_time)
void TIMER_DelLoopEvent(uint8_t type) void TIMER_DelLoopEvent(uint8_t type)
{ {
event[type].enabled = 0; event[type].enabled = 0;
time_lcm /= event[type].time;
} }
void TIMER_Count(void) void TIMER_Count(void)