partially fixed issue where motor controller was seeing a chirp on the RX line, causing some start bytes to be seen as a combination of the start byte and the src addr byte. Only partially fixed because the buffer stream is still skipped occasionally. Its just not due to that issue. The issue was fixed by driving the max485 chips with 5v at vcc instead of 3.3

stable
Penguin 2 years ago
parent 1ee7e71711
commit 25d46974e3

@ -1,96 +1,3 @@
b p_serial_mgr.c:113
r
q
q
b p_serial_mgr.c:119
r
q
b p_serial_mgr.c:87
r
p serial_pkt_cb.buffer[serial_pkt_cb.head]
q
b p_serial_mgr.c:87
r
b p_serial_mgr.c:122
r
q
q
b p_serial_mgr.c:100 if frame_index_tracker > 5
r
b p_serial_mgr.c:100 if frame_index_tracker > 0
r
q
b p_serial_mgr.c:79
r
b p_serial_mgr.c:100 if frame_index_tracker > 5
r
r
b p_serial_mgr.c:110 if frame_index_tracker > 5
r
del
b p_serial_mgr.c:79
r
del
b p_serial_mgr.c:86
r
p rxc
p serial_pkt_cb.buffer[serial_pkt_cb.head]
p serial_pkt_cb.buffer[serial_pkt_cb.head].frame_data
p/x serial_pkt_cb.buffer[serial_pkt_cb.head].frame_data
q
b p_serial_mgr.c:86
r
p rxc
p serial_pkt_cb.buffer[serial_pkt_cb.head]
p/x serial_pkt_cb.buffer[serial_pkt_cb.head].frame_data
q
b p_serial_mgr.c:86
r
p/x serial_pkt_cb.buffer[serial_pkt_cb.head].frame_data
p/x serial_pkt_cb.buffer
p\ serial_pkt_cb.buffer
p\ serial_pkt_cb.buffer
p\serial_pkt_cb.buffer
pserial_pkt_cb.buffer
p serial_pkt_cb.buffer
p serial_pkt_cb.buffer[0]
p/x serial_pkt_cb.buffer[0]
q
b p_serial_mgr.c:44
r
p serial_pkt_cb.head
p serial_pkt_cb.buffer[serial_pkt_cb.head]
p/x serial_pkt_cb.buffer[serial_pkt_cb.head]
p sizeof(serial_pkt_t)
q
b p_serial_mgr.c:44
r
p sizeof(serial_pkt_t)
c
c
r
make
r
c
r
p sizeof(serial_pkt_t)
p/x serial_pkt_cb.buffer[serial_pkt_cb.head]
make
r
p/x serial_pkt_cb.buffer[serial_pkt_cb.head]
c
r
c
del
q
q
b p_serial_mgr.c:43 if rxc == 0x7D
r
make -j20
load
r
make -j20
load
r r
del del
b p_serial_mgr.c:44 b p_serial_mgr.c:44
@ -254,3 +161,96 @@ n
p ret p ret
make clean make clean
q q
b main.c:138
r
s
n
s
s
b p_serial_mgr.c:45
del 0
del
b p_serial_mgr.c:45
r
s
s
s
p sstate
make
load
r
s
s
s
p sstate
b p_serial_mgr.c:45 if (sstate == SS_START)
del 3
r
b p_serial_mgr.c:30
r
c
p rxc
make
load
r
q
b p_serial_mgr.c:47 if sstate == SS_START
r
b p_serial_mgr.c:30
r
p rxb[0]
c
p rxb[0]
p huart
p *huart
make
load
r
del
b p_serial_mgr.c:30
r
p rxb
p/x *rxb@10
p/x *rxb@10
c
q
b p_serial_mgr.c:35
r
q
b p_serial_mgr.c:35
r
s
q
b p_serial_mgr.c:35
r
p/x *q
q
b p_serial_mgr.c:35
r
p/x *sbuffer[active_buffer]@24
r
b p_serial_mgr.c:35
r
q
b p_serial_mgr.c:35
r
p/x *sbuffer[active_buffer]@24
c
q
b p_serial_mgr.c:35
r
qq
q
b p_serial_mgr.c:35
r
p sstate
c
b p_serial_mgr.c:35
c
make
load
r
p sbuffer[active_buffer][0]
c
p sbuffer[active_buffer][0]
q

@ -55,6 +55,7 @@ void SVC_Handler(void);
void DebugMon_Handler(void); void DebugMon_Handler(void);
void PendSV_Handler(void); void PendSV_Handler(void);
void SysTick_Handler(void); void SysTick_Handler(void);
void DMA1_Channel5_IRQHandler(void);
void USART1_IRQHandler(void); void USART1_IRQHandler(void);
void USART2_IRQHandler(void); void USART2_IRQHandler(void);
void TIM6_DAC_IRQHandler(void); void TIM6_DAC_IRQHandler(void);

