Skip to main content
Associate
March 1, 2024
Question

Nucleo-STM32H563ZI RTC SSR Value Jump Back

  • March 1, 2024
  • 2 replies
  • 1726 views

I am programming a Nucleo-STM32H563ZI and get a problem while trying to get subseconds value in RTC.

Below is the main code:

 

 

 

 

 unsigned prev_ssr = 0;
 char print_buf[32] = { 0 };
 unsigned this_ssr;
 int count;
 while (1)
 {
	 this_ssr = READ_REG(RTC->SSR);
	 if (this_ssr != prev_ssr) {
		 count = sprintf(print_buf, "%05u-->%05u\n", prev_ssr, this_ssr);
		 HAL_UART_Transmit(&huart3, (uint8_t const*)print_buf, count, 10);
		 prev_ssr = this_ssr;
	 }
 }

 

 

 

 

SSR SynchPrediv is 255 as default. It takes about 3.9ms to decrease by 1.

UART baudrate is 115200. It takes about 1.2ms to send a data package which has 14 bytes.

So this program could catch every normal change of SSR value. And the UART output data verify this.

But in the UART output data, I found some lines like this:

00030-->00029
00029-->00028
00028-->00031
00031-->00027
00027-->00026
00026-->00025

That tells us the SSR value would jump back sometimes.

And it happens about 3 or 4 times per second! I don't know whether some jumps escape.

The jump back value is always 3 (31-8= 3).

Do I take some mistake in STM32CubeIDE project or my code?

This topic has been closed for replies.

2 replies

Peter BENSCH
ST Technical Moderator
March 1, 2024

Welcome @floatsky, to the community!

You are reading a shadow register. Your problem has already been discussed e.g. here, probably that will help you too?

Regards
/Peter

In order 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.
floatskyAuthor
Associate
March 4, 2024

@Peter BENSCHThanks for attention.

I read the topic you mentioned. I get the knowledge that CR.BYPSHAD and ICSR.RSF work together to synchronize the 3 registers: SSR, TR, DR. Thank you for your information.

The problem in that topic looks like the same with mine. But they are not.

In my program, I read only one register, SSR, not all of the 3.

I modify my program as below:

1. Verify that BYPSHAD is 0, which is default.

2. Clear RSF and wait until it's set again by RTC hardware.

3. Read the 3 registers in the order of SSR, TR, DR.

 /* USER CODE BEGIN WHILE */
	unsigned prev_ssr = 0;
	unsigned this_ssr, tick, tr, dr;
	int count;
	char print_buf[32] = { 0 };
	while (1) {
		/* Unlock write protection */
		WRITE_REG(RTC->WPR, 0xCA);
		WRITE_REG(RTC->WPR, 0x53);
		/* Clear Registers Synchronization Flag(RSF) */
		CLEAR_BIT(RTC->ICSR, (1U << 5));
		/* Reactivate write protection */
		WRITE_REG(RTC->WPR, 0x11);
		/* Wait for hardware setting RSF to 1 */
		while ((READ_REG(RTC->ICSR) & (1U << 5)) == 0)
			;
		/* Read all 3 registers. */
		this_ssr = READ_REG(RTC->SSR);
		tr = READ_REG(RTC->TR);
		dr = READ_REG(RTC->DR);

		tick = HAL_GetTick();
		if (this_ssr != prev_ssr) {
			count = sprintf(print_buf, "%05u:%08u\n", this_ssr, tick);
			HAL_UART_Transmit(&huart3, (uint8_t const*) print_buf, count, 10);
			prev_ssr = this_ssr;
		}
 /* USER CODE END WHILE */

 /* USER CODE BEGIN 3 */
	}
 /* USER CODE END 3 */

But the result does not change. I'm not sure I've wrote the right code. If there is something wrong in it, please let me know.

 

