Таймеры в микроконтроллерах

Автор работы: Пользователь скрыл имя, 09 Сентября 2014 в 09:42, лекция

Краткое описание

В микроконтроллерах семейства STM32L1xx можно организовать отсчет времени по тактам системных часов. По умолчанию в момент запуска системные часы ядра CORTEX – 3M устанавливаются на тактовую частоту f=2000000 гц, обеспечивая длительность одного такта τ=1/f=1/2000000 с =0.0000005 с =0.5 млс. Измерители времени или таймеры способны автономно подсчитывать системные такты до заданной величины.

Прикрепленные файлы: 1 файл

2 Таймеры.docx

— 113.41 Кб (Скачать документ)

  LIGHT_ON( LIGHT_PORT, BLUE_LIGHT );     // включить синий свет

 

  TIM10_Start;                     // запуск счетчика - 5 тактов

  a = 0.0F;                    // 8 тактов на константу в 1 байт

//  b = 0.0;                   // 9 тактов на константу в 1 байт

  TIM10_Stop;                     // останов счетчика - 5 тактов

  t = TIM10->CNT - 10;   // количество тактов без учета счетчика

  DisplayUint32Convertion( DisplayArray, t );    // строка для t

  LCD_GLASS_DisplayStrDeci( DisplayArray );    // показать число

 

  while(1);               // цикл продолжения в реальном времени

}

Ассемблерный код для копирования четырехбайтного нуля типа float в Си-инструкции a = 0.0F представлен ниже. Суффикс F в константе  0.0F предписывает располагать вещественный 0 в четырех байтах в нормализованном виде мантиссы и порядка.

    29:         a = 0.0F;     // 8 тактов на константу в 4 байта

0x080006E2 2000      MOVS     r0,#0x00

0x080006E4 490F      LDR      r1,[pc,#60]  ; @0x08000724

0x080006E6 6008      STR      r0,[r1,#0x00]

Из команды MOVS r0,#0x00 видно, что компилятор предпочел не делать различия между целым и вещественным представлением нуля. Поэтому четыре нулевых байта регистра r0 сохраняются в переменной b1 по команде STR r0,[r1,#0x00].

Дисплей показывает 1+1+3+3=8 тактов. Дополнительно потрачено 3 такта на внутреннюю синхронизацию.

Восьмибайтные вещественные константы и переменные используются для повышения точности вычислений за счет увеличенного числа бит в мантиссе и порядке. Но общие регистры – 32 битные. Как они реализуют восьмибайтные преобразования? Копирование восьмибайтного нуля выполняется в Си-инструкции b = 0.0. Соответствующий ассемблерный код представлен ниже.

    30:         b = 0.0;       // 9 тактов на константу в 8 байт

0x080006E2 2100      MOVS     r1,#0x00

0x080006E4 4A10      LDR      r2,[pc,#64]  ; @0x08000728

0x080006E6 6011      STR      r1,[r2,#0x00]

0x080006E8 6051      STR      r1,[r2,#0x04]

Команда MOVS r1,#0x00 загружает однобайтный 0 в общий регистр r1 – это 1 такт. Следующая команда LDR  r2,[pc,#64] загружает в регистр r2 адрес 0x08000728 восьмибайтной переменной b – это 1 такт. Поскольку восьмибайтный 0.0 состоит только из двоичных рулей, то дважды нули по 32 байта копируются в последовательные байты переменной b с шагом в четыре байта: команда STR r1,[r2,#0x00] и команда STR r1,[r2,#0x04] – это 3+3=6 тактов.

Дисплей показывает 1+1+3+3+1=9 тактов. Дополнительно потрачен 1 такт на внутреннюю синхронизацию.

 

А.Ф. Деон. Учебный курс STM32L-Discavery. 2. Таймеры.


 


Информация о работе Таймеры в микроконтроллерах