Доброго всем времени суток!
Работаю на stm32f103ve в keil'е. Хочу сформировать функцию задержки. Особая точность не нужна - в пределах 1мкс вполне достаточно. Делаю так:
Настраиваю таймер:
Код
TIM5->ARR = 0xFFFF;
TIM5->PSC = 71; //72МГцчастота шины/72 = 1Мгц тик таймера
TIM5->CR1 = 0x0001; //Запускаю таймер
В функции задаю значение задержки в ARR и опрашиваю флаг:
Код
void Delay(u16 time)
{
TIM5->CNT = 0x0000;
TIM5->ARR = time-1;
while(!(TIM5->SR & 0x0001))
{
__nop();
}
TIM5->SR&= ~0x0001;
}
Вобщем этот код работает только когда я вставляю его в основной цикл. Проверяю так:
Код
GPIOE->BSRR|= GPIO_Pin_2; //Установить ногу
Delay(10); //Задержка 10мкс.
GPIOE->BRR|= GPIO_Pin_2; //Сбросить ногу
Если я использую этот код в обработчике нажатия кнопки, то пауза куда-то исчезает и вместо положенных 10 мкс на осцилографе наблюдается 1,2мкс.
Есть подозрение, что компилятор каким-то образом оптимизирует код, исключая цикл - другого объяснения у меня нет. Уровень оптимизации - O0 (пробовал O1, O2-результат тот же). Пробовал также объявлять параметр фукции time как volatile - не помогло. Уже ветает шальная мысль написать функцию задержки на asm

Есть ли у кого какие соображения? Может есть директивы компилятора типа:
Код
отключить оптимизацию
...
код
...
включить оптимизацию