2024-03-11 02:13 AM
Hi,
my app works fine when I use the internal clock but if I switch to external clock I obtain HAL_TIMEOUT from function HAL_RCC_OscConfig().
The external clock board schematic is:
Clock configuration is:
The main.c is:
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "crc.h"
#include "dma.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/**************************************
* Includes *
**************************************/
#include <stdio.h>
#include <string.h>
#include "Core_interface.h"
#include "AlertsManager_interface.h"
#include "AntennaGainControl_interface.h"
#include "SerialBusManager_interface.h"
#ifdef DEBUG
#include "SerialConsoleManager_interface.h"
#endif /* DEBUG */
/* 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 ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/**************************************
* Global variables *
**************************************/
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* 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_DMA_Init();
MX_USART2_UART_Init();
MX_TIM6_Init();
MX_ADC1_Init();
MX_TIM14_Init();
MX_USART1_UART_Init();
MX_CRC_Init();
MX_TIM3_Init();
MX_TIM7_Init();
/* USER CODE BEGIN 2 */
HAL_UART_MspInit(&huart1);
HAL_UART_MspInit(&huart2);
HAL_TIM_Base_Start_IT(&htim6);
HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim14, TIM_CHANNEL_1);
HAL_TIM_Base_Start(&htim14);
HAL_TIM_Base_Start_IT(&htim7);
__HAL_RCC_CRC_CLK_ENABLE();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
/* Turn led on */
HAL_GPIO_WritePin( LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
coreSetBarrierNumber( 1 );
coreSetDeviceNumber( 6 );
#ifdef DEBUG
serialConsoleManagerInit();
#endif
serialBusManagerInit();
antennaGainControlManagerInit();
/* Init timer 6 for undetected synch-in */
TIM6->CNT = 0;
TIM6->ARR = coreGetSensorSynchInArrivalTimeout();
while (1)
{
/* Manage antenna gain control */
antennaGainControlManagerRun();
/* Manage RS485 serial communication */
serialBusManagerRun();
#ifdef DEBUG
/* Manage debug serial communication */
serialConsoleManagerRun();
#endif /* DEBUG */
}
/* 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};
/** Configure the main internal regulator output voltage
*/
HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
/** 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 = RCC_PLLM_DIV1;
RCC_OscInitStruct.PLL.PLLN = 16;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
int err = 0;
if ((err=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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/* 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 */
/* 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 */
I don't understand what is going on, please anybody can help ?
Solved! Go to Solution.
2024-03-11 05:33 AM - edited 2024-03-11 05:33 AM
@Beppe101 You showed in your schematics that you are using a crystal connected to OSC_IN and OSC_OUT, right?
Then you configure the HSE to BYPASS Clock Source, which does not expect a crystal, but an external oscillator connected to OSC_IN.
So if you want to work with a crystal at OSC_IN/OSC_OUT, you have to set the HSE option to Crystal/Ceramic Resonator, as @Sarra.S already wrote.
Regards
/Peter
2024-03-11 02:32 AM
Hello @Beppe101,
This is likely caused by misconfiguring the HSE clock, if HSE is selected as the clock source in the clock configuration, under the Pinout & Configuration tab select crystal/ceramic Resonator in the high-speed clock (HSE).
if you're supplying your clock to the MCU's RCC_OSC_IN pin, then select the BYPASS Clock Source option.
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
2024-03-11 03:06 AM
Hi Sarra,
thanks for your answer, as shown in picture above I selected BYPASS_Clock_Source but this does not work as expected.
What could be the reason for issue ?
2024-03-11 05:33 AM - edited 2024-03-11 05:33 AM
@Beppe101 You showed in your schematics that you are using a crystal connected to OSC_IN and OSC_OUT, right?
Then you configure the HSE to BYPASS Clock Source, which does not expect a crystal, but an external oscillator connected to OSC_IN.
So if you want to work with a crystal at OSC_IN/OSC_OUT, you have to set the HSE option to Crystal/Ceramic Resonator, as @Sarra.S already wrote.
Regards
/Peter
2024-03-11 07:04 AM
Problem is solved by answers above, but just so you know what's going on inside the STM32:
- BYPASS mode assumes that you feed the clock input from an active oscillator to only one pin (attention, must be the one called Pxy_OSC_IN), usually having a push-pull output and delivering (something close to a) square wave with a voltage swing from 0V to VCC.
- the other mode called Crystal/Ceramic Resonator assumes you connect a passive crystal / quartz with the caps - as you did - which uses both pins, because internally the STM32 has its own oscillator circuit, exiting and working with the low power and small amplitude crystal.