Задержка в миллисекундах, процессор ARM, код в C - PullRequest
0 голосов
/ 31 мая 2018

Я новичок во встраиваемых технологиях, изучаю основы задержек таймера.Я работаю на плате FriendlyARM mini2440 с микропроцессором S3C2440A.

Написал следующий код, чтобы разрешить пользовательскую задержку в миллисекундах, и вставил печать на экран для отладки.Кажется, код печатает все правильные числа, но фактическая задержка не работает.Был бы признателен за некоторые указатели.

#include "PWMRegs.h"
#include "types.h"
#include "Utils.h"

static U32 PLCK = 50000000;

void MilliDelay(unsigned long mills){

U32 PrescalarMask   =   0xFF << 8; //prescalar 1 for timers 2, 3, & 4
U32 DividerMask     =   0xF << 16; //divider (MUX 4) for timer 4
U32 Prescalar       =   255;
U32 Divider         =   2;
U32 TotSteps;
U32 StepsPerMil;
U32 Current;
U32 Prev;
U32 ElapsedSteps    =   0;

Util_Printf("mills: %u\n", mills);
Util_Printf("PLCK: %u\n", PLCK);
Util_Printf("Divider: %u\n", Divider);
Util_Printf("Prescalar: %u\n", Prescalar);


//Timer configuration
*TCFG0 &= ~PrescalarMask;           //zero out prescalar
*TCFG0 |=  PrescalarMask;           //prescalar 255
*TCFG1 &=  ~DividerMask;            //zero out divider
*TCFG1 |=  TIMER4_MUX_1_2;          //divider 1/2

StepsPerMil = PLCK/(1000*Divider*(Prescalar+1));
Uart_Printf("Steps per Mil: %d\n", StepsPerMil);
TotSteps = StepsPerMil*mills;
Uart_Printf("Tot Steps: %d\n", TotSteps);


*TCNTB4 = StepsPerMil;  

*TCON |= (TIMER4_START | TIMER4_MAN_UPDATE | TIMER4_AUTO_RELOAD); //autoload, update TCNTB4, start timer 4
*TCON &= ~(TIMER4_MAN_UPDATE);      //clear manual update bit
Prev = *TCNTO4;
Uart_Printf("\nInitial TCNTO4: %d \n", Prev);
while(ElapsedSteps < TotSteps){
    Current = *TCNTO4;
    if (Current <= Prev)
    {
        ElapsedSteps += Current + (StepsPerMil - Prev);
    }
    else
        ElapsedSteps += Current - Prev;
    Prev = Current;
}

/* Stop the timer */    
*TCON &= ~(TIMER4_START | TIMER4_AUTO_RELOAD);
Uart_Printf("Elapsed Steps: %d \n", ElapsedSteps);

}

void TestTimer(){
    Util_Printf("You've entered the timer delay test.\n");
    Util_Printf("Enter delay in milli-seconds:\t");
    unsigned long mills = Util_GetIntNum();

    MilliDelay(mills);
}

Вот пример того, что печатает:

0-Regisiter read word
1-Test Regsiter write word
2-Test Regsiter read readбайт
3-тестовый регистр записи байт
4-тестовое считывание ID DM9000
5-тестовый идентификатор GPIO
6-тестовый таймер
6
Вы ввели тест задержки таймера.
Введите задержку в миллисекундах: 1000
фрез: 1000
PLCK: 50000000
Делитель: 2
Прескалар: 255
Шаг на мил: 97
Всего шагов: 97000

Начальный TCNTO4: 83
Прошедшие шаги: 97060

...