Я новичок во встраиваемых технологиях, изучаю основы задержек таймера.Я работаю на плате 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