@ -50,6 +50,7 @@ TIM_HandleTypeDef htim6;
UART_HandleTypeDef huart1; UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2; UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart1_rx;
/* USER CODE BEGIN PV */ /* USER CODE BEGIN PV */
volatile uint8_t huart2_rxc; volatile uint8_t huart2_rxc;
@ -64,8 +65,9 @@ void SystemClock_Config(void);
static void MX_GPIO_Init(void); static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void); static void MX_TIM2_Init(void);
static void MX_USART2_UART_Init(void); static void MX_USART2_UART_Init(void);
static void MX_TIM6_Init(void); static void MX_DMA_Init(void);
static void MX_USART1_UART_Init(void); static void MX_USART1_UART_Init(void);
static void MX_TIM6_Init(void);
/* USER CODE BEGIN PFP */ /* USER CODE BEGIN PFP */
static void UART2_RxCpltCallback(UART_HandleTypeDef *huart); static void UART2_RxCpltCallback(UART_HandleTypeDef *huart);
@ -106,8 +108,9 @@ int main(void)
MX_GPIO_Init(); MX_GPIO_Init();
MX_TIM2_Init(); MX_TIM2_Init();
MX_USART2_UART_Init(); MX_USART2_UART_Init();
MX_TIM6_Init(); MX_DMA_Init();
MX_USART1_UART_Init(); MX_USART1_UART_Init();
MX_TIM6_Init();
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */
huart2.RxCpltCallback = UART2_RxCpltCallback; huart2.RxCpltCallback = UART2_RxCpltCallback;
@ -116,15 +119,15 @@ int main(void)
// HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); // HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
// HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4); // HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);
setPWM(&htim2, TIM_CHANNEL_2, 50); // setPWM(&htim2, TIM_CHANNEL_2, 50);
setPWM(&htim2, TIM_CHANNEL_4, 25); // setPWM(&htim2, TIM_CHANNEL_4, 25);
HAL_GPIO_WritePin(m1_dir_GPIO_Port, m1_dir_Pin, 1); HAL_GPIO_WritePin(m1_dir_GPIO_Port, m1_dir_Pin, 1);
HAL_GPIO_WritePin(m2_dir_GPIO_Port, m2_dir_Pin, 1); HAL_GPIO_WritePin(m2_dir_GPIO_Port, m2_dir_Pin, 1);
mc_init(&htim2); // mc_init(&htim2);
HAL_UART_Receive_IT(&huart2, &huart2_rxc, 1); HAL_UART_Receive_IT(&huart2, &huart2_rxc, 1);
HAL_TIM_Base_Start_IT(&htim6); // HAL_TIM_Base_Start_IT(&htim6);
p_serial_mgr_start(); p_serial_mgr_start();
@ -133,22 +136,9 @@ int main(void)
/* Infinite loop */ /* Infinite loop */
/* USER CODE BEGIN WHILE */ /* USER CODE BEGIN WHILE */
uint8_t rxb[256] = {0};
while (1) while (1)
{ {
if (p_serial_mgr_service()) p_serial_mgr_service();
{
volatile HAL_StatusTypeDef ret;
ret = HAL_UART_Receive(&huart1, rxb, 256, 5);
for (int ind = 0; ind < 20; ind++)
{
p_uart_async_write_byte(rxb[ind]);
}
PDEBUG("\n\n\n\n");
memset(rxb, 0, 256);
p_serial_mgr_start();
}
// if (b_timer_struck) // if (b_timer_struck)
// { // {
// // PDEBUG("%d\n", sys_time); // // PDEBUG("%d\n", sys_time);
@ -398,6 +388,21 @@ static void MX_USART2_UART_Init(void)
/* USER CODE END USART2_Init 2 */ /* USER CODE END USART2_Init 2 */
} }
/**
* Enable DMA controller clock
*/
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Channel5_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);
}
/** /**
* @brief GPIO Initialization Function * @brief GPIO Initialization Function
* @param None * @param None

@ -23,6 +23,7 @@
/* USER CODE BEGIN Includes */ /* USER CODE BEGIN Includes */
/* USER CODE END Includes */ /* USER CODE END Includes */
extern DMA_HandleTypeDef hdma_usart1_rx;
/* Private typedef -----------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD */ /* USER CODE BEGIN TD */
@ -240,6 +241,24 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
GPIO_InitStruct.Alternate = GPIO_AF7_USART1; GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART1 DMA Init */
/* USART1_RX Init */
hdma_usart1_rx.Instance = DMA1_Channel5;
hdma_usart1_rx.Init.Request = DMA_REQUEST_2;
hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart1_rx.Init.Mode = DMA_NORMAL;
hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(huart,hdmarx,hdma_usart1_rx);
/* USART1 interrupt Init */ /* USART1 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn); HAL_NVIC_EnableIRQ(USART1_IRQn);
@ -317,6 +336,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
*/ */
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10|USART1_DE_Pin); HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10|USART1_DE_Pin);
/* USART1 DMA DeInit */
HAL_DMA_DeInit(huart->hdmarx);
/* USART1 interrupt DeInit */ /* USART1 interrupt DeInit */
HAL_NVIC_DisableIRQ(USART1_IRQn); HAL_NVIC_DisableIRQ(USART1_IRQn);
/* USER CODE BEGIN USART1_MspDeInit 1 */ /* USER CODE BEGIN USART1_MspDeInit 1 */

@ -56,6 +56,7 @@
/* External variables --------------------------------------------------------*/ /* External variables --------------------------------------------------------*/
extern TIM_HandleTypeDef htim6; extern TIM_HandleTypeDef htim6;
extern DMA_HandleTypeDef hdma_usart1_rx;
extern UART_HandleTypeDef huart1; extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2; extern UART_HandleTypeDef huart2;
/* USER CODE BEGIN EV */ /* USER CODE BEGIN EV */
@ -200,6 +201,20 @@ void SysTick_Handler(void)
/* please refer to the startup file (startup_stm32l4xx.s). */ /* please refer to the startup file (startup_stm32l4xx.s). */
/******************************************************************************/ /******************************************************************************/
/**
* @brief This function handles DMA1 channel5 global interrupt.
*/
void DMA1_Channel5_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel5_IRQn 0 */
/* USER CODE END DMA1_Channel5_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart1_rx);
/* USER CODE BEGIN DMA1_Channel5_IRQn 1 */
/* USER CODE END DMA1_Channel5_IRQn 1 */
}
/** /**
* @brief This function handles USART1 global interrupt. * @brief This function handles USART1 global interrupt.
*/ */

@ -1,5 +1,5 @@
########################################################################################################################## ##########################################################################################################################
# File automatically-generated by tool: [projectgenerator] version: [3.16.0] date: [Fri Apr 08 17:14:47 CDT 2022] # File automatically-generated by tool: [projectgenerator] version: [3.16.0] date: [Mon May 02 17:19:20 CDT 2022]
########################################################################################################################## ##########################################################################################################################
# ------------------------------------------------ # ------------------------------------------------
@ -126,7 +126,8 @@ C_INCLUDES = \
-Ishared \ -Ishared \
-Ishared/devices \ -Ishared/devices \
-Ishared/drivers \ -Ishared/drivers \
-Ishared/util -Ishared/util \
-IPenguinBuffer
# compile gcc flags # compile gcc flags

@ -18,6 +18,7 @@
"-Ishared/devices", "-Ishared/devices",
"-Ishared/drivers", "-Ishared/drivers",
"-Ishared/util", "-Ishared/util",
"-IPenguinBuffer",
"-Og", "-Og",
"-Wall", "-Wall",
"-fdata-sections", "-fdata-sections",
@ -25,13 +26,13 @@
"-g3", "-g3",
"-gdwarf-2", "-gdwarf-2",
"-D_DEBUG", "-D_DEBUG",
"-MFbuild/main.d", "-MFbuild/p_serial_mgr.d",
"-Wa,-a,-ad,-alms=build/main.lst", "-Wa,-a,-ad,-alms=build/p_serial_mgr.lst",
"-o", "-o",
"build/main.o", "build/p_serial_mgr.o",
"Core/Src/main.c" "shared/drivers/p_serial_mgr.c"
], ],
"directory": "/storage/Shared/Projects/Penguinator/motor_controller", "directory": "/storage/Shared/Projects/Penguinator/motor_controller",
"file": "Core/Src/main.c" "file": "shared/drivers/p_serial_mgr.c"
} }
] ]

5025
gdb.txt

File diff suppressed because it is too large Load Diff

