@@ -24,27 +24,26 @@ TIM_HandleTypeDef htim24;
2424void (*TimerDomain::callbacks[TimerDomain::max_instances])(void *) = {nullptr };
2525void * TimerDomain::callback_data[TimerDomain::max_instances] = {nullptr };
2626
27- TimerDomain::InputCaptureInfo input_capture_info_dummy = {
28- .channel_rising = 0xFF , // any value that isn't possible here
29- .channel_falling = 0xFF , // any value that isn't possible here
30- };
31-
32- TimerDomain::InputCaptureInfo* TimerDomain::input_capture_info[max_instances]
33- [input_capture_channels] = {
34- {&input_capture_info_dummy}
35- };
36- TimerDomain::InputCaptureInfo TimerDomain::input_capture_info_backing[max_instances]
37- [input_capture_channels];
27+ ST_LIB ::InputCaptureInfo* TimerDomain::input_capture_info[max_instances][input_capture_channels];
28+ ST_LIB ::InputCaptureInfo TimerDomain::input_capture_info_backing[max_instances]
29+ [input_capture_channels];
3830
3931static void TIM_IC_CaptureCallback (const uint32_t timer_idx, uint32_t channel) {
4032 TIM_HandleTypeDef* htim = TimerDomain::hal_handles[timer_idx];
4133
42- TimerDomain::InputCaptureInfo* info = TimerDomain::input_capture_info[timer_idx][channel];
34+ ST_LIB ::InputCaptureInfo* info = TimerDomain::input_capture_info[timer_idx][channel];
35+ uint32_t current = (*(((volatile uint32_t *)&htim->Instance ->CCR1 ) + channel));
4336 if (info->channel_rising == channel) {
4437 // NOTE: CCR1 - CCR4 are contiguous
4538 // NOTE: CCxIF flag is cleared by software by reading the captured data in CCRx
46- uint32_t current = (*(((volatile uint32_t *)&htim->Instance ->CCR1 ) + channel));
47- uint32_t period = current - info->value_rising ;
39+ uint32_t period;
40+ if (current >= info->value_rising ) {
41+ period = current - info->value_rising ;
42+ } else {
43+ // counter wrap around
44+ uint32_t max_count = htim->Instance ->ARR - 1 ;
45+ period = (current + max_count) - info->value_rising ;
46+ }
4847
4948 if ((period != 0 ) && (info->value_falling < period)) {
5049 uint32_t ref_clock =
@@ -55,8 +54,14 @@ static void TIM_IC_CaptureCallback(const uint32_t timer_idx, uint32_t channel) {
5554 }
5655 info->value_rising = current;
5756 } else if (info->channel_falling == channel) {
58- uint32_t falling_value =
59- *(((volatile uint32_t *)&htim->Instance ->CCR1 ) + channel) - info->value_rising ;
57+ uint32_t falling_value;
58+ if (current >= info->value_rising ) {
59+ falling_value = current - info->value_rising ;
60+ } else {
61+ uint32_t max_count = htim->Instance ->ARR - 1 ;
62+ falling_value = (current + max_count) - info->value_rising ;
63+ }
64+
6065 if (falling_value < info->period )
6166 info->value_falling = falling_value;
6267 } else [[unlikely]] {
0 commit comments