Написал функцию задержки на базовом таймере.
В одной программе работает отлично, но вызывается правда постоянно с одним и тем же значением. В другой то ли работает криво, то ли не работает вообще:
Код
#define APB1_FREQ 24000000
void delay_ms (uint16_t volatile ms) {
TIM7->CR1 &= ~0xFF; // Сбрасываем регистр управления таймера TIM7
if (ms != 1) { // Если значение задержки НЕ равно 1,
TIM7->PSC = APB1_FREQ/1000-1; // настраиваем таймер TIM7 на период 1 мс,
TIM7->ARR = ms-1; // установить конечное значение счёта с учетом импульса переполнения;
} else { // иначе,
TIM7->PSC = 2*APB1_FREQ/1000-1; // настраиваем таймер TIM7 на период в 2 раза меньше - 0,5 мс
TIM7->ARR = 1; } // установить конечное значение счёта на 1 с учетом импульса переполнения
TIM7->CR1 |= (TIM_CR1_OPM | TIM_CR1_CEN); // Установить режим "одного импульса" и включить таймер TIM7
while(!(TIM7->SR & TIM_SR_UIF)); // Дождаться конца задержки
TIM7->SR &= ~TIM_SR_UIF; // Сбросить флаг прерывания
};
Не пойму почему не выдерживается задержка?
ЗЫ. Таймер тактирован в основной программе:
Код
RCC->APB1ENR |= RCC_APB1ENR_TIM7EN; // Тактируем базовый таймер TIM7