Skip to content
Open

V2e #15

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 56 additions & 3 deletions CMSIS/stm32f4xx_it.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,20 @@
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_it.h"
#include "main.h"

#include "gimbal_task.h"
#include "USART_comms.h"
#include <string.h>
#include <stdio.h>

volatile char buffer_rx[100];
volatile char buffer_rx[BUFFER_SIZE]; //holds 100 bytes
int count_rx = 0;

volatile char UART8_buffer_rx[100];
int UART8_count_rx = 0;

char rando[] = "hello\n\r";
char new_line[] = "\n\r";
int atoi(const char *str);
/** @addtogroup Template_Project
* @{
*/
Expand Down Expand Up @@ -171,10 +179,11 @@ void SysTick_Handler(void)
/**
* @}
*/

// Interrupt handler for USART 6. This is called on the reception of every
// byte on USART6
// Note: USART_Data only holds 1 byte of data despite being a uint16_t variable
void USART6_IRQHandler(void)
{
// make sure USART6 was intended to be called for this interrupt
Expand Down Expand Up @@ -206,4 +215,48 @@ void USART6_IRQHandler(void)
}


void clear_gimbal_buffer(void) {
Gimbal_Angles *gimbal_angles = get_gimbal_angle_struct();

int angle = atoi(gimbal_angles->buffer_rx);

if (angle<-180) angle=-180;
else if (angle>180) angle=180;

gimbal_angles->yaw_angle = angle;
gimbal_angles->new_angle_flag = 1;
gimbal_angles->count_rx = 0;

for (int i = 0; i < BUFFER_SIZE; i++) {
gimbal_angles->buffer_rx[i] = 0;
}
}

// Interrupt handler for UART 8. This is called on the reception of every
// byte on UART8
// Note: USART_Data only holds 1 byte of data despite being a uint16_t variable
void UART8_IRQHandler(void)
{
// make sure UART8 was intended to be called for this interrupt
if(USART_GetITStatus(UART8, USART_IT_RXNE) != RESET) {
uint16_t UART_Data = USART_ReceiveData(UART8);
Gimbal_Angles *gimbal_angles = get_gimbal_angle_struct();

// Once a carriage return is read or the buffer full, move
// data into struct, and clear the buffer
if (UART_Data == 13 || gimbal_angles->count_rx >= BUFFER_SIZE-1) {
//vision_send_string(gimbal_angles->buffer_rx); //echo
//vision_send_string(new_line);
clear_gimbal_buffer();
//vision_send_string(gimbal_angles->buffer_rx); //echo
//vision_send_string(new_line);
}
else {
gimbal_angles->buffer_rx[gimbal_angles->count_rx++] = UART_Data;
}
}
}



/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
8 changes: 4 additions & 4 deletions CMSIS/system_stm32f4xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@
through STLINK MCO pin of STM32F103 microcontroller. The frequency cannot be changed
and is fixed at 8 MHz.
Hardware configuration needed for Nucleo Board:
� SB54, SB55 OFF
� R35 removed
� SB16, SB50 ON */
1�7 SB54, SB55 OFF
1�7 R35 removed
1�7 SB16, SB50 ON */
/* #define USE_HSE_BYPASS */

