2025-02-12 01:54 PM
I am stumped and frustrated. I wrote some test code to test UART4. It worked fine. Then I moved the test code over to my main project and now I get no UART interrupts. Both code sets run on the same hardware. I have checked to make sure the UART RX was on the right pin, checked the NVIC settings, even went into the UART registers looking for a difference. Any ideas?
main code:
HAL_UART_Receive_IT(&huart4, rx_buff, 1);
IRQ handler:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
static uint8_t MeasState=0; //0=meas, 1=calc
static uint32_t OldSample;
uint32_t NewSample;
//static uint32_t OldTimerValue;
uint32_t NewTimerValue;
if(rx_buff[0]==0xF8)
{
if(MeasState==0)
{
OldSample=__HAL_TIM_GET_COUNTER(&htim23);
MeasState=1;
} else
{
NewSample=__HAL_TIM_GET_COUNTER(&htim23);
MeasState=0;
NewTimerValue = (NewSample-OldSample)/2560;
//TIM2->ARR = NewTimerValue;
__HAL_TIM_SET_AUTORELOAD(&htim2,NewTimerValue);
}
}
HAL_UART_Receive_IT(&huart4, rx_buff, 1);
}
2025-02-12 05:13 PM
Which pins are you using? PA0/PA1? If so, PA1 is connected to the ethernet controller.
Try PD0 and PD1, or the other possible pin combinations for UART4.
2025-02-12 05:28 PM
Using PD0/PD1. Also my test code runs on this hardware with the same pins.
2025-02-12 06:40 PM - edited 2025-02-12 06:43 PM
You must be on the wrong pins on the Nucleo?
I've tested UART4 using PD0 and PD1 and I get interrupts.
Here is just a simple code that I used to test receiving 0xF8 and replying back with 01 02 03
/*
* PollingRoutine.c
*
* Created on: Oct 24, 2023
* Author: karl.yamashita
*
*
* Template for projects.
*
* The object of this PollingRoutine.c/h files is to not have to write code in main.c which already has a lot of generated code.
* It is cumbersome having to scroll through all the generated code for your own code and having to find a USER CODE section so your code is not erased when CubeMX re-generates code.
*
* Direction: Call PollingInit before the main while loop. Call PollingRoutine from within the main while loop
*
* Example;
// USER CODE BEGIN WHILE
PollingInit();
while (1)
{
PollingRoutine();
// USER CODE END WHILE
// USER CODE BEGIN 3
}
// USER CODE END 3
*/
#include "main.h"
extern UART_HandleTypeDef huart4;
uint8_t uart4rxData[1] = {0};
uint8_t txData[] = {0x11,0x22,0x33,0x44,0x55};
bool uart4Flag = false;
// called before main while loop
void PollingInit(void)
{
HAL_UART_Receive_IT(&huart4, uart4rxData, 1);
HAL_UART_Transmit_IT(&huart4, txData, 5);
}
// called from inside main while loop
void PollingRoutine(void)
{
UART_CheckFlag();
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart4)
{
uart4Flag = 1;
HAL_UART_Receive_IT(&huart4, uart4rxData, 1);
}
}
void UART_CheckFlag(void)
{
if(uart4Flag)
{
uart4Flag = 0;
if(uart4rxData[0] == 0xF8)
{
txData[0] = 1;
txData[1] = 2;
txData[2] = 3;
HAL_UART_Transmit_IT(&huart4, txData, 3);
}
}
}
This is the output from Docklight
2/12/2025 18:37:53.375 [RX] - 11 22 33 44 55
2/12/2025 18:37:57.417 [TX] - F8
2/12/2025 18:37:57.432 [RX] - 01 02 03
2/12/2025 18:38:05.903 [TX] - F8
2/12/2025 18:38:05.915 [RX] - 01 02 03
2/12/2025 18:38:12.999 [TX] - F8
2/12/2025 18:38:13.008 [RX] - 01 02 03
Are you sure you have PD0 as Rx? It's reversed compared to PA0/PA1 where PA1 is Rx.
2025-02-12 07:21 PM
Yes, PD0 is the RX line.