遥控器控制电机转动,队列用法还没实现
This commit is contained in:
8
Core/Inc/bsp_rc.h
Normal file
8
Core/Inc/bsp_rc.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef BSP_RC_H
|
||||
#define BSP_RC_H
|
||||
#include "main.h"
|
||||
|
||||
extern void RC_init(uint8_t *rx1_buf, uint8_t *rx2_buf, uint16_t dma_buf_num);
|
||||
extern void RC_unable(void);
|
||||
extern void RC_restart(uint16_t dma_buf_num);
|
||||
#endif
|
||||
52
Core/Inc/dma.h
Normal file
52
Core/Inc/dma.h
Normal file
@@ -0,0 +1,52 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file dma.h
|
||||
* @brief This file contains all the function prototypes for
|
||||
* the dma.c file
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2026 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __DMA_H__
|
||||
#define __DMA_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
|
||||
/* DMA memory to memory transfer handles -------------------------------------*/
|
||||
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* USER CODE BEGIN Private defines */
|
||||
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
void MX_DMA_Init(void);
|
||||
|
||||
/* USER CODE BEGIN Prototypes */
|
||||
|
||||
/* USER CODE END Prototypes */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __DMA_H__ */
|
||||
|
||||
105
Core/Inc/remote_control.h
Normal file
105
Core/Inc/remote_control.h
Normal file
@@ -0,0 +1,105 @@
|
||||
/**
|
||||
****************************(C) COPYRIGHT 2016 DJI****************************
|
||||
* @file remote_control.c/h
|
||||
* @brief ң<><D2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD><D2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SBUS<55><53>Э<EFBFBD>鴫<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>DMA<4D><41><EFBFBD>䷽ʽ<E4B7BD><CABD>ԼCPU
|
||||
* <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<CDAC>ṩһЩ<D2BB><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20>ķ<EFBFBD>ʽ<EFBFBD><CABD>֤<EFBFBD>Ȳ<EFBFBD>ε<EFBFBD><CEB5>ȶ<EFBFBD><C8B6>ԡ<EFBFBD>
|
||||
* @note
|
||||
* @history
|
||||
* Version Date Author Modification
|
||||
* V1.0.0 Dec-26-2018 RM 1. <20><><EFBFBD>
|
||||
*
|
||||
@verbatim
|
||||
==============================================================================
|
||||
|
||||
==============================================================================
|
||||
@endverbatim
|
||||
****************************(C) COPYRIGHT 2016 DJI****************************
|
||||
*/
|
||||
#ifndef REMOTE_CONTROL_H
|
||||
#define REMOTE_CONTROL_H
|
||||
#include "main.h"
|
||||
#include "bsp_rc.h"
|
||||
|
||||
#define SBUS_RX_BUF_NUM 36u
|
||||
|
||||
#define RC_FRAME_LENGTH 18u
|
||||
|
||||
#define RC_CH_VALUE_MIN ((uint16_t)364)
|
||||
#define RC_CH_VALUE_OFFSET ((uint16_t)1024)
|
||||
#define RC_CH_VALUE_MAX ((uint16_t)1684)
|
||||
|
||||
/* ----------------------- RC Switch Definition----------------------------- */
|
||||
#define RC_SW_UP ((uint16_t)1)
|
||||
#define RC_SW_MID ((uint16_t)3)
|
||||
#define RC_SW_DOWN ((uint16_t)2)
|
||||
#define switch_is_down(s) (s == RC_SW_DOWN)
|
||||
#define switch_is_mid(s) (s == RC_SW_MID)
|
||||
#define switch_is_up(s) (s == RC_SW_UP)
|
||||
/* ----------------------- PC Key Definition-------------------------------- */
|
||||
#define KEY_PRESSED_OFFSET_W ((uint16_t)1 << 0)
|
||||
#define KEY_PRESSED_OFFSET_S ((uint16_t)1 << 1)
|
||||
#define KEY_PRESSED_OFFSET_A ((uint16_t)1 << 2)
|
||||
#define KEY_PRESSED_OFFSET_D ((uint16_t)1 << 3)
|
||||
#define KEY_PRESSED_OFFSET_SHIFT ((uint16_t)1 << 4)
|
||||
#define KEY_PRESSED_OFFSET_CTRL ((uint16_t)1 << 5)
|
||||
#define KEY_PRESSED_OFFSET_Q ((uint16_t)1 << 6)
|
||||
#define KEY_PRESSED_OFFSET_E ((uint16_t)1 << 7)
|
||||
#define KEY_PRESSED_OFFSET_R ((uint16_t)1 << 8)
|
||||
#define KEY_PRESSED_OFFSET_F ((uint16_t)1 << 9)
|
||||
#define KEY_PRESSED_OFFSET_G ((uint16_t)1 << 10)
|
||||
#define KEY_PRESSED_OFFSET_Z ((uint16_t)1 << 11)
|
||||
#define KEY_PRESSED_OFFSET_X ((uint16_t)1 << 12)
|
||||
#define KEY_PRESSED_OFFSET_C ((uint16_t)1 << 13)
|
||||
#define KEY_PRESSED_OFFSET_V ((uint16_t)1 << 14)
|
||||
#define KEY_PRESSED_OFFSET_B ((uint16_t)1 << 15)
|
||||
/* ----------------------- Data Struct ------------------------------------- */
|
||||
typedef __packed struct
|
||||
{
|
||||
__packed struct
|
||||
{
|
||||
int16_t ch[5];
|
||||
char s[2];
|
||||
} rc;
|
||||
__packed struct
|
||||
{
|
||||
int16_t x;
|
||||
int16_t y;
|
||||
int16_t z;
|
||||
uint8_t press_l;
|
||||
uint8_t press_r;
|
||||
} mouse;
|
||||
__packed struct
|
||||
{
|
||||
uint16_t v;
|
||||
} key;
|
||||
|
||||
} RC_ctrl_t;
|
||||
|
||||
/* ----------------------- Internal Data ----------------------------------- */
|
||||
|
||||
/**
|
||||
* @brief remote control init
|
||||
* @param[in] none
|
||||
* @retval none
|
||||
*/
|
||||
/**
|
||||
* @brief ң<><D2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
* @param[in] none
|
||||
* @retval none
|
||||
*/
|
||||
extern void remote_control_init(void);
|
||||
/**
|
||||
* @brief get remote control data point
|
||||
* @param[in] none
|
||||
* @retval remote control data point
|
||||
*/
|
||||
/**
|
||||
* @brief <20><>ȡң<C8A1><D2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
* @param[in] none
|
||||
* @retval ң<><D2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
*/
|
||||
extern const RC_ctrl_t *get_remote_control_point(void);
|
||||
extern void RC_USART3_IRQHandler(void);
|
||||
|
||||
#endif
|
||||
@@ -64,7 +64,7 @@
|
||||
/* #define HAL_MMC_MODULE_ENABLED */
|
||||
/* #define HAL_SPI_MODULE_ENABLED */
|
||||
#define HAL_TIM_MODULE_ENABLED
|
||||
/* #define HAL_UART_MODULE_ENABLED */
|
||||
#define HAL_UART_MODULE_ENABLED
|
||||
/* #define HAL_USART_MODULE_ENABLED */
|
||||
/* #define HAL_IRDA_MODULE_ENABLED */
|
||||
/* #define HAL_SMARTCARD_MODULE_ENABLED */
|
||||
|
||||
@@ -52,7 +52,9 @@ void MemManage_Handler(void);
|
||||
void BusFault_Handler(void);
|
||||
void UsageFault_Handler(void);
|
||||
void DebugMon_Handler(void);
|
||||
void DMA1_Stream1_IRQHandler(void);
|
||||
void CAN1_RX0_IRQHandler(void);
|
||||
void USART3_IRQHandler(void);
|
||||
void TIM6_DAC_IRQHandler(void);
|
||||
/* USER CODE BEGIN EFP */
|
||||
|
||||
|
||||
52
Core/Inc/usart.h
Normal file
52
Core/Inc/usart.h
Normal file
@@ -0,0 +1,52 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file usart.h
|
||||
* @brief This file contains all the function prototypes for
|
||||
* the usart.c file
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2026 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USART_H__
|
||||
#define __USART_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
extern UART_HandleTypeDef huart3;
|
||||
|
||||
/* USER CODE BEGIN Private defines */
|
||||
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
void MX_USART3_UART_Init(void);
|
||||
|
||||
/* USER CODE BEGIN Prototypes */
|
||||
|
||||
/* USER CODE END Prototypes */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __USART_H__ */
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
|
||||
extern CAN_HandleTypeDef hcan1;
|
||||
//motor data read
|
||||
//motor data read读取电机数据,更新电机状态结构体
|
||||
#define get_motor_measure(ptr, data) \
|
||||
{ \
|
||||
(ptr)->last_ecd = (ptr)->ecd; \
|
||||
|
||||
49
Core/Src/bsp_rc.c
Normal file
49
Core/Src/bsp_rc.c
Normal file
@@ -0,0 +1,49 @@
|
||||
#include "bsp_rc.h"
|
||||
#include "main.h"
|
||||
|
||||
extern UART_HandleTypeDef huart3;
|
||||
extern DMA_HandleTypeDef hdma_usart3_rx;
|
||||
|
||||
void RC_init(uint8_t *rx1_buf, uint8_t *rx2_buf, uint16_t dma_buf_num)
|
||||
{
|
||||
//enable the DMA transfer for the receiver request
|
||||
//ʹ<><CAB9>DMA<4D><41><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>
|
||||
SET_BIT(huart3.Instance->CR3, USART_CR3_DMAR);
|
||||
|
||||
//enalbe idle interrupt
|
||||
//ʹ<>ܿ<EFBFBD><DCBF><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
|
||||
|
||||
//disable DMA
|
||||
//ʧЧDMA
|
||||
__HAL_DMA_DISABLE(&hdma_usart3_rx);
|
||||
while(hdma_usart3_rx.Instance->CR & DMA_SxCR_EN)
|
||||
{
|
||||
__HAL_DMA_DISABLE(&hdma_usart3_rx);
|
||||
}
|
||||
|
||||
hdma_usart3_rx.Instance->PAR = (uint32_t) & (USART3->DR);
|
||||
//memory buffer 1
|
||||
//<2F>ڴ滺<DAB4><E6BBBA><EFBFBD><EFBFBD>1
|
||||
hdma_usart3_rx.Instance->M0AR = (uint32_t)(rx1_buf);
|
||||
//memory buffer 2
|
||||
//<2F>ڴ滺<DAB4><E6BBBA><EFBFBD><EFBFBD>2
|
||||
hdma_usart3_rx.Instance->M1AR = (uint32_t)(rx2_buf);
|
||||
//data length
|
||||
//<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
||||
hdma_usart3_rx.Instance->NDTR = dma_buf_num;
|
||||
//enable double memory buffer
|
||||
//ʹ<><CAB9>˫<EFBFBD><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
SET_BIT(hdma_usart3_rx.Instance->CR, DMA_SxCR_DBM);
|
||||
|
||||
//enable DMA
|
||||
//ʹ<><CAB9>DMA
|
||||
__HAL_DMA_ENABLE(&hdma_usart3_rx);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -17,10 +17,10 @@ static int16_t target_speed_m4;
|
||||
*/
|
||||
void chassis_control_init(void)
|
||||
{
|
||||
pid_init(&pid_motor1, 15.0f, 0.1f, 2.0f, 16384.0f, 1000.0f);//底盘电机1
|
||||
pid_init(&pid_motor2, 15.0f, 0.1f, 2.0f, 16384.0f, 1000.0f);//底盘电机2
|
||||
pid_init(&pid_motor3, 15.0f, 0.1f, 2.0f, 16384.0f, 1000.0f);//底盘电机3
|
||||
pid_init(&pid_motor4, 15.0f, 0.1f, 2.0f, 16384.0f, 1000.0f);//底盘电机4
|
||||
pid_init(&pid_motor1, 15.0f, 0.1f, 2.0f, 4000.0f, 1000.0f);//底盘电机1
|
||||
pid_init(&pid_motor2, 15.0f, 0.1f, 2.0f, 4000.0f, 1000.0f);//底盘电机2
|
||||
pid_init(&pid_motor3, 15.0f, 0.1f, 2.0f, 4000.0f, 1000.0f);//底盘电机3
|
||||
pid_init(&pid_motor4, 15.0f, 0.1f, 2.0f, 4000.0f, 1000.0f);//底盘电机4
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
55
Core/Src/dma.c
Normal file
55
Core/Src/dma.c
Normal file
@@ -0,0 +1,55 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file dma.c
|
||||
* @brief This file provides code for the configuration
|
||||
* of all the requested memory to memory DMA transfers.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2026 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "dma.h"
|
||||
|
||||
/* USER CODE BEGIN 0 */
|
||||
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Configure DMA */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
/* USER CODE END 1 */
|
||||
|
||||
/**
|
||||
* Enable DMA controller clock
|
||||
*/
|
||||
void MX_DMA_Init(void)
|
||||
{
|
||||
|
||||
/* DMA controller clock enable */
|
||||
__HAL_RCC_DMA1_CLK_ENABLE();
|
||||
|
||||
/* DMA interrupt init */
|
||||
/* DMA1_Stream1_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
|
||||
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
/* USER CODE END 2 */
|
||||
|
||||
@@ -28,9 +28,12 @@
|
||||
#include "bsp_can.h"
|
||||
#include "CAN_receive.h"
|
||||
#include "chassis_control.h"
|
||||
#include "bsp_rc.h"
|
||||
#include "remote_control.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
typedef StaticQueue_t osStaticMessageQDef_t;
|
||||
/* USER CODE BEGIN PTD */
|
||||
|
||||
/* USER CODE END PTD */
|
||||
@@ -63,6 +66,24 @@ const osThreadAttr_t Chassis_Control_attributes = {
|
||||
.stack_size = 128 * 4,
|
||||
.priority = (osPriority_t) osPriorityNormal,
|
||||
};
|
||||
/* Definitions for Command_Task */
|
||||
osThreadId_t Command_TaskHandle;
|
||||
const osThreadAttr_t Command_Task_attributes = {
|
||||
.name = "Command_Task",
|
||||
.stack_size = 128 * 4,
|
||||
.priority = (osPriority_t) osPriorityNormal,
|
||||
};
|
||||
/* Definitions for chassis_speed_queue */
|
||||
osMessageQueueId_t chassis_speed_queueHandle;
|
||||
uint8_t chassis_speed_queueBuffer[ 5 * sizeof( uint16_t ) ];
|
||||
osStaticMessageQDef_t chassis_speed_queueControlBlock;
|
||||
const osMessageQueueAttr_t chassis_speed_queue_attributes = {
|
||||
.name = "chassis_speed_queue",
|
||||
.cb_mem = &chassis_speed_queueControlBlock,
|
||||
.cb_size = sizeof(chassis_speed_queueControlBlock),
|
||||
.mq_mem = &chassis_speed_queueBuffer,
|
||||
.mq_size = sizeof(chassis_speed_queueBuffer)
|
||||
};
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
/* USER CODE BEGIN FunctionPrototypes */
|
||||
@@ -71,6 +92,7 @@ const osThreadAttr_t Chassis_Control_attributes = {
|
||||
|
||||
void StartCAN_Receive_Task(void *argument);
|
||||
void StartChassis_Control_Task(void *argument);
|
||||
void StartCommand_Task(void *argument);
|
||||
|
||||
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
|
||||
|
||||
@@ -96,6 +118,10 @@ void MX_FREERTOS_Init(void) {
|
||||
/* start timers, add new ones, ... */
|
||||
/* USER CODE END RTOS_TIMERS */
|
||||
|
||||
/* Create the queue(s) */
|
||||
/* creation of chassis_speed_queue */
|
||||
chassis_speed_queueHandle = osMessageQueueNew (5, sizeof(uint16_t), &chassis_speed_queue_attributes);
|
||||
|
||||
/* USER CODE BEGIN RTOS_QUEUES */
|
||||
/* add queues, ... */
|
||||
/* USER CODE END RTOS_QUEUES */
|
||||
@@ -107,6 +133,9 @@ void MX_FREERTOS_Init(void) {
|
||||
/* creation of Chassis_Control */
|
||||
Chassis_ControlHandle = osThreadNew(StartChassis_Control_Task, NULL, &Chassis_Control_attributes);
|
||||
|
||||
/* creation of Command_Task */
|
||||
Command_TaskHandle = osThreadNew(StartCommand_Task, NULL, &Command_Task_attributes);
|
||||
|
||||
/* USER CODE BEGIN RTOS_THREADS */
|
||||
/* add threads, ... */
|
||||
/* USER CODE END RTOS_THREADS */
|
||||
@@ -147,18 +176,49 @@ void StartChassis_Control_Task(void *argument)
|
||||
{
|
||||
/* USER CODE BEGIN StartChassis_Control_Task */
|
||||
chassis_control_init();
|
||||
chassis_set_speed(100, 0, 0, 0);
|
||||
int16_t speed = 0;
|
||||
/* Infinite loop */
|
||||
for(;;)
|
||||
{
|
||||
chassis_control_task();//电机控制
|
||||
if (osMessageQueueGet(chassis_speed_queueHandle, &speed, NULL, 0) == osOK)
|
||||
{
|
||||
chassis_set_speed(speed, 0, 0, 0);
|
||||
}
|
||||
chassis_control_task();
|
||||
osDelay(1);
|
||||
}
|
||||
/* USER CODE END StartChassis_Control_Task */
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN Header_StartCommand_Task */
|
||||
/**
|
||||
* @brief Function implementing the Command_Task thread.
|
||||
* @param argument: Not used
|
||||
* @retval None
|
||||
*/
|
||||
/* USER CODE END Header_StartCommand_Task */
|
||||
void StartCommand_Task(void *argument)
|
||||
{
|
||||
/* USER CODE BEGIN StartCommand_Task */
|
||||
remote_control_init();
|
||||
const RC_ctrl_t *rc;
|
||||
int16_t speed;
|
||||
/* Infinite loop */
|
||||
for(;;)
|
||||
{
|
||||
rc = get_remote_control_point();//rc=获取遥控器数据
|
||||
speed = (int16_t)((float)rc->rc.ch[3] * 5000.0f / 660.0f);//根据通道三的值,映射到-5000到5000之间
|
||||
if (speed > 5000)
|
||||
speed = 5000;
|
||||
if (speed < -5000)
|
||||
speed = -5000;
|
||||
osMessageQueuePut(chassis_speed_queueHandle, &speed, 0, 0);
|
||||
osDelay(10);
|
||||
}
|
||||
/* USER CODE END StartCommand_Task */
|
||||
}
|
||||
|
||||
/* Private application code --------------------------------------------------*/
|
||||
/* USER CODE BEGIN Application */
|
||||
|
||||
/* USER CODE END Application */
|
||||
|
||||
/* USER CODE END Application */
|
||||
@@ -45,6 +45,7 @@ void MX_GPIO_Init(void)
|
||||
/* GPIO Ports Clock Enable */
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOH_CLK_ENABLE();
|
||||
|
||||
}
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
#include "main.h"
|
||||
#include "cmsis_os.h"
|
||||
#include "can.h"
|
||||
#include "dma.h"
|
||||
#include "usart.h"
|
||||
#include "gpio.h"
|
||||
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
@@ -91,7 +93,9 @@ int main(void)
|
||||
|
||||
/* Initialize all configured peripherals */
|
||||
MX_GPIO_Init();
|
||||
MX_DMA_Init();
|
||||
MX_CAN1_Init();
|
||||
MX_USART3_UART_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
can_filter_init();
|
||||
/* USER CODE END 2 */
|
||||
|
||||
194
Core/Src/remote_control.c
Normal file
194
Core/Src/remote_control.c
Normal file
@@ -0,0 +1,194 @@
|
||||
/**
|
||||
****************************(C) COPYRIGHT 2019 DJI****************************
|
||||
* @file remote_control.c/h
|
||||
* @brief ?????????????????????????SBUS??<3F><>?<3F><>??????DMA????????CPU
|
||||
* ????????????????<3F><>????????????????????<3F><>????????DMA??????
|
||||
* ??????????<3F><>???????
|
||||
* @note ????????????????<3F><>???????????freeRTOS????
|
||||
* @history
|
||||
* Version Date Author Modification
|
||||
* V1.0.0 Dec-01-2019 RM 1. ???
|
||||
*
|
||||
@verbatim
|
||||
==============================================================================
|
||||
|
||||
==============================================================================
|
||||
@endverbatim
|
||||
****************************(C) COPYRIGHT 2019 DJI****************************
|
||||
*/
|
||||
|
||||
#include "remote_control.h"
|
||||
|
||||
#include "main.h"
|
||||
|
||||
|
||||
extern UART_HandleTypeDef huart3;
|
||||
extern DMA_HandleTypeDef hdma_usart3_rx;
|
||||
|
||||
/**
|
||||
* @brief remote control protocol resolution
|
||||
* @param[in] sbus_buf: raw data point
|
||||
* @param[out] rc_ctrl: remote control data struct point
|
||||
* @retval none
|
||||
*/
|
||||
/**
|
||||
* @brief ?????<3F><>?????
|
||||
* @param[in] sbus_buf: ??????????
|
||||
* @param[out] rc_ctrl: ??????????
|
||||
* @retval none
|
||||
*/
|
||||
static void sbus_to_rc(volatile const uint8_t *sbus_buf, RC_ctrl_t *rc_ctrl);
|
||||
|
||||
//remote control data
|
||||
//????????????
|
||||
RC_ctrl_t rc_ctrl;
|
||||
|
||||
//receive data, 18 bytes one frame, but set 36 bytes
|
||||
//????????????18??????????36????????????DMA???????
|
||||
static uint8_t sbus_rx_buf[2][SBUS_RX_BUF_NUM];
|
||||
|
||||
/**
|
||||
* @brief remote control init
|
||||
* @param[in] none
|
||||
* @retval none
|
||||
*/
|
||||
/**
|
||||
* @brief ??????????
|
||||
* @param[in] none
|
||||
* @retval none
|
||||
*/
|
||||
void remote_control_init(void)
|
||||
{
|
||||
RC_init(sbus_rx_buf[0], sbus_rx_buf[1], SBUS_RX_BUF_NUM);
|
||||
}
|
||||
/**
|
||||
* @brief get remote control data point
|
||||
* @param[in] none
|
||||
* @retval remote control data point
|
||||
*/
|
||||
/**
|
||||
* @brief ???????????????
|
||||
* @param[in] none
|
||||
* @retval ????????????
|
||||
*/
|
||||
const RC_ctrl_t *get_remote_control_point(void)
|
||||
{
|
||||
return &rc_ctrl;
|
||||
}
|
||||
|
||||
|
||||
//?????<3F><>?
|
||||
void RC_USART3_IRQHandler(void)
|
||||
{
|
||||
if(huart3.Instance->SR & UART_FLAG_RXNE)//?????????
|
||||
{
|
||||
__HAL_UART_CLEAR_PEFLAG(&huart3);
|
||||
}
|
||||
else if(USART3->SR & UART_FLAG_IDLE)
|
||||
{
|
||||
static uint16_t this_time_rx_len = 0;
|
||||
|
||||
__HAL_UART_CLEAR_PEFLAG(&huart3);
|
||||
|
||||
if ((hdma_usart3_rx.Instance->CR & DMA_SxCR_CT) == RESET)
|
||||
{
|
||||
/* Current memory buffer used is Memory 0 */
|
||||
|
||||
//disable DMA
|
||||
//?<3F><>DMA
|
||||
__HAL_DMA_DISABLE(&hdma_usart3_rx);
|
||||
|
||||
//get receive data length, length = set_data_length - remain_length
|
||||
//??????????????,???? = ?څ???? - ?????
|
||||
this_time_rx_len = SBUS_RX_BUF_NUM - hdma_usart3_rx.Instance->NDTR;
|
||||
|
||||
//reset set_data_lenght
|
||||
//?????څ???????
|
||||
hdma_usart3_rx.Instance->NDTR = SBUS_RX_BUF_NUM;
|
||||
|
||||
//set memory buffer 1
|
||||
//?څ??????1
|
||||
hdma_usart3_rx.Instance->CR |= DMA_SxCR_CT;
|
||||
|
||||
//enable DMA
|
||||
//???DMA
|
||||
__HAL_DMA_ENABLE(&hdma_usart3_rx);
|
||||
|
||||
if(this_time_rx_len == RC_FRAME_LENGTH)
|
||||
{
|
||||
sbus_to_rc(sbus_rx_buf[0], &rc_ctrl);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Current memory buffer used is Memory 1 */
|
||||
//disable DMA
|
||||
//?<3F><>DMA
|
||||
__HAL_DMA_DISABLE(&hdma_usart3_rx);
|
||||
|
||||
//get receive data length, length = set_data_length - remain_length
|
||||
//??????????????,???? = ?څ???? - ?????
|
||||
this_time_rx_len = SBUS_RX_BUF_NUM - hdma_usart3_rx.Instance->NDTR;
|
||||
|
||||
//reset set_data_lenght
|
||||
//?????څ???????
|
||||
hdma_usart3_rx.Instance->NDTR = SBUS_RX_BUF_NUM;
|
||||
|
||||
//set memory buffer 0
|
||||
//?څ??????0
|
||||
DMA1_Stream1->CR &= ~(DMA_SxCR_CT);
|
||||
|
||||
//enable DMA
|
||||
//???DMA
|
||||
__HAL_DMA_ENABLE(&hdma_usart3_rx);
|
||||
|
||||
if(this_time_rx_len == RC_FRAME_LENGTH)
|
||||
{
|
||||
//?????????????
|
||||
sbus_to_rc(sbus_rx_buf[1], &rc_ctrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief remote control protocol resolution
|
||||
* @param[in] sbus_buf: raw data point
|
||||
* @param[out] rc_ctrl: remote control data struct point
|
||||
* @retval none
|
||||
*/
|
||||
/**
|
||||
* @brief ?????<3F><>?????
|
||||
* @param[in] sbus_buf: ??????????
|
||||
* @param[out] rc_ctrl: ??????????
|
||||
* @retval none
|
||||
*/
|
||||
static void sbus_to_rc(volatile const uint8_t *sbus_buf, RC_ctrl_t *rc_ctrl)
|
||||
{
|
||||
if (sbus_buf == NULL || rc_ctrl == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
rc_ctrl->rc.ch[0] = (sbus_buf[0] | (sbus_buf[1] << 8)) & 0x07ff; //!< Channel 0 ???????
|
||||
rc_ctrl->rc.ch[1] = ((sbus_buf[1] >> 3) | (sbus_buf[2] << 5)) & 0x07ff; //!< Channel 1 ???????
|
||||
rc_ctrl->rc.ch[2] = ((sbus_buf[2] >> 6) | (sbus_buf[3] << 2) | //!< Channel 2 ???????
|
||||
(sbus_buf[4] << 10)) &0x07ff;
|
||||
rc_ctrl->rc.ch[3] = ((sbus_buf[4] >> 1) | (sbus_buf[5] << 7)) & 0x07ff; //!< Channel 3 ???????
|
||||
rc_ctrl->rc.s[0] = ((sbus_buf[5] >> 4) & 0x0003); //!< Switch left
|
||||
rc_ctrl->rc.s[1] = ((sbus_buf[5] >> 4) & 0x000C) >> 2; //!< Switch right
|
||||
rc_ctrl->mouse.x = sbus_buf[6] | (sbus_buf[7] << 8); //!< Mouse X axis
|
||||
rc_ctrl->mouse.y = sbus_buf[8] | (sbus_buf[9] << 8); //!< Mouse Y axis
|
||||
rc_ctrl->mouse.z = sbus_buf[10] | (sbus_buf[11] << 8); //!< Mouse Z axis
|
||||
rc_ctrl->mouse.press_l = sbus_buf[12]; //!< Mouse Left Is Press ?
|
||||
rc_ctrl->mouse.press_r = sbus_buf[13]; //!< Mouse Right Is Press ?
|
||||
rc_ctrl->key.v = sbus_buf[14] | (sbus_buf[15] << 8); //!< KeyBoard value
|
||||
rc_ctrl->rc.ch[4] = sbus_buf[16] | (sbus_buf[17] << 8); //NULL
|
||||
|
||||
rc_ctrl->rc.ch[0] -= RC_CH_VALUE_OFFSET;
|
||||
rc_ctrl->rc.ch[1] -= RC_CH_VALUE_OFFSET;
|
||||
rc_ctrl->rc.ch[2] -= RC_CH_VALUE_OFFSET;
|
||||
rc_ctrl->rc.ch[3] -= RC_CH_VALUE_OFFSET;
|
||||
rc_ctrl->rc.ch[4] -= RC_CH_VALUE_OFFSET;
|
||||
}
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "stm32f4xx_it.h"
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Includes */
|
||||
#include "remote_control.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
@@ -56,6 +57,8 @@
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
extern CAN_HandleTypeDef hcan1;
|
||||
extern DMA_HandleTypeDef hdma_usart3_rx;
|
||||
extern UART_HandleTypeDef huart3;
|
||||
extern TIM_HandleTypeDef htim6;
|
||||
|
||||
/* USER CODE BEGIN EV */
|
||||
@@ -160,6 +163,20 @@ void DebugMon_Handler(void)
|
||||
/* please refer to the startup file (startup_stm32f4xx.s). */
|
||||
/******************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA1 stream1 global interrupt.
|
||||
*/
|
||||
void DMA1_Stream1_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN DMA1_Stream1_IRQn 0 */
|
||||
|
||||
/* USER CODE END DMA1_Stream1_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&hdma_usart3_rx);
|
||||
/* USER CODE BEGIN DMA1_Stream1_IRQn 1 */
|
||||
|
||||
/* USER CODE END DMA1_Stream1_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles CAN1 RX0 interrupts.
|
||||
*/
|
||||
@@ -174,6 +191,21 @@ void CAN1_RX0_IRQHandler(void)
|
||||
/* USER CODE END CAN1_RX0_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles USART3 global interrupt.
|
||||
*/
|
||||
void USART3_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN USART3_IRQn 0 */
|
||||
RC_USART3_IRQHandler();
|
||||
return;
|
||||
/* USER CODE END USART3_IRQn 0 */
|
||||
HAL_UART_IRQHandler(&huart3);
|
||||
/* USER CODE BEGIN USART3_IRQn 1 */
|
||||
|
||||
/* USER CODE END USART3_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles TIM6 global interrupt, DAC1 and DAC2 underrun error interrupts.
|
||||
*/
|
||||
|
||||
142
Core/Src/usart.c
Normal file
142
Core/Src/usart.c
Normal file
@@ -0,0 +1,142 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file usart.c
|
||||
* @brief This file provides code for the configuration
|
||||
* of the USART instances.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2026 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "usart.h"
|
||||
|
||||
/* USER CODE BEGIN 0 */
|
||||
|
||||
/* USER CODE END 0 */
|
||||
|
||||
UART_HandleTypeDef huart3;
|
||||
DMA_HandleTypeDef hdma_usart3_rx;
|
||||
|
||||
/* USART3 init function */
|
||||
|
||||
void MX_USART3_UART_Init(void)
|
||||
{
|
||||
|
||||
/* USER CODE BEGIN USART3_Init 0 */
|
||||
|
||||
/* USER CODE END USART3_Init 0 */
|
||||
|
||||
/* USER CODE BEGIN USART3_Init 1 */
|
||||
|
||||
/* USER CODE END USART3_Init 1 */
|
||||
huart3.Instance = USART3;
|
||||
huart3.Init.BaudRate = 100000;
|
||||
huart3.Init.WordLength = UART_WORDLENGTH_8B;
|
||||
huart3.Init.StopBits = UART_STOPBITS_1;
|
||||
huart3.Init.Parity = UART_PARITY_EVEN;
|
||||
huart3.Init.Mode = UART_MODE_TX_RX;
|
||||
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
|
||||
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
|
||||
if (HAL_UART_Init(&huart3) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
/* USER CODE BEGIN USART3_Init 2 */
|
||||
|
||||
/* USER CODE END USART3_Init 2 */
|
||||
|
||||
}
|
||||
|
||||
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
|
||||
{
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
if(uartHandle->Instance==USART3)
|
||||
{
|
||||
/* USER CODE BEGIN USART3_MspInit 0 */
|
||||
|
||||
/* USER CODE END USART3_MspInit 0 */
|
||||
/* USART3 clock enable */
|
||||
__HAL_RCC_USART3_CLK_ENABLE();
|
||||
|
||||
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||
/**USART3 GPIO Configuration
|
||||
PC11 ------> USART3_RX
|
||||
PC10 ------> USART3_TX
|
||||
*/
|
||||
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_10;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||
GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
|
||||
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
||||
|
||||
/* USART3 DMA Init */
|
||||
/* USART3_RX Init */
|
||||
hdma_usart3_rx.Instance = DMA1_Stream1;
|
||||
hdma_usart3_rx.Init.Channel = DMA_CHANNEL_4;
|
||||
hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
||||
hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||
hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;
|
||||
hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||
hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||
hdma_usart3_rx.Init.Mode = DMA_CIRCULAR;
|
||||
hdma_usart3_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
|
||||
hdma_usart3_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
|
||||
if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart3_rx);
|
||||
|
||||
/* USART3 interrupt Init */
|
||||
HAL_NVIC_SetPriority(USART3_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(USART3_IRQn);
|
||||
/* USER CODE BEGIN USART3_MspInit 1 */
|
||||
|
||||
/* USER CODE END USART3_MspInit 1 */
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
|
||||
{
|
||||
|
||||
if(uartHandle->Instance==USART3)
|
||||
{
|
||||
/* USER CODE BEGIN USART3_MspDeInit 0 */
|
||||
|
||||
/* USER CODE END USART3_MspDeInit 0 */
|
||||
/* Peripheral clock disable */
|
||||
__HAL_RCC_USART3_CLK_DISABLE();
|
||||
|
||||
/**USART3 GPIO Configuration
|
||||
PC11 ------> USART3_RX
|
||||
PC10 ------> USART3_TX
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_11|GPIO_PIN_10);
|
||||
|
||||
/* USART3 DMA DeInit */
|
||||
HAL_DMA_DeInit(uartHandle->hdmarx);
|
||||
|
||||
/* USART3 interrupt Deinit */
|
||||
HAL_NVIC_DisableIRQ(USART3_IRQn);
|
||||
/* USER CODE BEGIN USART3_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END USART3_MspDeInit 1 */
|
||||
}
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
/* USER CODE END 1 */
|
||||
Reference in New Issue
Block a user