#if defined(USE_HSE_BYPASS)
Expand Down Expand Up @@ -180,7 +180,7 @@ void SystemInit(void)
* frequency in the chip. It is calculated based on the predefined
* constant and the selected clock source:
*
* - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
* - If source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
*
* - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
*
Expand Down
5 changes: 4 additions & 1 deletion Project/embed-infantry.uvprojx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pCCUsed>5060422::V5.06 update 4 (build 422)::ARMCC</pCCUsed>
<uAC6>0</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STM32F427IIHx</Device>
Expand Down Expand Up @@ -183,6 +184,7 @@
<hadXRAM>0</hadXRAM>
<uocXRam>0</uocXRam>
<RvdsVP>2</RvdsVP>
<RvdsMve>0</RvdsMve>
<hadIRAM2>1</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
Expand Down Expand Up @@ -323,6 +325,7 @@
<uThumb>0</uThumb>
<uSurpInc>0</uSurpInc>
<uC99>1</uC99>
<uGnu>0</uGnu>
<useXO>0</useXO>
<v6Lang>3</v6Lang>
<v6LangP>3</v6LangP>
Expand All @@ -335,7 +338,7 @@
<MiscControls></MiscControls>
<Define>STM32F427_437xx,USE_STDPERIPH_DRIVER,__FPU_USED,__FPU_PRESENT,ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING</Define>
<Undefine></Undefine>
<IncludePath>..\CMSIS;..\FWLIB\inc;..\User;..\User\AHRS;..\User\DSP\Include;..\User\FreeRTOS\include;..\User\FreeRTOS\portable;..\User\FreeRTOS\portable\RVDS\ARM_CM4F;..\user\user_lib;..\User\hardware\ADC;..\User\hardware\BUZZER;..\User\hardware\delay;..\User\hardware\EXIT_Init;..\User\hardware\CAN;..\User\hardware\LED;..\User\hardware\FLASH;..\User\hardware\FRIC;..\User\hardware\LASER;..\User\hardware\POWER_CTRL;..\User\hardware\RC;..\User\hardware\RNG;..\User\hardware\SPI;..\User\hardware\SYS;..\user\hardware\timer;..\User\APP\CAN_Receive;..\User\APP\FreeRTOS_Middleware;..\User\APP\pid;..\User\APP\Remote_Control;..\User\TASK\start_task;..\User\APP\USART_comms;..\User\hardware\usart;..\User\TASK\revolver_task;..\User\TASK\INS_task;..\User\TASK\chassis_task;..\User\TASK\gimbal_task;..\User\TASK\shoot_task</IncludePath>
<IncludePath>..\CMSIS;..\FWLIB\inc;..\User;..\User\AHRS;..\User\DSP\Include;..\User\FreeRTOS\include;..\User\FreeRTOS\portable;..\User\FreeRTOS\portable\RVDS\ARM_CM4F;..\user\user_lib;..\User\hardware\ADC;..\User\hardware\BUZZER;..\User\hardware\delay;..\User\hardware\EXIT_Init;..\User\hardware\CAN;..\User\hardware\LED;..\User\hardware\FLASH;..\User\hardware\FRIC;..\User\hardware\LASER;..\User\hardware\POWER_CTRL;..\User\hardware\RC;..\User\hardware\RNG;..\User\hardware\SPI;..\User\hardware\SYS;..\user\hardware\timer;..\User\APP\CAN_Receive;..\User\APP\FreeRTOS_Middleware;..\User\APP\pid;..\User\APP\Remote_Control;..\User\TASK\start_task;..\User\APP\USART_comms;..\User\hardware\usart;..\User\TASK\revolver_task;..\User\TASK\INS_task;..\User\TASK\chassis_task;..\User\TASK\gimbal_task;..\User\TASK\shoot_task;..\User\APP\vision</IncludePath>
</VariousControls>
</Cads>
<Aads>
Expand Down
Empty file added Project/vision.c
Empty file.
Empty file added Project/vision.h
Empty file.
27 changes: 18 additions & 9 deletions user/APP/CAN_receive/CAN_receive.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,26 @@

/******************** Private Defines for Receiving ********************/

#define get_motor_measure(ptr, rx_message) \
#define fill_motor_readings(ptr, rx_message) \
{ \
(ptr)->last_ecd = (ptr)->ecd; \
(ptr)->ecd = (uint16_t)((rx_message)->Data[0] << 8 | (rx_message)->Data[1]); \
(ptr)->speed_rpm = (uint16_t)((rx_message)->Data[2] << 8 | (rx_message)->Data[3]); \
(ptr)->given_current = (uint16_t)((rx_message)->Data[4] << 8 | (rx_message)->Data[5]); \
(ptr)->current_read = (uint16_t)((rx_message)->Data[4] << 8 | (rx_message)->Data[5]); \
(ptr)->temperate = (rx_message)->Data[6]; \
}


/// TODO: Make similar get_motor_measure for M3508 and P36
#define fill_gimbal_motor_readings(ptr, rx_message) \
{ \
(ptr)->last_ecd = (ptr)->ecd; \
(ptr)->ecd = (uint16_t)((rx_message)->Data[0] << 8 | (rx_message)->Data[1]); \
(ptr)->current_read = (uint16_t)((rx_message)->Data[2] << 8 | (rx_message)->Data[3]); \
(ptr)->speed_rpm = (uint16_t)((rx_message)->Data[4] << 8 | (rx_message)->Data[5]); \
(ptr)->temperate = (rx_message)->Data[6]; \
}
// TODO: Check real message format -> most likely delete the gimbal version
// The ordering of current_read and speed_rpm in the documentation and the dji code do not match




