Цитата(AHTOXA @ Jun 28 2012, 06:51)

Регистр PSC обновляется только при update event.
(Update event - происходит при переполнении или вручную, взведением бита UG в регистре EGR.)
Новый предделитель не будет установлен, пока не произойдет update event, даже если таймер выключен (CEN=0) ? Т.е. даже если таймер выключен, я все равно должен установить бит UG в регистре EGR, чтобы обновить значение предделителя, правильно?
С учетом вышесказанного код преобразился в следующий:
Код
void delay_ms (uint16_t ms) {
TIM7->PSC = APB1_FREQ/(((ms == 1) ? 2 : 1)*1000)-1; // Настраиваем таймер TIM7 на период 0.5 мс для задержки в 1 мс
// и на период 1 мс для всех остальных значений
TIM7->EGR = TIM_EGR_UG; // Сгенерировать событие для загрузки нового значения предделителя
TIM7->SR &= ~TIM_SR_UIF; // Сбросить флаг прерывания
TIM7->ARR = (ms == 1) ? 1 : (ms-1); // Установить конечное значение счёта с учетом импульса переполнения
TIM7->CR1 = TIM_CR1_OPM | TIM_CR1_CEN; // Установить режим "одного импульса" и включить таймер TIM7
while(!(TIM7->SR & TIM_SR_UIF)); // Дождаться конца задержки
TIM7->SR &= ~TIM_SR_UIF; // Сбросить флаг прерывания
};
Не реализовано только это:
Цитата(sgs @ Jun 28 2012, 07:36)

Есть только один тонкий момент: нельзя запускать таймер сразу после UG. Требуется несколько тактов процессора, чтобы произошла реальная загрузка счетчика. Только после этого заданный интервал отрабатывается правильно. Для этого вполне достаточно оформить загрузку в виде процедуры, а запуск делать вне этой процедуры.
Не пойму что имеется в виду "оформить загрузку в виде процедуры". Сделать загрузку в виду отдельной функции?
Цитата(scifi @ Jun 28 2012, 08:39)

Странный выбор таймера для задержки, если только в образовательных целях.
Для этих целей лучше подходит SysTick, а ещё лучше -
вот этот счётчик циклов процессора (он 32-разрядный, поэтому арифметика с ним простейшая).
Почему странный выбор? Простой таймер - для простой задачи.
Вот это действительно интересно, обязательно попробую с ним разобраться. Жаль есть он только в M3, да и SysTick в M0 может отсутствовать. А это "минус" для переносимости кода.
Кто с этим может подсказать, из ДШ это не совсем ясно:
Цитата(Влад Р. @ Jun 28 2012, 02:45)

Еще одно: правильно ли я понимаю принцип генерации события таймером. Допустим конечное значение счета ARR=3. Таймер будет считать от 0 до 3 и только на 4-м импульсе возникнет переполнение и будет сгенерировано событие? Или событие сгенерируется уже на 3-м?
Иными словами, нужно ли в ARR заносить задержку на один импульс меньше желаемой или это лишнее?
Сообщение отредактировал Влад Р. - Jun 28 2012, 15:26