@ -129,7 +129,7 @@ ProjectManager.FreePins=false
ProjectManager.HalAssertFull=false ProjectManager.HalAssertFull=false
ProjectManager.HeapSize=0x200 ProjectManager.HeapSize=0x200
ProjectManager.KeepUserCode=true ProjectManager.KeepUserCode=true
ProjectManager.LastFirmware=true ProjectManager.LastFirmware=false
ProjectManager.LibraryCopy=1 ProjectManager.LibraryCopy=1
ProjectManager.MainLocation=Core/Src ProjectManager.MainLocation=Core/Src
ProjectManager.NoMain=false ProjectManager.NoMain=false
@ -142,7 +142,7 @@ ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=Makefile ProjectManager.TargetToolchain=Makefile
ProjectManager.ToolChainLocation= ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=false ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,4-MX_TIM2_Init-TIM2-false-HAL-true,5-MX_USART2_UART_Init-USART2-false-HAL-true,6-MX_DMA_Init-DMA-false-HAL-true,7-MX_USART1_UART_Init-USART1-false-HAL-true ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_TIM2_Init-TIM2-false-HAL-true,4-MX_USART2_UART_Init-USART2-false-HAL-true,5-MX_DMA_Init-DMA-false-HAL-true,6-MX_USART1_UART_Init-USART1-false-HAL-true,7-MX_TIM6_Init-TIM6-false-HAL-true
RCC.48CLKFreq_Value=24000000 RCC.48CLKFreq_Value=24000000
RCC.AHBFreq_Value=32000000 RCC.AHBFreq_Value=32000000
RCC.APB1Freq_Value=32000000 RCC.APB1Freq_Value=32000000

@ -2,8 +2,12 @@
#include "putil.h" #include "putil.h"
#include "stm32l4xx_hal_uart.h" #include "stm32l4xx_hal_uart.h"
#define MAX_SERIAL_BUFFER_SIZE (262) // Actually 261, add 1 for padding #define NUM_BUFFERS (10)
uint8_t sbuffer[NUM_BUFFERS][MAX_MESSAGE_LEN];
uint8_t active_buffer = 0;
uint8_t rxb[MAX_MESSAGE_LEN];
// this protocol is very similar to the digi api v2 (inspired from) // this protocol is very similar to the digi api v2 (inspired from)
// [0]{1} Start delimiter 0x7E // [0]{1} Start delimiter 0x7E
// [1]{1} Source Address // [1]{1} Source Address
@ -28,10 +32,14 @@ static serial_state_t sstate = SS_IDLE;
void UART1_RxCpltCallback(UART_HandleTypeDef *huart) void UART1_RxCpltCallback(UART_HandleTypeDef *huart)
{ {
if (rxc == 0x7E && sstate == SS_IDLE) if (sstate == SS_IDLE && sbuffer[active_buffer][0] == 0x7E)
{ {
sstate = SS_START; sstate = SS_START;
} }
else
{
HAL_UART_Receive_IT(_serial_huart_inst, sbuffer[active_buffer], 1);
}
} }
void p_serial_mgr_init(UART_HandleTypeDef *huart) void p_serial_mgr_init(UART_HandleTypeDef *huart)
@ -43,14 +51,20 @@ void p_serial_mgr_service(void)
{ {
if (sstate == SS_START) if (sstate == SS_START)
{ {
return; HAL_UART_Receive(_serial_huart_inst, &sbuffer[active_buffer][1], MAX_MESSAGE_LEN, 10);
for (int ind = 0; ind < 24; ind++)
{
PDEBUG("[%d]: 0x%02x\n", ind, sbuffer[active_buffer][ind]);
}
PDEBUG("\n\n");
sstate = SS_IDLE;
active_buffer = (active_buffer + 1) % NUM_BUFFERS;
HAL_UART_Receive_IT(_serial_huart_inst, sbuffer[active_buffer], 1);
} }
else if (sstate = SS_IDLE) {}
return b_go;
} }
void p_serial_mgr_start() void p_serial_mgr_start()
{ {
b_go = false; sstate = SS_IDLE;
HAL_UART_Receive_IT(_serial_huart_inst, &rxc, 1); HAL_UART_Receive_IT(_serial_huart_inst, sbuffer[active_buffer], 1);
} }

@ -1,9 +1,9 @@
#ifndef _P_SERIAL_MGR_H_ #ifndef _P_SERIAL_MGR_H_
#define _P_SERIAL_MGR_H_ #define _P_SERIAL_MGR_H_
#include "p_cbuffer.h"
#include "stm32l4xx_hal.h" #include "stm32l4xx_hal.h"
#include <stdbool.h> #include <stdbool.h>
// start byte // start byte
// src_addr {1} + // src_addr {1} +
// dest_addr {1} + // dest_addr {1} +
@ -30,7 +30,7 @@ typedef struct serial_pkt_t
void p_serial_mgr_init(UART_HandleTypeDef *huart); void p_serial_mgr_init(UART_HandleTypeDef *huart);
bool p_serial_mgr_service(void); void p_serial_mgr_service(void);
void p_serial_mgr_start(); void p_serial_mgr_start();

Loading…
Cancel
Save