Цитата(ViKo @ Feb 29 2012, 18:54)

Допустим, TC вот-вот переполнится. Мы запоминаем его значение в переменной tmr, и потом ждем на время, пока (TC - tmr) < val. Когда TC переходит в 0, (TC - tmr) превращается в большое число, и ваша функция рапортует о таймауте, которого на самом деле еще нет.
А для STM32 с 16-битовыми счетчиками это еще более вероятно.
Нужно проверять на равенство, а не на превышение. Но в этом случае нельзя проскочить это равенство, значит, нельзя проверять изредка. То есть, не получится, к примеру, задать несколько задержек на одном таймере, и проверять их по мере необходимости.
Нормально там всё.
Допустим, мы хотим проспать 20 тактов (val).
1. Засекаем время начала ожидания: tmr = TMR;
2. Потом начинаем в цикле (или изредка, как угодно) вычислять
беззнаковую разность TMR-tmr, которая будет монотонно расти от 0 до 0xFFFF (в случае 16-битного таймера), и сравнивать её с val.
3. Как только значение разности станет больше чем val - готово.
Главное - не прозевать 0xFFFF тиков таймера
Если бы я знал, что такое электричество...