mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			STM32 LPT optimisation
							parent
							
								
									7be79f93fe
								
							
						
					
					
						commit
						9fb865ae57
					
				| 
						 | 
					@ -292,15 +292,8 @@ void lp_ticker_init(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t lp_ticker_read(void)
 | 
					uint32_t lp_ticker_read(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    uint32_t usecs = 0;
 | 
					    uint32_t usecs = rtc_read_us();
 | 
				
			||||||
    time_t time = 0;
 | 
					    return usecs;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    do {
 | 
					 | 
				
			||||||
        time = rtc_read();
 | 
					 | 
				
			||||||
        usecs = rtc_read_subseconds();
 | 
					 | 
				
			||||||
    } while (time != rtc_read());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return (time * 1000000) + usecs;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void lp_ticker_set_interrupt(timestamp_t timestamp)
 | 
					void lp_ticker_set_interrupt(timestamp_t timestamp)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,8 +36,12 @@
 | 
				
			||||||
static RTC_HandleTypeDef RtcHandle;
 | 
					static RTC_HandleTypeDef RtcHandle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if DEVICE_LOWPOWERTIMER && !MBED_CONF_TARGET_LOWPOWERTIMER_LPTIM
 | 
					#if DEVICE_LOWPOWERTIMER && !MBED_CONF_TARGET_LOWPOWERTIMER_LPTIM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GET_TICK_PERIOD(VALUE) (2048 * 1000000 / VALUE) /* 1s / SynchPrediv value * 2^11 (value to get the maximum precision value with no u32 overflow) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void (*irq_handler)(void);
 | 
					static void (*irq_handler)(void);
 | 
				
			||||||
static void RTC_IRQHandler(void);
 | 
					static void RTC_IRQHandler(void);
 | 
				
			||||||
 | 
					static uint32_t lp_TickPeriod_us = GET_TICK_PERIOD(4095); /* default SynchPrediv value = 4095 */
 | 
				
			||||||
#endif /* DEVICE_LOWPOWERTIMER && !MBED_CONF_TARGET_LOWPOWERTIMER_LPTIM */
 | 
					#endif /* DEVICE_LOWPOWERTIMER && !MBED_CONF_TARGET_LOWPOWERTIMER_LPTIM */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void rtc_init(void)
 | 
					void rtc_init(void)
 | 
				
			||||||
| 
						 | 
					@ -123,6 +127,10 @@ void rtc_init(void)
 | 
				
			||||||
    RtcHandle.Init.OutPutType     = RTC_OUTPUT_TYPE_OPENDRAIN;
 | 
					    RtcHandle.Init.OutPutType     = RTC_OUTPUT_TYPE_OPENDRAIN;
 | 
				
			||||||
#endif /* TARGET_STM32F1 */
 | 
					#endif /* TARGET_STM32F1 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if DEVICE_LOWPOWERTIMER && !MBED_CONF_TARGET_LOWPOWERTIMER_LPTIM
 | 
				
			||||||
 | 
					    lp_TickPeriod_us = GET_TICK_PERIOD(RtcHandle.Init.SynchPrediv);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (HAL_RTC_Init(&RtcHandle) != HAL_OK) {
 | 
					    if (HAL_RTC_Init(&RtcHandle) != HAL_OK) {
 | 
				
			||||||
        error("RTC initialization failed");
 | 
					        error("RTC initialization failed");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -309,9 +317,27 @@ static void RTC_IRQHandler(void)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t rtc_read_subseconds(void)
 | 
					uint32_t rtc_read_us(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return 1000000.f * ((double)((RTC->PRER & RTC_PRER_PREDIV_S) - RTC->SSR) / ((RTC->PRER & RTC_PRER_PREDIV_S) + 1));
 | 
					    RTC_TimeTypeDef timeStruct = {0};
 | 
				
			||||||
 | 
					    RTC_DateTypeDef dateStruct = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    RtcHandle.Instance = RTC;
 | 
				
			||||||
 | 
					    HAL_RTC_GetTime(&RtcHandle, &timeStruct, RTC_FORMAT_BIN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Reading RTC current time locks the values in calendar shadow registers until Current date is read
 | 
				
			||||||
 | 
					    to ensure consistency between the time and date values */
 | 
				
			||||||
 | 
					    HAL_RTC_GetDate(&RtcHandle, &dateStruct, RTC_FORMAT_BIN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (timeStruct.SubSeconds > timeStruct.SecondFraction) {
 | 
				
			||||||
 | 
					        /* SS can be larger than PREDIV_S only after a shift operation. In that case, the correct
 | 
				
			||||||
 | 
					           time/date is one second less than as indicated by RTC_TR/RTC_DR. */
 | 
				
			||||||
 | 
					        timeStruct.Seconds -= 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    uint32_t RTCTime = timeStruct.Seconds + timeStruct.Minutes * 60 + timeStruct.Hours * 60 * 60;
 | 
				
			||||||
 | 
					    uint32_t Time_us = ((timeStruct.SecondFraction - timeStruct.SubSeconds) * lp_TickPeriod_us) >> 11;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (RTCTime * 1000000) + Time_us ;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void rtc_set_wake_up_timer(uint32_t delta)
 | 
					void rtc_set_wake_up_timer(uint32_t delta)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,11 +51,11 @@ extern "C" {
 | 
				
			||||||
#define RTC_CLOCK LSI_VALUE
 | 
					#define RTC_CLOCK LSI_VALUE
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Read the subsecond register.
 | 
					/** Read RTC time with subsecond precision.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @return The remaining time as microseconds (0-999999)
 | 
					 * @return Time is microsecond
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
uint32_t rtc_read_subseconds(void);
 | 
					uint32_t rtc_read_us(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Program a wake up timer event in delta microseconds.
 | 
					/** Program a wake up timer event in delta microseconds.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue