mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
ЛР14,16. Увеличение разрядности таймера
This commit is contained in:
@@ -101,11 +101,13 @@ struct VGA_HANDLE vga = {CAST(uint8_t *const, 0x07000000), CAST(uint8_t *const,
|
||||
|
||||
struct TIMER_HANDLE
|
||||
{
|
||||
volatile const uint32_t system_counter;
|
||||
volatile uint32_t delay;
|
||||
volatile const uint32_t system_counter_low_bits;
|
||||
volatile const uint32_t system_counter_high_bits;
|
||||
volatile uint32_t delay_low_bits;
|
||||
volatile uint32_t delay_high_bits;
|
||||
volatile uint32_t mode;
|
||||
volatile uint32_t repeat_counter;
|
||||
volatile const uint32_t __unused2__[5];
|
||||
volatile const uint32_t __unused2__[3];
|
||||
volatile uint32_t rst;
|
||||
};
|
||||
struct TIMER_HANDLE *const timer_ptr = CAST(struct TIMER_HANDLE *const, 0x08000000);
|
||||
|
@@ -41,7 +41,7 @@
|
||||
|
||||
### Таймер
|
||||
|
||||
Разберемся с тем, как будет работать наш таймер. По сути, это просто системный счетчик (не путайте с программным счетчиком), непрерывно считающий такты с момента последнего сброса. Системным он называется потому, что работает на системной тактовой частоте. Для измерения времени мы будем засекать значение счетчика на момент начала отсчета и значение счетчика в конце отсчета. Зная тактовую частоту и разность между значениями счетчика мы с легкостью сможем вычислить прошедшее время. При этом нужно обеспечить счетчик такой разрядностью, чтобы он точно не смог переполниться.
|
||||
Разберемся с тем, как будет работать наш таймер. По сути, это просто системный счетчик (не путайте с программным счетчиком), непрерывно считающий такты с момента последнего сброса. Системным он называется потому, что работает на системной тактовой частоте. Значения частот, на которых работают процессорные системы сравнимы с 32-битными значениями, поэтому системный счетчик должен быть 64-битным. Для измерения времени мы будем засекать значение счетчика на момент начала отсчета и значение счетчика в конце отсчета. Зная тактовую частоту и разность между значениями счетчика мы с легкостью сможем вычислить прошедшее время. При этом нужно обеспечить счетчик такой разрядностью, чтобы он точно не смог переполниться.
|
||||
|
||||
Поскольку мы уже назвали данный модуль "таймером", чтобы тот не был слишком простым, давайте добавим ему функциональности: пускай это будет устройство, способное генерировать прерывание через заданное число тактов. Таким образом, процессорная система сможет засекать время без постоянного опроса счетчика.
|
||||
|
||||
@@ -49,13 +49,15 @@
|
||||
|
||||
Таким образом, мы сформировали следующее адресное пространство данного контроллера:
|
||||
|
||||
|Адрес|Режим доступа|Допустимые значения| Функциональное назначение |
|
||||
|-----|-------------|-------------------|---------------------------------------------------------------------------------|
|
||||
|0x00 | R | [0:2⁶⁴-1] | Значение системного счетчика, доступное только для чтения |
|
||||
|0x04 | RW | [0:2⁶⁴-1] | Указание задержки, спустя которую таймер будет генерировать прерывание |
|
||||
|0x08 | RW | [0:2] | Указание режима генерации прерываний (выключен, заданное число раз, бесконечно) |
|
||||
|0x0c | RW | [0:2³²-1] | Указание количества повторений генерации прерываний |
|
||||
|0x24 | W | 1 | Программный сброс |
|
||||
|Адрес|Режим доступа|Допустимые значения| Функциональное назначение |
|
||||
|-----|-------------|-------------------|---------------------------------------------------------------------------------------|
|
||||
|0x00 | R | [0:2³²-1] | Значение младших 32 бит системного счетчика, доступное только для чтения |
|
||||
|0x00 | R | [0:2³²-1] | Значение старших 32 бит системного счетчика, доступное только для чтения |
|
||||
|0x08 | RW | [0:2³²-1] | Указание младших 32 бит задержки, спустя которую таймер будет генерировать прерывание |
|
||||
|0x08 | RW | [0:2³²-1] | Указание старших 32 бит задержки, спустя которую таймер будет генерировать прерывание |
|
||||
|0x10 | RW | [0:2] | Указание режима генерации прерываний (выключен, заданное число раз, бесконечно) |
|
||||
|0x14 | RW | [0:2³²-1] | Указание количества повторений генерации прерываний |
|
||||
|0x24 | W | 1 | Программный сброс |
|
||||
|
||||
Прототип модуля следующий:
|
||||
|
||||
|
Reference in New Issue
Block a user