I also try another way: set BYPSHAD to 1:

 /* USER CODE BEGIN WHILE */
	unsigned prev_ssr = 0;
	unsigned this_ssr, tick;
	int count;
	char print_buf[32] = { 0 };
	/* Unlock write protection */
	WRITE_REG(RTC->WPR, 0xCA);
	WRITE_REG(RTC->WPR, 0x53);
	/* Set BYPSHAD to 1 */
	SET_BIT(RTC->CR, (1U << 5));
	/* Reactivate write protection */
	WRITE_REG(RTC->WPR, 0x11);
	while (1) {
		this_ssr = READ_REG(RTC->SSR);
		tick = HAL_GetTick();
		if (this_ssr != prev_ssr) {
			count = sprintf(print_buf, "%05u:%08u\n", this_ssr, tick);
			HAL_UART_Transmit(&huart3, (uint8_t const*) print_buf, count, 10);
			prev_ssr = this_ssr;
		}
 /* USER CODE END WHILE */

 /* USER CODE BEGIN 3 */
	}
 /* USER CODE END 3 */

Jumps much fewer than that while BYPSHAD equals 0. But in idea, there should be none. And indeed there's none in Nucleo-F030R8 and STM32F746G-DISCO.

 

I wrote a python script to assist analyzing serial output.

import re
from serial import Serial
from sys import stderr

# Usage:
# 1. Give a correct serial port name to the variable "port" below.
# 2. Plug development board to PC.
# 3. Debug the program using your prefer IDE. Pause at the entry main function.
# 3. Run this script. Wait until it output "Let's go!" to console.
# 4. Resume the program and keep it running.

pattern = re.compile(r'(\d+):(\d+)')
port = '/dev/ttyACM0'
serial = Serial(port, baudrate=115200, timeout=1)
count = 10000
prev_ssr = 0
summer = dict()
total = 0
log = open('SSR.log', 'w')
# skip garbage data
while serial.read_until(b'\n') != b'':
 pass
print("Let's go!")
serial.timeout = None
for i in range(count):
 line = serial.read_until(b'\n').decode().strip()
 log.write(f'{i:05}:{line}\n')
 match = re.match(pattern, line)
 if not match:
 print(f'Corrupted data line:[{line}]', file=stderr)
 break
 ssr_s, tick_s = match.groups()
 ssr = int(ssr_s)
 if ssr != prev_ssr:
 diff = prev_ssr - ssr
 if diff == 1 or (prev_ssr == 0 and ssr == 255):
 pass
 else:
 total += 1
 summer[diff] = summer.get(diff, 0) + 1
 message = f'NO.{total:05} Jump. Prev: {prev_ssr:05}, Curr: {ssr:05}, Diff: {diff:05}, Line: {i:05}'
 print(message, file=stderr)
 prev_ssr = ssr
 else:
 message = f'Same value neighbors, at line {i:05}'
 print(message, file=stderr)

log.close()
serial.close()

print(f'Total jumps: {total}.')
print(summer)

And I find that I make a mistake in my first post: the jump back value is not always 3. Most of them are 3, not all.

 

Below is the main source code.

/* USER CODE BEGIN Header */
/**
 ******************************************************************************
 * @file : main.c
 * @brief : Main program body
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2024 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"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* 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 ---------------------------------------------------------*/

DCACHE_HandleTypeDef hdcache1;

RTC_HandleTypeDef hrtc;

