реклама на сайте
подробности

 
 
> Функция формирования задержки
Sprite
сообщение Feb 15 2012, 15:35
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Доброго всем времени суток!
Работаю на 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 sad.gif Есть ли у кого какие соображения? Может есть директивы компилятора типа:
Код
отключить оптимизацию
...
код
...
включить оптимизацию
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
esaulenka
сообщение Mar 2 2012, 16:39
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Проверил в кейловском симуляторе. Всё нормально работает даже при переходе через 0xffffffff. Как переделать на 16 бит, подумаю.

Дизассемблер "проекта" прикладываю. Исходный код (все 10 строчек) легко восстановить.

CODE

; generated by ARM C/C++ Compiler with , RVCT4.0 [Build 524] for uVision
; commandline ArmCC [--debug -c --asm --interleave -omain.o --depend=main.d --device=DARMP1 --apcs=interwork -O3 -IC:\Keil\ARM\INC\NXP --omf_browse=main.crf main.c]
THUMB

AREA ||.text||, CODE, READONLY, ALIGN=2

main PROC
;;;31
;;;32 int main (void)
000000 b530 PUSH {r4,r5,lr}
;;;33 {
;;;34
;;;35 TIM0->CTCR = 0x00;
000002 2000 MOVS r0,#0
000004 f04f2240 MOV r2,#0x40004000
000008 6710 STR r0,[r2,#0x70]
;;;36 TIM0->TCR = 0x02;
00000a 2102 MOVS r1,#2
00000c 6051 STR r1,[r2,#4]
;;;37 TIM0->PR = 0;
00000e 60d0 STR r0,[r2,#0xc]
;;;38 TIM0->TCR = 0x01;
000010 2001 MOVS r0,#1
000012 6050 STR r0,[r2,#4]
;;;39
;;;40
;;;41 GPIO0->FIODIR ^= 0x01;
000014 4c08 LDR r4,|L1.56|
000016 6820 LDR r0,[r4,#0]
000018 f0800001 EOR r0,r0,#1
00001c 6020 STR r0,[r4,#0]
00001e f2427510 MOV r5,#0x2710
|L1.34|
000022 6891 LDR r1,[r2,#8]
000024 462b MOV r3,r5
|L1.38|
000026 6890 LDR r0,[r2,#8]
000028 1a40 SUBS r0,r0,r1
00002a 4298 CMP r0,r3
00002c d3fb BCC |L1.38|
;;;42
;;;43 while (1)
;;;44 {
;;;45 delay_ms (10);
;;;46
;;;47 GPIO0->FIOPIN ^= 0x01;
00002e 6960 LDR r0,[r4,#0x14]
000030 f0800001 EOR r0,r0,#1
000034 6160 STR r0,[r4,#0x14]
000036 e7f4 B |L1.34|
;;;48 }
;;;49
;;;50 ;
;;;51 }
ENDP

|L1.56|
DCD 0x2009c000

__ARM_use_no_argv EQU 0



таймер настраивался в режиме "лишь бы тикал"


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sprite   Функция формирования задержки   Feb 15 2012, 15:35
- - Сергей Борщ   QUOTE (Sprite @ Feb 15 2012, 17:35) Пробо...   Feb 15 2012, 17:46
|- - Sprite   Цитата(Сергей Борщ @ Feb 16 2012, 00:46) ...   Feb 16 2012, 02:34
|- - ViKo   Цитата(Сергей Борщ @ Feb 15 2012, 20:46) ...   Feb 20 2012, 08:38
|- - AHTOXA   Цитата(ViKo @ Feb 20 2012, 14:38) А еще у...   Feb 20 2012, 09:36
|- - ViKo   Цитата(AHTOXA @ Feb 20 2012, 12:36) Оно: ...   Feb 20 2012, 09:51
- - ukpyr   Код inline void _delay_loops(U32 loops) { ...   Feb 20 2012, 08:48
- - ViKo   Для ukpyr А вас прерывания и наличие буфера команд...   Feb 20 2012, 09:09
- - ViKo   Подправил код, перенес сброс запроса перед запуско...   Feb 21 2012, 08:31
- - esaulenka   В очередной раз порекламирую другой подход к испол...   Feb 22 2012, 10:00
|- - ViKo   Цитата(esaulenka @ Feb 22 2012, 13:00) ty...   Feb 29 2012, 12:54
|- - AHTOXA   Цитата(ViKo @ Feb 29 2012, 18:54) Допусти...   Feb 29 2012, 14:50
|- - ViKo   Цитата(AHTOXA @ Feb 29 2012, 17:50) Норма...   Feb 29 2012, 19:01
- - ukpyr   ЦитатаА вас прерывания и наличие буфера команд не ...   Feb 22 2012, 10:06


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 02:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016