Expand Down Expand Up @@ -254,22 +263,22 @@ static void CAN_hook(CanRxMsg *rx_message)
{
case CAN_YAW_MOTOR_ID:
{
get_motor_measure(&motor_yaw, rx_message);
fill_gimbal_motor_readings(&motor_yaw, rx_message);
break;
}
case CAN_PIT_MOTOR_ID:
{
get_motor_measure(&motor_pit, rx_message);
fill_gimbal_motor_readings(&motor_pit, rx_message);
break;
}
case CAN_TRIGGER_MOTOR_ID:
{
get_motor_measure(&motor_trigger, rx_message);
fill_motor_readings(&motor_trigger, rx_message);
break;
}
case CAN_HOPPER_MOTOR_ID:
{
get_motor_measure(&motor_hopper, rx_message);
fill_motor_readings(&motor_hopper, rx_message);
break;
}
case CAN_3508_M1_ID:
Expand All @@ -279,7 +288,7 @@ static void CAN_hook(CanRxMsg *rx_message)
{
static uint8_t i = 0;
i = rx_message->StdId - CAN_3508_M1_ID; //get motor ID
get_motor_measure(&motor_chassis[i], rx_message); //Use motor ID as index of array
fill_motor_readings(&motor_chassis[i], rx_message); //Use motor ID as index of array
break;
}

Expand Down
2 changes: 1 addition & 1 deletion user/APP/CAN_receive/CAN_receive.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ typedef struct
{
uint16_t ecd;
int16_t speed_rpm;
int16_t given_current;
int16_t current_read;
uint8_t temperate;
int16_t last_ecd;
} motor_measure_t;
Expand Down
15 changes: 15 additions & 0 deletions user/APP/USART_comms/USART_comms.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
#include "USART_comms.h"
#include <stdio.h>

// Debugging

// Sends one string over USART
// Example usage: serial_send_string("Nando eats Nando's at Nando's");
void serial_send_string(volatile char *str)
Expand Down Expand Up @@ -48,3 +50,16 @@ int num_digits(int n) {

return count;
}

// Vision

// Sends one string over UART8
void vision_send_string(volatile char *str)
{
while (*str) {
// Once previous byte is finished being transmitted, transmit next byte
while (USART_GetFlagStatus(UART8, USART_FLAG_TC) == RESET);
USART_SendData(UART8, *str);
str++;
}
}
2 changes: 2 additions & 0 deletions user/APP/USART_comms/USART_comms.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
#ifndef USART_COMMS_H
#define USART_COMMS_H
#include "main.h"

extern void serial_send_string(volatile char *str);
extern void serial_send_int_array(volatile int *arr, int length);
extern void serial_send_int(int num);
extern int num_digits(int n);
extern void vision_send_string(volatile char *str);

#endif
28 changes: 14 additions & 14 deletions user/APP/remote_control/remote_control.c
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
/**
****************************(C) COPYRIGHT 2016 DJI****************************
* @file remote_control.c/h
* @brief ң����������ң������ͨ������SBUS��Э�鴫�䣬����DMA���䷽ʽ��ԼCPU
* ��Դ�����ô��ڿ����ж���������������ͬʱ�ṩһЩ��������DMA������
* �ķ�ʽ��֤�Ȳ�ε��ȶ��ԡ�
* @note ��������ͨ�������ж�����������freeRTOS����
* @brief ?????????????????????????SBUS???????????DMA????????CPU
* ????????�???????????????????????????h?????????DMA??????
* ?k????????e???????
* @note ????????????????????????????freeRTOS????
* @history
* Version Date Author Modification
* V1.0.0 Dec-26-2018 RM 1. ���
* V1.0.0 Dec-26-2018 RM 1. ???
*
@verbatim
==============================================================================
Expand All @@ -27,7 +27,7 @@
#include <stdio.h>

// #include "Detect_Task.h" // see todo l.134
//ң����������������
//?????????????????
#define RC_CHANNAL_ERROR_VALUE 700

// Function prototypes
Expand Down Expand Up @@ -123,38 +123,38 @@ void USART1_IRQHandler(void)

if(DMA_GetCurrentMemoryTarget(DMA2_Stream2) == 0)
{
//��������DMA
//????????DMA
DMA_Cmd(DMA2_Stream2, DISABLE);
this_time_rx_len = SBUS_RX_BUF_NUM - DMA_GetCurrDataCounter(DMA2_Stream2);
DMA_SetCurrDataCounter(DMA2_Stream2, SBUS_RX_BUF_NUM);
DMA2_Stream2->CR |= DMA_SxCR_CT;
//��DMA�жϱ�־
//??DMA?????
DMA_ClearFlag(DMA2_Stream2, DMA_FLAG_TCIF2 | DMA_FLAG_HTIF2);
DMA_Cmd(DMA2_Stream2, ENABLE);
if(this_time_rx_len == RC_FRAME_LENGTH)
{
//����ң��������
//?????????????
SBUS_TO_RC(SBUS_rx_buf[0], &rc_ctrl);
//��¼���ݽ���ʱ��
//??�??????????
//TODO - need to implement this
// DetectHook(DBUSTOE);
}
}
else
{
//��������DMA
//????????DMA
DMA_Cmd(DMA2_Stream2, DISABLE);
this_time_rx_len = SBUS_RX_BUF_NUM - DMA_GetCurrDataCounter(DMA2_Stream2);
DMA_SetCurrDataCounter(DMA2_Stream2, SBUS_RX_BUF_NUM);
DMA2_Stream2->CR &= ~(DMA_SxCR_CT);
//��DMA�жϱ�־
//??DMA?????
DMA_ClearFlag(DMA2_Stream2, DMA_FLAG_TCIF2 | DMA_FLAG_HTIF2);
DMA_Cmd(DMA2_Stream2, ENABLE);
if(this_time_rx_len == RC_FRAME_LENGTH)
{
//����ң��������
//?????????????
SBUS_TO_RC(SBUS_rx_buf[1], &rc_ctrl);
//��¼���ݽ���ʱ��
//??�??????????
// DetectHook(DBUSTOE);
}

Expand Down
39 changes: 20 additions & 19 deletions user/TASK/INS_task/INS_task.c
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,8 @@ void INS_task(void *pvParameters)

extern Gimbal_t gimbal;
extern Gimbal_Motor_t gimbal_pitch_motor;
extern char str[];

static char message[32];

/**
* @brief Reading angle, gyro, and accelerometer data and printing to serial
Expand All @@ -390,34 +391,34 @@ void test_imu_readings(uint8_t angle, uint8_t gyro, uint8_t accel){

if (angle == TRUE) {
//Sending angle data via UART
sprintf(str, "Angle yaw: %f\n\r", gimbal.angle_update[INS_YAW_ADDRESS_OFFSET]);
serial_send_string(str);
sprintf(str, "Angle pitch: %f\n\r", gimbal.angle_update[INS_PITCH_ADDRESS_OFFSET]);
serial_send_string(str);
sprintf(str, "Angle roll: %f\n\r", gimbal.angle_update[INS_ROLL_ADDRESS_OFFSET]);
serial_send_string(str);
sprintf(message, "Angle yaw: %f\n\r", gimbal.angle_update[INS_YAW_ADDRESS_OFFSET]);
serial_send_string(message);
sprintf(message, "Angle pitch: %f\n\r", gimbal.angle_update[INS_PITCH_ADDRESS_OFFSET]);
serial_send_string(message);
sprintf(message, "Angle roll: %f\n\r", gimbal.angle_update[INS_ROLL_ADDRESS_OFFSET]);
serial_send_string(message);
serial_send_string("\n");
}

if (gyro == TRUE) {
//Sending gyro data via UART
sprintf(str, "Gyro X: %f\n\r", gimbal.gyro_update[INS_GYRO_X_ADDRESS_OFFSET]);
serial_send_string(str);
sprintf(str, "Gyro Y: %f\n\r", gimbal.gyro_update[INS_GYRO_Y_ADDRESS_OFFSET]);
serial_send_string(str);
sprintf(str, "Gyro Z: %f\n\r", gimbal.gyro_update[INS_GYRO_Z_ADDRESS_OFFSET]);
serial_send_string(str);
sprintf(message, "Gyro X: %f\n\r", gimbal.gyro_update[INS_GYRO_X_ADDRESS_OFFSET]);
serial_send_string(message);
sprintf(message, "Gyro Y: %f\n\r", gimbal.gyro_update[INS_GYRO_Y_ADDRESS_OFFSET]);
serial_send_string(message);
sprintf(message, "Gyro Z: %f\n\r", gimbal.gyro_update[INS_GYRO_Z_ADDRESS_OFFSET]);
serial_send_string(message);
serial_send_string("\n");
}

if (accel == TRUE) {
//Sending accelerometer data via UART
sprintf(str, "Acce X: %f\n\r", gimbal.accel_update[INS_ACCEL_X_ADDRESS_OFFSET]);
serial_send_string(str);
sprintf(str, "Acce Y: %f\n\r", gimbal.accel_update[INS_ACCEL_Y_ADDRESS_OFFSET]);
serial_send_string(str);
sprintf(str, "Acce Z: %f\n\r", gimbal.accel_update[INS_ACCEL_Z_ADDRESS_OFFSET]);
serial_send_string(str);
sprintf(message, "Acce X: %f\n\r", gimbal.accel_update[INS_ACCEL_X_ADDRESS_OFFSET]);
serial_send_string(message);
sprintf(message, "Acce Y: %f\n\r", gimbal.accel_update[INS_ACCEL_Y_ADDRESS_OFFSET]);
serial_send_string(message);
sprintf(message, "Acce Z: %f\n\r", gimbal.accel_update[INS_ACCEL_Z_ADDRESS_OFFSET]);
serial_send_string(message);
serial_send_string("\n");
}
}
Expand Down
Loading