Hi all, hope everyone is doing well.
This is my first time posting here, so please bear with me. I've Googled this issue for hours and trawled the forums, but I haven't found an answer that works for me.
Host OS: Ubuntu Linux 20.04.6 LTS
Board: Nucleo-144 H743ZI2
Package: STM32duino FreeRTOS, version 9.0.0
Standard Library: Newlib Nano
Goal: Serial communication over non-ST-Link USB port
Problem: USB port is not enabled / Ubuntu Linux can't communicate with it
The points above summarize my issue. My computer recognizes the ST-Link port and I'm able to flash and mount the board as I would expect. Sometimes I can also see the CDC USB port on my computer, and sometimes I can't. For a long time I was able to use the USB port for data communication, but recently I re-flashed and it doesn't work anymore.
My first thought was that there must be something wrong with my code, but I don't think that's the case because I've tried a variety of build options, code configurations, and library versions. I'm not sure why the USB port stopped working all of a sudden, but I've gathered from reading online that maybe the STM32 USB ports can be finicky.
I can't share all of my work, but here are some snippets that reproduce the issue for me. My code is quite different (setting up tasks, using the scheduler, mutexes, etc.) but I hope this minimal reproducible example will help find a solution.
MySketch.ino
Code: Select all
#include <string>
#include <Arduino.h>
#include <IWatchdog.h>
#include <STM32FreeRTOS.h>
using std::string;
void setup() {
Serial.begin();
while (!Serial.availableForWrite()) {}
}
void loop() {
foo();
delay(5);
}
void foo() {
char c{'0'};
string rcvd{""};
while (Serial.available() && c != '\n') {
c = (char)Serial.read();
rcvd += c;
}
}
arduino.json
Code: Select all
{
"sketch": "MySketch.ino",
"configuration": "pnum=NUCLEO_H743ZI2,upload_method=MassStorage,xserial=generic,usb=CDCgen,xusb=FS,opt=o3std,dbg=none,rtlib=nano",
"board": "STMicroelectronics:stm32:Nucleo_144",
"port": "/dev/ttyACM0",
"output": "./build"
}
Please let me know if there is any additional information that I could provide. Thank you!
by fallasea » Wed Jun 28, 2023 3:29 pm
The problem was my own. I was not resetting a watchdog as I should have been.
However, I still wasn't able to access the USB port with any version other the 9.0.0 of STM32duinoFreeRTOS.
The solution for that was to define a file named "STM32FreeRTOSConfig.h" in the top-level of my project and update this define to 3:
The "STM32FreeRTOSConfig.h" file that I used was based off of the default config file included with the library. Since it's a little hard to find, I've included it here:
Code: Select all
#ifndef FREERTOS_CONFIG_DEFAULT_H
#define FREERTOS_CONFIG_DEFAULT_H
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#include <stdint.h>
extern uint32_t SystemCoreClock;
#endif
#if defined(configUSE_CMSIS_RTOS_V2) && (configUSE_CMSIS_RTOS_V2 == 1)
#define configSUPPORT_STATIC_ALLOCATION 1
#define configMAX_PRIORITIES (56)
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
#ifndef configMINIMAL_STACK_SIZE
#define configMINIMAL_STACK_SIZE ((uint16_t)128)
#endif
#if !defined(CMSIS_device_header)
#define CMSIS_device_header "stm32_def.h"
#endif
#else
#define configMAX_PRIORITIES (7)
#endif
extern char _end;
extern char _estack;
extern char _Min_Stack_Size;
#ifndef configMINIMAL_STACK_SIZE
#define configMINIMAL_STACK_SIZE ((uint16_t)((uint32_t)&_Min_Stack_Size/8))
#endif
#ifndef configTOTAL_HEAP_SIZE
#define configTOTAL_HEAP_SIZE ((size_t)((uint32_t)&_estack - (uint32_t)&_Min_Stack_Size - (uint32_t)&_end))
#endif
#ifndef configISR_STACK_SIZE_WORDS
#define configISR_STACK_SIZE_WORDS ((uint32_t)&_Min_Stack_Size/4)
#endif
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 1
#define configUSE_TICK_HOOK 1
#define configCPU_CLOCK_HZ (SystemCoreClock)
#define configTICK_RATE_HZ ((TickType_t)1000)
#define configMAX_TASK_NAME_LEN (16)
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 8
#define configCHECK_FOR_STACK_OVERFLOW 0
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_MALLOC_FAILED_HOOK 0
#define configUSE_APPLICATION_TASK_TAG 0
#define configUSE_COUNTING_SEMAPHORES 1
#define configGENERATE_RUN_TIME_STATS 0
#define configUSE_NEWLIB_REENTRANT 1
#define configENABLE_MPU 0
#define configENABLE_FPU 1
#define configENABLE_TRUSTZONE 0
#define configUSE_CO_ROUTINES 0
#define configMAX_CO_ROUTINE_PRIORITIES (2)
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY (2)
#define configTIMER_QUEUE_LENGTH 10
#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE * 2)
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskCleanUpResources 1
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetSchedulerState 1
#define INCLUDE_uxTaskGetStackHighWaterMark 1
#define INCLUDE_xTaskGetIdleTaskHandle 1
#if defined(configUSE_CMSIS_RTOS_V2) && (configUSE_CMSIS_RTOS_V2 == 1)
#define INCLUDE_xSemaphoreGetMutexHolder 1
#define INCLUDE_eTaskGetState 1
#define INCLUDE_xTimerPendFunctionCall 1
#define INCLUDE_xTaskGetCurrentTaskHandle 1
#endif
#ifdef __NVIC_PRIO_BITS
#define configPRIO_BITS __NVIC_PRIO_BITS
#else
#define configPRIO_BITS 4
#endif
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0xf
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
#define configKERNEL_INTERRUPT_PRIORITY ( 14 << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#endif
Hope this helps!
Go to full post