UART_HandleTypeDef huart3;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ICACHE_Init(void);
static void MX_RTC_Init(void);
static void MX_USART3_UART_Init(void);
static void MX_DCACHE1_Init(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_ICACHE_Init();
 MX_RTC_Init();
 MX_USART3_UART_Init();
 MX_DCACHE1_Init();
 /* USER CODE BEGIN 2 */

 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
	unsigned prev_ssr = 0;
	unsigned this_ssr, tick, tr, dr;
	int count;
	char print_buf[32] = { 0 };
	while (1) {
		/* Unlock write protection */
		WRITE_REG(RTC->WPR, 0xCA);
		WRITE_REG(RTC->WPR, 0x53);
		/* Clear Registers Synchronization Flag(RSF) */
		CLEAR_BIT(RTC->ICSR, (1U << 5));
		/* Reactivate write protection */
		WRITE_REG(RTC->WPR, 0x11);
		/* Wait for hardware setting RSF to 1 */
		while ((READ_REG(RTC->ICSR) & (1U << 5)) == 0)
			;
		/* Read all 3 registers. */
		this_ssr = READ_REG(RTC->SSR);
		tr = READ_REG(RTC->TR);
		dr = READ_REG(RTC->DR);

		tick = HAL_GetTick();
		if (this_ssr != prev_ssr) {
			count = sprintf(print_buf, "%05u:%08u\n", this_ssr, tick);
			HAL_UART_Transmit(&huart3, (uint8_t const*) print_buf, count, 10);
			prev_ssr = this_ssr;
		}
 /* 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_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);

 while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

 /** Configure LSE Drive Capability
 */
 HAL_PWR_EnableBkUpAccess();
 __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);

 /** Initializes the RCC Oscillators according to the specified parameters
 * in the RCC_OscInitTypeDef structure.
 */
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_CSI;
 RCC_OscInitStruct.LSEState = RCC_LSE_ON;
 RCC_OscInitStruct.CSIState = RCC_CSI_ON;
 RCC_OscInitStruct.CSICalibrationValue = RCC_CSICALIBRATION_DEFAULT;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLL1_SOURCE_CSI;
 RCC_OscInitStruct.PLL.PLLM = 1;
 RCC_OscInitStruct.PLL.PLLN = 125;
 RCC_OscInitStruct.PLL.PLLP = 2;
 RCC_OscInitStruct.PLL.PLLQ = 2;
 RCC_OscInitStruct.PLL.PLLR = 2;
 RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1_VCIRANGE_2;
 RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1_VCORANGE_WIDE;
 RCC_OscInitStruct.PLL.PLLFRACN = 0;
 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_CLOCKTYPE_PCLK3;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
 {
 Error_Handler();
 }
}

/**
 * @brief DCACHE1 Initialization Function
 * @param None
 * @retval None
 */
