cancel
Showing results for 
Search instead for 
Did you mean: 

stm32f103ret6 USART1 cannot send or receive on Creality v4.2.7 3d printer board

PMeno.1
Associate II

I am trying to port my Arduino Mega 3d printer firmware to stm32f103ret6 ( Creality v4.2.7 3d printer board).

For the momment i am trying to test simple tasks like turn on a pin or send via USART1. The board has a ch340g serial to usb converter so things should be easy.

This board comes with bootloader pre-installed in order to upload compiled fw from SD slot so i have set an offset of 28K(hope this is enough) at the STM32Cube IDE, the linker file: https://github.com/3DHexfw/3DHex/blob/master/MCU/Creality/Creality_v4.2.7_Silent/STM32F103RETX_FLASH.ld

In the next line you can find the sample code where i am trying to send over USART1 but with no luck: https://github.com/3DHexfw/3DHex/blob/master/MCU/Creality/Creality_v4.2.7_Silent/Core/Src/main.c

Any suggestions?

2 REPLIES 2
TDK
Guru

> i have set an offset of 28K(hope this is enough)

The offset isn't arbitrary, it's fixed in the bootloader and you'll need to put in the offset the bootloader is expecting.

Write firmware to toggle a pin first and verify that you're actually able to update the firmware on the thing successfully.

If you feel a post has answered your question, please click "Accept as Solution".

I get it to work, both led blink and HAL_UART_Transmit(...).

First of all i used the same offset(for the bootloader) as marlin 3d printer firmware for the creality board(in my code instead of ROM it is FLASH): https://github.com/MarlinFirmware/Marlin/blob/2.0.x/buildroot/share/PlatformIO/ldscripts/creality.ld

At the beggining i was't even able to tongle the pin, finaly i had to make some changes to clock configuration and everything worked:

0693W00000GWt3mQAD.png 

One more issue i am facing is that the HAL_Delay() is blocking that is why i could not send in the while loop. Still not able to solve this but i used another way. Below you can find the source:

/* USER CODE BEGIN Header */

/**

 ******************************************************************************

 * @file      : main.c

 * @brief     : Main program body

 ******************************************************************************

 * @attention

 *

 * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.

 * All rights reserved.</center></h2>

 *

 * 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"

UART_HandleTypeDef huart1;

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_USART1_UART_Init(void);

int main(void)

{

 HAL_Init();

 SystemClock_Config();

 MX_GPIO_Init();

 MX_USART1_UART_Init();

 /* USER CODE BEGIN 2 */

 int i=0;

 //int j=0;

 int count = (50000 * 72) / 4;

 /* USER CODE END 2 */

 /* Infinite loop */

 /* USER CODE BEGIN WHILE */

 while (1)

 {

while (i < count) {

   count--;

   i++;

}

count = (50000 * 72) / 4;

i=0;

   HAL_UART_Transmit(&huart1, (uint8_t*)"H\n", 2, 100);

 }

}

/**

 * @brief System Clock Configuration

 * @retval None

 */

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 /** 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_ON;

 RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;

 RCC_OscInitStruct.HSIState = RCC_HSI_ON;

 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

 RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != 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_2) != HAL_OK)

 {

  Error_Handler();

 }

}

/**

 * @brief USART1 Initialization Function

 * @param None

 * @retval None

 */

static void MX_USART1_UART_Init(void)

{

 /* USER CODE BEGIN USART1_Init 0 */

 /* USER CODE END USART1_Init 0 */

 /* USER CODE BEGIN USART1_Init 1 */

 /* USER CODE END USART1_Init 1 */

 huart1.Instance = USART1;

 huart1.Init.BaudRate = 115200;

 huart1.Init.WordLength = UART_WORDLENGTH_8B;

 huart1.Init.StopBits = UART_STOPBITS_1;

 huart1.Init.Parity = UART_PARITY_NONE;

 huart1.Init.Mode = UART_MODE_TX_RX;

 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

 huart1.Init.OverSampling = UART_OVERSAMPLING_16;

 if (HAL_UART_Init(&huart1) != HAL_OK)

 {

  Error_Handler();

 }

 /* USER CODE BEGIN USART1_Init 2 */

 /* USER CODE END USART1_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_GPIOD_CLK_ENABLE();

 __HAL_RCC_GPIOB_CLK_ENABLE();

 __HAL_RCC_GPIOA_CLK_ENABLE();

 /*Configure GPIO pin Output Level */

 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);

 /*Configure GPIO pin : PB12 */

 GPIO_InitStruct.Pin = GPIO_PIN_12;

 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);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**

 * @brief This function is executed in case of error occurrence.

 * @retval None

 */

void Error_Handler(void)

{

 /* USER CODE BEGIN Error_Handler_Debug */

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, 1);

 /* 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****/

And here is a screenshot from termite:

0693W00000GWt4aQAD.png