diff --git a/micro-ros-stm32_embeddedrtps/main_twist.c b/micro-ros-stm32_embeddedrtps/main_twist.c
new file mode 100644
index 0000000..06a2017
--- /dev/null
+++ b/micro-ros-stm32_embeddedrtps/main_twist.c
@@ -0,0 +1,505 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ ******************************************************************************
+ * @attention
+ *
+ *
© Copyright (c) 2022 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "cmsis_os.h"
+#include "lwip.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include
+#include
+#include
+#include
+
+#include
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+
+UART_HandleTypeDef huart3;
+
+PCD_HandleTypeDef hpcd_USB_OTG_FS;
+
+/* Definitions for defaultTask */
+osThreadId_t defaultTaskHandle;
+const osThreadAttr_t defaultTask_attributes = {
+ .name = "defaultTask",
+ .stack_size = 8000 * 4,
+ .priority = (osPriority_t) osPriorityBelowNormal3,
+};
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_USART3_UART_Init(void);
+static void MX_USB_OTG_FS_PCD_Init(void);
+void StartDefaultTask(void *argument);
+
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* USER CODE BEGIN 1 */
+
+ /* USER CODE END 1 */
+
+ /* MCU Configuration--------------------------------------------------------*/
+
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ /* USER CODE BEGIN Init */
+
+ /* USER CODE END Init */
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ /* USER CODE BEGIN SysInit */
+
+ /* USER CODE END SysInit */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_USART3_UART_Init();
+ MX_USB_OTG_FS_PCD_Init();
+ /* USER CODE BEGIN 2 */
+
+ /* USER CODE END 2 */
+
+ /* Init scheduler */
+ osKernelInitialize();
+
+ /* USER CODE BEGIN RTOS_MUTEX */
+ /* add mutexes, ... */
+ /* USER CODE END RTOS_MUTEX */
+
+ /* USER CODE BEGIN RTOS_SEMAPHORES */
+ /* add semaphores, ... */
+ /* USER CODE END RTOS_SEMAPHORES */
+
+ /* USER CODE BEGIN RTOS_TIMERS */
+ /* start timers, add new ones, ... */
+ /* USER CODE END RTOS_TIMERS */
+
+ /* USER CODE BEGIN RTOS_QUEUES */
+ /* add queues, ... */
+ /* USER CODE END RTOS_QUEUES */
+
+ /* Create the thread(s) */
+ /* creation of defaultTask */
+ defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
+
+ /* USER CODE BEGIN RTOS_THREADS */
+ /* add threads, ... */
+ /* USER CODE END RTOS_THREADS */
+
+ /* USER CODE BEGIN RTOS_EVENTS */
+ /* add events, ... */
+ /* USER CODE END RTOS_EVENTS */
+
+ /* Start scheduler */
+ osKernelStart();
+
+ /* We should never get here as control is now taken by the scheduler */
+ /* Infinite loop */
+ /* USER CODE BEGIN WHILE */
+ while (1)
+ {
+ /* USER CODE END WHILE */
+
+ /* USER CODE BEGIN 3 */
+ }
+ /* USER CODE END 3 */
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ HAL_PWR_EnableBkUpAccess();
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_RCC_PWR_CLK_ENABLE();
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
+ /** Initializes the RCC Oscillators according to the specified parameters
+ * in the RCC_OscInitTypeDef structure.
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ RCC_OscInitStruct.PLL.PLLM = 4;
+ RCC_OscInitStruct.PLL.PLLN = 96;
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
+ RCC_OscInitStruct.PLL.PLLQ = 4;
+ RCC_OscInitStruct.PLL.PLLR = 2;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Activate the Over-Drive mode
+ */
+ if (HAL_PWREx_EnableOverDrive() != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the CPU, AHB and APB buses clocks
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART3|RCC_PERIPHCLK_CLK48;
+ PeriphClkInitStruct.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.Clk48ClockSelection = RCC_CLK48SOURCE_PLL;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief USART3 Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_USART3_UART_Init(void)
+{
+
+ /* USER CODE BEGIN USART3_Init 0 */
+
+ /* USER CODE END USART3_Init 0 */
+
+ /* USER CODE BEGIN USART3_Init 1 */
+
+ /* USER CODE END USART3_Init 1 */
+ huart3.Instance = USART3;
+ huart3.Init.BaudRate = 115200;
+ huart3.Init.WordLength = UART_WORDLENGTH_8B;
+ huart3.Init.StopBits = UART_STOPBITS_1;
+ huart3.Init.Parity = UART_PARITY_NONE;
+ huart3.Init.Mode = UART_MODE_TX_RX;
+ huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart3.Init.OverSampling = UART_OVERSAMPLING_16;
+ huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart3) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN USART3_Init 2 */
+
+ /* USER CODE END USART3_Init 2 */
+
+}
+
+/**
+ * @brief USB_OTG_FS Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_USB_OTG_FS_PCD_Init(void)
+{
+
+ /* USER CODE BEGIN USB_OTG_FS_Init 0 */
+
+ /* USER CODE END USB_OTG_FS_Init 0 */
+
+ /* USER CODE BEGIN USB_OTG_FS_Init 1 */
+
+ /* USER CODE END USB_OTG_FS_Init 1 */
+ hpcd_USB_OTG_FS.Instance = USB_OTG_FS;
+ hpcd_USB_OTG_FS.Init.dev_endpoints = 6;
+ hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL;
+ hpcd_USB_OTG_FS.Init.dma_enable = DISABLE;
+ hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
+ hpcd_USB_OTG_FS.Init.Sof_enable = ENABLE;
+ hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE;
+ hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE;
+ hpcd_USB_OTG_FS.Init.vbus_sensing_enable = ENABLE;
+ hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE;
+ if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN USB_OTG_FS_Init 2 */
+
+ /* USER CODE END USB_OTG_FS_Init 2 */
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOH_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+ __HAL_RCC_GPIOG_CLK_ENABLE();
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOB, LD1_Pin|LD3_Pin|LD2_Pin, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(USB_PowerSwitchOn_GPIO_Port, USB_PowerSwitchOn_Pin, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin : USER_Btn_Pin */
+ GPIO_InitStruct.Pin = USER_Btn_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(USER_Btn_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : LD1_Pin LD3_Pin LD2_Pin */
+ GPIO_InitStruct.Pin = LD1_Pin|LD3_Pin|LD2_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : USB_PowerSwitchOn_Pin */
+ GPIO_InitStruct.Pin = USB_PowerSwitchOn_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(USB_PowerSwitchOn_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : USB_OverCurrent_Pin */
+ GPIO_InitStruct.Pin = USB_OverCurrent_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(USB_OverCurrent_GPIO_Port, &GPIO_InitStruct);
+
+}
+
+/* USER CODE BEGIN 4 */
+#ifdef __GNUC__
+int __io_putchar(int ch)
+#else
+int fputc(int ch, FILE *f)
+#endif /* __GNUC__ */
+{
+ HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xFFFF);
+ return ch;
+}
+/* USER CODE END 4 */
+
+/* USER CODE BEGIN Header_StartDefaultTask */
+void * microros_allocate(size_t size, void * state);
+void microros_deallocate(void * pointer, void * state);
+void * microros_reallocate(void * pointer, size_t size, void * state);
+void * microros_zero_allocate(size_t number_of_elements, size_t size_of_element, void * state);
+
+rcl_publisher_t publisher;
+rcl_subscription_t subscriber;
+
+geometry_msgs__msg__Twist msg;
+
+void subscription_callback(const void * msgin)
+{
+ //printf("sub\n");
+
+ const geometry_msgs__msg__Twist * msg = (const geometry_msgs__msg__Twist *)msgin;
+
+ rcl_publish(&publisher, (const void*)msg, NULL);
+}
+
+/**
+ * @brief Function implementing the defaultTask thread.
+ * @param argument: Not used
+ * @retval None
+ */
+/* USER CODE END Header_StartDefaultTask */
+void StartDefaultTask(void *argument)
+{
+ /* init code for LWIP */
+ MX_LWIP_Init();
+ /* USER CODE BEGIN 5 */
+ rcl_allocator_t freeRTOS_allocator = rcutils_get_zero_initialized_allocator();
+ freeRTOS_allocator.allocate = microros_allocate;
+ freeRTOS_allocator.deallocate = microros_deallocate;
+ freeRTOS_allocator.reallocate = microros_reallocate;
+ freeRTOS_allocator.zero_allocate = microros_zero_allocate;
+
+ if (!rcutils_set_default_allocator(&freeRTOS_allocator)) {
+ printf("Error on default allocators (line %d)\n", __LINE__);
+ }
+
+ printf("main start\n");
+
+ // micro-ROS app
+
+ rclc_support_t support;
+ rcl_allocator_t allocator;
+ rcl_node_t node;
+
+ allocator = rcl_get_default_allocator();
+
+ //create init_options
+ rclc_support_init(&support, 0, NULL, &allocator);
+
+ // create node
+ rclc_node_init_default(&node, "cubemx_node", "", &support);
+
+ // create publisher
+ rclc_publisher_init_default(
+ &publisher,
+ &node,
+ ROSIDL_GET_MSG_TYPE_SUPPORT(geometry_msgs, msg, Twist),
+ "to_linux");
+
+ // create subscriber
+ rclc_subscription_init_default(
+ &subscriber,
+ &node,
+ ROSIDL_GET_MSG_TYPE_SUPPORT(geometry_msgs, msg, Twist),
+ "to_stm");
+
+ // Create executor
+ rclc_executor_t executor;
+ rclc_executor_init(&executor, &support.context, 3, &allocator);
+ rclc_executor_add_subscription(&executor, &subscriber, &msg,
+ &subscription_callback, ON_NEW_DATA);
+
+ // TO print this enable FreeRTOS -> USE_STATS_FORMATTING_FUNCTIONS
+
+ // static char ptrTaskList[1000];
+
+ // vTaskList(ptrTaskList);
+ // printf("**********************************");
+ // printf("Task State Prio Stack Num");
+ // printf("**********************************");
+ // printf(ptrTaskList);
+ // printf("**********************************");
+
+
+ for(;;) {
+ rclc_executor_spin_some(&executor, RCL_MS_TO_NS(10));
+ osDelay(1000);
+ }
+ /* USER CODE END 5 */
+}
+
+/**
+ * @brief Period elapsed callback in non blocking mode
+ * @note This function is called when TIM14 interrupt took place, inside
+ * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
+ * a global variable "uwTick" used as application time base.
+ * @param htim : TIM handle
+ * @retval None
+ */
+void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
+{
+ /* USER CODE BEGIN Callback 0 */
+
+ /* USER CODE END Callback 0 */
+ if (htim->Instance == TIM14) {
+ HAL_IncTick();
+ }
+ /* USER CODE BEGIN Callback 1 */
+
+ /* USER CODE END Callback 1 */
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ /* USER CODE BEGIN Error_Handler_Debug */
+ /* User can add his own implementation to report the HAL error return state */
+ __disable_irq();
+ while (1)
+ {
+ }
+ /* USER CODE END Error_Handler_Debug */
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/micro-ros-stm32_embeddedrtps/main_uint16.c b/micro-ros-stm32_embeddedrtps/main_uint16.c
index 2a7013a..36f8894 100644
--- a/micro-ros-stm32_embeddedrtps/main_uint16.c
+++ b/micro-ros-stm32_embeddedrtps/main_uint16.c
@@ -366,7 +366,7 @@ std_msgs__msg__UInt16 msg;
void subscription_callback(const void * msgin)
{
- printf("sub\n");
+ //printf("sub\n");
const std_msgs__msg__UInt16 * msg = (const std_msgs__msg__UInt16 *)msgin;
@@ -394,7 +394,7 @@ void StartDefaultTask(void *argument)
printf("Error on default allocators (line %d)\n", __LINE__);
}
- printf("main\n");
+ printf("main start\n");
// micro-ROS app
@@ -444,7 +444,7 @@ void StartDefaultTask(void *argument)
for(;;) {
rclc_executor_spin_some(&executor, RCL_MS_TO_NS(10));
- osDelay(portTICK_RATE_MS*1000);
+ osDelay(1000);
}
/* USER CODE END 5 */
}
diff --git a/micro-ros-stm32_embeddedrtps/micro-ros_embeddedrtps/Core/Src/main.c b/micro-ros-stm32_embeddedrtps/micro-ros_embeddedrtps/Core/Src/main.c
index 573a333..06a2017 100644
--- a/micro-ros-stm32_embeddedrtps/micro-ros_embeddedrtps/Core/Src/main.c
+++ b/micro-ros-stm32_embeddedrtps/micro-ros_embeddedrtps/Core/Src/main.c
@@ -29,7 +29,7 @@
#include
#include
-#include
+#include
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@@ -362,13 +362,13 @@ void * microros_zero_allocate(size_t number_of_elements, size_t size_of_element,
rcl_publisher_t publisher;
rcl_subscription_t subscriber;
-std_msgs__msg__UInt16 msg;
+geometry_msgs__msg__Twist msg;
void subscription_callback(const void * msgin)
{
//printf("sub\n");
- const std_msgs__msg__UInt16 * msg = (const std_msgs__msg__UInt16 *)msgin;
+ const geometry_msgs__msg__Twist * msg = (const geometry_msgs__msg__Twist *)msgin;
rcl_publish(&publisher, (const void*)msg, NULL);
}
@@ -394,7 +394,7 @@ void StartDefaultTask(void *argument)
printf("Error on default allocators (line %d)\n", __LINE__);
}
- printf("main\r\n");
+ printf("main start\n");
// micro-ROS app
@@ -414,14 +414,14 @@ void StartDefaultTask(void *argument)
rclc_publisher_init_default(
&publisher,
&node,
- ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, UInt16),
+ ROSIDL_GET_MSG_TYPE_SUPPORT(geometry_msgs, msg, Twist),
"to_linux");
// create subscriber
rclc_subscription_init_default(
&subscriber,
&node,
- ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, UInt16),
+ ROSIDL_GET_MSG_TYPE_SUPPORT(geometry_msgs, msg, Twist),
"to_stm");
// Create executor
@@ -444,7 +444,7 @@ void StartDefaultTask(void *argument)
for(;;) {
rclc_executor_spin_some(&executor, RCL_MS_TO_NS(10));
- osDelay(portTICK_RATE_MS*1000);
+ osDelay(1000);
}
/* USER CODE END 5 */
}