static void MX_DCACHE1_Init(void)
{

 /* USER CODE BEGIN DCACHE1_Init 0 */

 /* USER CODE END DCACHE1_Init 0 */

 /* USER CODE BEGIN DCACHE1_Init 1 */

 /* USER CODE END DCACHE1_Init 1 */
 hdcache1.Instance = DCACHE1;
 hdcache1.Init.ReadBurstType = DCACHE_READ_BURST_WRAP;
 if (HAL_DCACHE_Init(&hdcache1) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN DCACHE1_Init 2 */

 /* USER CODE END DCACHE1_Init 2 */

}

/**
 * @brief ICACHE Initialization Function
 * @param None
 * @retval None
 */
static void MX_ICACHE_Init(void)
{

 /* USER CODE BEGIN ICACHE_Init 0 */

 /* USER CODE END ICACHE_Init 0 */

 ICACHE_RegionConfigTypeDef pRegionConfig = {0};

 /* USER CODE BEGIN ICACHE_Init 1 */

 /* USER CODE END ICACHE_Init 1 */

 /** Configure and enable region 0 for memory remapping
 */
 pRegionConfig.BaseAddress = 0x10000000;
 pRegionConfig.RemapAddress = 0x60000000;
 pRegionConfig.Size = ICACHE_REGIONSIZE_2MB;
 pRegionConfig.TrafficRoute = ICACHE_MASTER1_PORT;
 pRegionConfig.OutputBurstType = ICACHE_OUTPUT_BURST_WRAP;
 if (HAL_ICACHE_EnableRemapRegion(_NULL, &pRegionConfig) != HAL_OK)
 {
 Error_Handler();
 }

 /** Enable instruction cache in 1-way (direct mapped cache)
 */
 if (HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_ICACHE_Enable() != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN ICACHE_Init 2 */

 /* USER CODE END ICACHE_Init 2 */

}

/**
 * @brief RTC Initialization Function
 * @param None
 * @retval None
 */
static void MX_RTC_Init(void)
{

 /* USER CODE BEGIN RTC_Init 0 */

 /* USER CODE END RTC_Init 0 */

 RTC_PrivilegeStateTypeDef privilegeState = {0};
 RTC_TimeTypeDef sTime = {0};
 RTC_DateTypeDef sDate = {0};

 /* USER CODE BEGIN RTC_Init 1 */

 /* USER CODE END RTC_Init 1 */

 /** Initialize RTC Only
 */
 hrtc.Instance = RTC;
 hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
 hrtc.Init.AsynchPrediv = 127;
 hrtc.Init.SynchPrediv = 255;
 hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
 hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
 hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
 hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
 hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
 hrtc.Init.BinMode = RTC_BINARY_NONE;
 if (HAL_RTC_Init(&hrtc) != HAL_OK)
 {
 Error_Handler();
 }
 privilegeState.rtcPrivilegeFull = RTC_PRIVILEGE_FULL_NO;
 privilegeState.backupRegisterPrivZone = RTC_PRIVILEGE_BKUP_ZONE_NONE;
 privilegeState.backupRegisterStartZone2 = RTC_BKP_DR0;
 privilegeState.backupRegisterStartZone3 = RTC_BKP_DR0;
 if (HAL_RTCEx_PrivilegeModeSet(&hrtc, &privilegeState) != HAL_OK)
 {
 Error_Handler();
 }

 /* USER CODE BEGIN Check_RTC_BKUP */

 /* USER CODE END Check_RTC_BKUP */

 /** Initialize RTC and set the Time and Date
 */
 sTime.Hours = 12;
 sTime.Minutes = 34;
 sTime.Seconds = 56;
 sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
 sTime.StoreOperation = RTC_STOREOPERATION_RESET;
 if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
 {
 Error_Handler();
 }
 sDate.WeekDay = RTC_WEEKDAY_SUNDAY;
 sDate.Month = RTC_MONTH_FEBRUARY;
 sDate.Date = 29;
 sDate.Year = 24;

 if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN RTC_Init 2 */

 /* USER CODE END RTC_Init 2 */

}

/**
 * @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.Init.ClockPrescaler = UART_PRESCALER_DIV1;
 huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
 if (HAL_UART_Init(&huart3) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_UARTEx_SetTxFifoThreshold(&huart3, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_UARTEx_SetRxFifoThreshold(&huart3, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_UARTEx_DisableFifoMode(&huart3) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN USART3_Init 2 */

 /* USER CODE END USART3_Init 2 */

}

/**
 * @brief GPIO Initialization Function
 * @param None
 * @retval None
 */
static void MX_GPIO_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

 /* GPIO Ports Clock Enable */
 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOF_CLK_ENABLE();
 __HAL_RCC_GPIOB_CLK_ENABLE();
 __HAL_RCC_GPIOD_CLK_ENABLE();
 __HAL_RCC_GPIOG_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();

 /*Configure GPIO pin Output Level */
 HAL_GPIO_WritePin(YELLOW_GPIO_Port, YELLOW_Pin, GPIO_PIN_RESET);

 /*Configure GPIO pin Output Level */
 HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, GPIO_PIN_RESET);

 /*Configure GPIO pin Output Level */
 HAL_GPIO_WritePin(RED_GPIO_Port, RED_Pin, GPIO_PIN_RESET);

 /*Configure GPIO pin : Button_Pin */
 GPIO_InitStruct.Pin = Button_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(Button_GPIO_Port, &GPIO_InitStruct);

 /*Configure GPIO pin : YELLOW_Pin */
 GPIO_InitStruct.Pin = YELLOW_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(YELLOW_GPIO_Port, &GPIO_InitStruct);

 /*Configure GPIO pin : GREEN_Pin */
 GPIO_InitStruct.Pin = GREEN_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(GREEN_GPIO_Port, &GPIO_InitStruct);

 /*Configure GPIO pin : RED_Pin */
 GPIO_InitStruct.Pin = RED_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(RED_GPIO_Port, &GPIO_InitStruct);

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}

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

 

Appreciate for any help.