From 604e9e603b49054bec277d93d7bc31bf7fa55a0b Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Thu, 18 Jun 2026 06:20:14 +0200 Subject: [PATCH 1/4] Add USART DMA in Normal mode from CubeMX --- Core/Inc/stm32f4xx_it.h | 1 + Core/Src/main.c | 6 +++++- Core/Src/stm32f4xx_hal_msp.c | 23 +++++++++++++++++++++++ Core/Src/stm32f4xx_it.c | 15 +++++++++++++++ can_logger.ioc | 14 +++++++++++++- 5 files changed, 57 insertions(+), 2 deletions(-) diff --git a/Core/Inc/stm32f4xx_it.h b/Core/Inc/stm32f4xx_it.h index e20bc71..08a2693 100644 --- a/Core/Inc/stm32f4xx_it.h +++ b/Core/Inc/stm32f4xx_it.h @@ -56,6 +56,7 @@ void SDIO_IRQHandler(void); void TIM6_DAC_IRQHandler(void); void DMA2_Stream3_IRQHandler(void); void DMA2_Stream6_IRQHandler(void); +void DMA2_Stream7_IRQHandler(void); /* USER CODE BEGIN EFP */ /* USER CODE END EFP */ diff --git a/Core/Src/main.c b/Core/Src/main.c index 8cce2e7..5d02bdd 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -46,6 +46,7 @@ DMA_HandleTypeDef hdma_sdio_rx; DMA_HandleTypeDef hdma_sdio_tx; UART_HandleTypeDef huart1; +DMA_HandleTypeDef hdma_usart1_tx; /* USER CODE BEGIN PV */ LED_Config led_can1 = {GPIOB, GPIO_PIN_5}; @@ -386,7 +387,7 @@ static void MX_USART1_UART_Init(void) /* USER CODE END USART1_Init 1 */ huart1.Instance = USART1; - huart1.Init.BaudRate = 1152000; + huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; @@ -419,6 +420,9 @@ static void MX_DMA_Init(void) /* DMA2_Stream6_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 5, 0); HAL_NVIC_EnableIRQ(DMA2_Stream6_IRQn); + /* DMA2_Stream7_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); /* USER CODE BEGIN MX_DMA_Init 1 */ DEBUG_PRINT("DMA initialized!\r\n"); diff --git a/Core/Src/stm32f4xx_hal_msp.c b/Core/Src/stm32f4xx_hal_msp.c index 6289a5a..61835fe 100644 --- a/Core/Src/stm32f4xx_hal_msp.c +++ b/Core/Src/stm32f4xx_hal_msp.c @@ -26,6 +26,8 @@ extern DMA_HandleTypeDef hdma_sdio_rx; extern DMA_HandleTypeDef hdma_sdio_tx; +extern DMA_HandleTypeDef hdma_usart1_tx; + /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN TD */ @@ -371,6 +373,25 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /* USART1 DMA Init */ + /* USART1_TX Init */ + hdma_usart1_tx.Instance = DMA2_Stream7; + hdma_usart1_tx.Init.Channel = DMA_CHANNEL_4; + hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE; + hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_usart1_tx.Init.Mode = DMA_NORMAL; + hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW; + hdma_usart1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx); + /* USER CODE BEGIN USART1_MspInit 1 */ /* USER CODE END USART1_MspInit 1 */ @@ -401,6 +422,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); + /* USART1 DMA DeInit */ + HAL_DMA_DeInit(huart->hdmatx); /* USER CODE BEGIN USART1_MspDeInit 1 */ /* USER CODE END USART1_MspDeInit 1 */ diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c index a10c042..410f57b 100644 --- a/Core/Src/stm32f4xx_it.c +++ b/Core/Src/stm32f4xx_it.c @@ -58,6 +58,7 @@ extern DMA_HandleTypeDef hdma_sdio_rx; extern DMA_HandleTypeDef hdma_sdio_tx; extern SD_HandleTypeDef hsd; +extern DMA_HandleTypeDef hdma_usart1_tx; extern TIM_HandleTypeDef htim6; /* USER CODE BEGIN EV */ @@ -218,6 +219,20 @@ void DMA2_Stream6_IRQHandler(void) /* USER CODE END DMA2_Stream6_IRQn 1 */ } +/** + * @brief This function handles DMA2 stream7 global interrupt. + */ +void DMA2_Stream7_IRQHandler(void) +{ + /* USER CODE BEGIN DMA2_Stream7_IRQn 0 */ + + /* USER CODE END DMA2_Stream7_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_usart1_tx); + /* USER CODE BEGIN DMA2_Stream7_IRQn 1 */ + + /* USER CODE END DMA2_Stream7_IRQn 1 */ +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/can_logger.ioc b/can_logger.ioc index d6945da..170b21c 100644 --- a/can_logger.ioc +++ b/can_logger.ioc @@ -20,7 +20,8 @@ CAN2.Mode=CAN_MODE_SILENT CAN2.Prescaler=8 Dma.Request0=SDIO_RX Dma.Request1=SDIO_TX -Dma.RequestsNb=2 +Dma.Request2=USART1_TX +Dma.RequestsNb=3 Dma.SDIO_RX.0.Direction=DMA_PERIPH_TO_MEMORY Dma.SDIO_RX.0.FIFOMode=DMA_FIFOMODE_ENABLE Dma.SDIO_RX.0.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL @@ -47,6 +48,16 @@ Dma.SDIO_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_WORD Dma.SDIO_TX.1.PeriphInc=DMA_PINC_DISABLE Dma.SDIO_TX.1.Priority=DMA_PRIORITY_LOW Dma.SDIO_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode,FIFOThreshold,MemBurst,PeriphBurst +Dma.USART1_TX.2.Direction=DMA_MEMORY_TO_PERIPH +Dma.USART1_TX.2.FIFOMode=DMA_FIFOMODE_DISABLE +Dma.USART1_TX.2.Instance=DMA2_Stream7 +Dma.USART1_TX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.USART1_TX.2.MemInc=DMA_MINC_ENABLE +Dma.USART1_TX.2.Mode=DMA_NORMAL +Dma.USART1_TX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.USART1_TX.2.PeriphInc=DMA_PINC_DISABLE +Dma.USART1_TX.2.Priority=DMA_PRIORITY_LOW +Dma.USART1_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode FREERTOS.FootprintOK=true FREERTOS.IPParameters=Tasks01,configUSE_NEWLIB_REENTRANT,FootprintOK FREERTOS.Tasks01=DefaultTask,49,128,can_listen,Default,NULL,Dynamic,NULL,NULL @@ -96,6 +107,7 @@ MxDb.Version=DB.6.0.170 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false NVIC.DMA2_Stream3_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true NVIC.DMA2_Stream6_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true +NVIC.DMA2_Stream7_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false NVIC.ForceEnableDMAVector=true NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false From 825ddc69610bf94fa568f8128646f6e0104f84e3 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Thu, 18 Jun 2026 08:28:56 +0200 Subject: [PATCH 2/4] Add debug print after 1s of no CAN traffic --- Core/Src/canlog.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Core/Src/canlog.c b/Core/Src/canlog.c index 4909412..dea5552 100644 --- a/Core/Src/canlog.c +++ b/Core/Src/canlog.c @@ -117,13 +117,15 @@ void vCANListener(void *argument) for (;;) { - if (osMessageQueueGet(queue, &message, NULL, osWaitForever) == osOK) + if (osMessageQueueGet(queue, &message, NULL, 1000) == osOK) { // J1939 decoding // RELAY: Push to the UART queue osMessageQueuePut(xUARTQueue, &message, 0U, 0U); } + else DEBUG_PRINT("No CAN yet!\r\n"); + } } /* END vCANListener */ From ef034f31957d8eaa100c90b9658df27d10a227ea Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Thu, 18 Jun 2026 13:30:50 +0200 Subject: [PATCH 3/4] Add debug dummy CAN frame sent regularly - Activated by defining DEBUG_DUMMY_FRAME --- Core/Inc/main.h | 2 ++ Core/Src/cansend.c | 21 ++++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 58de877..58462c7 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -46,6 +46,8 @@ extern "C" { /* Exported macro ------------------------------------------------------------*/ /* USER CODE BEGIN EM */ #define DEBUG +#define DEBUG_DUMMY_FRAME + #ifdef DEBUG #include #define DEBUG_PRINT(...) printf(__VA_ARGS__) diff --git a/Core/Src/cansend.c b/Core/Src/cansend.c index 2c82448..5e49648 100644 --- a/Core/Src/cansend.c +++ b/Core/Src/cansend.c @@ -104,7 +104,26 @@ void vUARTLogger(void *argument) CanMessage_t message; char tx_buffer[45]; - for (;;) + #ifdef DEBUG_DUMMY_FRAME + CanMessage_t dummy_frame = { + .id = 0x0CF00400, // J1939 EEC1 ID + .dlc = 8, // 8 bytes of data + .isExtended = 1, // 29-bit Extended ID + .source = 1, // CAN1 + .payload = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x11, 0x22} + }; + #endif + + for (;;) + { + DEBUG_PRINT("Waiting for CAN traffic...\r\n"); + + #ifdef DEBUG_DUMMY_FRAME + osMessageQueuePut(xUARTQueue, &dummy_frame, 0U, 0U); + osDelay(1000); + #endif + + if (osMessageQueueGet(xUARTQueue, &message, NULL, osWaitForever) == osOK) { DEBUG_PRINT("Waiting for CAN traffic...\r\n"); if (osMessageQueueGet(xUARTQueue, &message, NULL, osWaitForever) == osOK) From 1ad8e5b04f48db592e1e8f20695e10c3f8c85a63 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Thu, 18 Jun 2026 13:37:57 +0200 Subject: [PATCH 4/4] Change define name - "DEBUG" is also used by STM32 for... something... --- Core/Inc/main.h | 4 ++-- Core/Src/cansend.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 58462c7..61e7cd4 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -45,10 +45,10 @@ extern "C" { /* Exported macro ------------------------------------------------------------*/ /* USER CODE BEGIN EM */ -#define DEBUG +#define DEBUG_ITM #define DEBUG_DUMMY_FRAME -#ifdef DEBUG +#ifdef DEBUG_ITM #include #define DEBUG_PRINT(...) printf(__VA_ARGS__) #else diff --git a/Core/Src/cansend.c b/Core/Src/cansend.c index 5e49648..30dba22 100644 --- a/Core/Src/cansend.c +++ b/Core/Src/cansend.c @@ -135,5 +135,6 @@ void vUARTLogger(void *argument) DEBUG_PRINT("CAN frame sent via UART\r\n"); } } + } } /* END vUARTLoggerListen */