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.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

View File

@ -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);

View File

@ -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);
}

View File

@ -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.
*/

View File

@ -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);

View File

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

View File

@ -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);

View File

@ -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 <stdio.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 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();
}
}

View File

@ -11,10 +11,16 @@ inline void BUZZER_Start()
inline void BUZZER_Stop()
{
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)
{
state = 1;
BUZZER_Start();
TIMER_AddLoopEvent(EVENT_BUZZER, BUZZER_Stop, time * 100);
}

View File

@ -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,8 +44,9 @@ 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:
@ -52,12 +54,18 @@ void CONTROL_CommonCmd(uint8_t type, uint8_t state)
break;
// case CMD_FIRE:
// break;
// case CMD_SERVO:
// 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);

View File

@ -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;
}

View File

@ -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

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)
{
event[type].enabled = 0;
time_lcm /= event[type].time;
}
void TIMER_Count(void)