manually merged with ARM version

This commit is contained in:
2025-11-13 17:43:55 +03:00
parent f978759ae0
commit 04015fb4cb
463 changed files with 119514 additions and 45 deletions

View File

@ -0,0 +1,12 @@
#include "chip.h"
#include "lclock_arch.h"
t_lclock_ticks g_lclock_tiks_per_sec;
void lclock_init_val(t_lclock_ticks init_val) {
g_lclock_tiks_per_sec = chip_gtim_freq();
}
t_lclock_ticks lclock_get_ticks(void) {
return chip_gtim_cntr();
}

View File

@ -0,0 +1,15 @@
#ifndef LCLOCK_ARCH_H
#define LCLOCK_ARCH_H
#include <stdint.h>
typedef uint64_t t_lclock_ticks;
extern t_lclock_ticks g_lclock_tiks_per_sec;
#define LCLOCK_TICKS_PER_SECOND g_lclock_tiks_per_sec
#endif // LCLOCK_ARCH_H

View File

@ -0,0 +1,70 @@
#include "chip.h"
#include "lclock.h"
static volatile t_lclock_ticks lclock_systicks;
static uint8_t f_initialized = 0;
ISR(TIMER2_COMPA_vect) {
lclock_systicks++;
}
#define CLOCK_IRQ_TICKS (CHIP_CLK_SYS_FREQ/LCLOCK_TICKS_PER_SECOND)
#if CLOCK_IRQ_TICKS < 256
#define LCLOCK_SYS_CLK_DIV 1
#define LCLOCK_TCCR0B_CS_RVAL CHIP_REGFLDVAL_TCCR2B_CS_FSYS_1
#elif CLOCK_IRQ_TICKS/8 < 256
#define LCLOCK_SYS_CLK_DIV 8
#define LCLOCK_TCCR0B_CS_RVAL CHIP_REGFLDVAL_TCCR2B_CS_FSYS_8
#elif CLOCK_IRQ_TICKS/32 < 256
#define LCLOCK_SYS_CLK_DIV 32
#define LCLOCK_TCCR0B_CS_RVAL CHIP_REGFLDVAL_TCCR2B_CS_FSYS_32
#elif CLOCK_IRQ_TICKS/64 < 256
#define LCLOCK_SYS_CLK_DIV 64
#define LCLOCK_TCCR0B_CS_RVAL CHIP_REGFLDVAL_TCCR2B_CS_FSYS_64
#elif CLOCK_IRQ_TICKS/128 < 256
#define LCLOCK_SYS_CLK_DIV 128
#define LCLOCK_TCCR0B_CS_RVAL CHIP_REGFLDVAL_TCCR2B_CS_FSYS_128
#elif CLOCK_IRQ_TICKS/256 < 256
#define LCLOCK_SYS_CLK_DIV 256
#define LCLOCK_TCCR0B_CS_RVAL CHIP_REGFLDVAL_TCCR2B_CS_FSYS_256
#elif CLOCK_IRQ_TICKS/1024 < 256
#define LCLOCK_SYS_CLK_DIV 1024
#define LCLOCK_TCCR0B_CS_RVAL CHIP_REGFLDVAL_TCCR2B_CS_FSYS_1024
#else
#error "unsupported system clock frequency"
#endif
/*************************************************************************
* инициализация системного таймера
* использует для этого RIT
* ***********************************************************************/
void lclock_init_val(t_lclock_ticks init_val) {
/* инициализируем счетчик */
lclock_systicks = init_val;
f_initialized = 1;
CHIP_REG_TIMSK2 = CHIP_REGFLD_TIMSK0_OCIE0A;
CHIP_REG_OCR2A = ((CLOCK_IRQ_TICKS + LCLOCK_SYS_CLK_DIV/2)/LCLOCK_SYS_CLK_DIV -1);
CHIP_REG_TCCR2A = LBITFIELD_SET(CHIP_REGFLD_TCCR0A_WGM0_01, CHIP_REGFLDVAL_TC2_WGM_CTC);
CHIP_REG_TCCR2B = LBITFIELD_SET(CHIP_REGFLD_TCCR0B_WGM0_2, CHIP_REGFLDVAL_TC2_WGM_CTC >> 2)
| LBITFIELD_SET(CHIP_REGFLD_TCCR0B_CS, LCLOCK_TCCR0B_CS_RVAL);
}
char lclock_is_initialized(void) {
return f_initialized;
}
t_lclock_ticks lclock_get_ticks(void) {
return lclock_systicks;
}
void lclock_disable(void) {
CHIP_REG_TCCR2B = 0;
f_initialized = 0;
}

View File

@ -0,0 +1,10 @@
#ifndef LCLOCK_ARCH_H
#define LCLOCK_ARCH_H
#include <stdint.h>
#define LCLOCK_TICKS_PER_SECOND 1000
typedef uint32_t t_lclock_ticks;
#endif // LCLOCK_ARCH_H

View File

@ -0,0 +1,47 @@
/***************************************************************************//**
@ingroup ltimer_bf_core_tmr
@file ports/bf_core_tmr/lclock.c
Файл содержит реализацию функций для работы с системным счетчиком
для процессора BlackFin
@author Borisov Alexey <borisov@lcard.ru>
******************************************************************************/
#include "lclock.h"
/* файл должен определять LPC_SYSCLK и включать cmsis.h */
#include "chip.h"
volatile t_lclock_ticks lclock_systicks;
static char f_initialized = 0;
ISR(lclock_isr);
/*************************************************************************
* инициализация системного таймера
* ***********************************************************************/
void lclock_init_val(t_lclock_ticks init_val) {
/* инициализируем счетчик */
lclock_systicks = init_val;
REGISTER_ISR(6, lclock_isr);
*pTCNTL = BITM_TCNTL_AUTORLD | BITM_TCNTL_PWR;
*pTPERIOD = CHIP_CLKF_CCLK/LCLOCK_TICKS_PER_SECOND;
*pTSCALE = 0;
*pTCNTL |= BITM_TCNTL_EN;
f_initialized = 1;
}
char lclock_is_initialized(void) {
return f_initialized;
}
void lclock_disable(void) {
*pTCNTL = 0;
f_initialized = 0;
}
ISR(lclock_isr) {
lclock_systicks++;
#ifdef LCLOCK_USE_USER_MS_CB
lclock_user_ms_cb();
#endif
}

View File

@ -0,0 +1,38 @@
/***************************************************************************//**
@ingroup ltimer
@defgroup ltimer_bf_core_tmr Порт таймера для BlackFin
Порт для работы с таймером для сигнальных процессоров BlackFin от Analog Devices.
Для получения системного счетчика использует таймер ядра
*****************************************************************************/
/***************************************************************************//**
@ingroup ltimer_bf_core_tmr
@file ports/bf_core_tmr/lclock_arch.h
Файл содержит определение типов и констант для работы с системным счетчиком
для процессоров BlackFin
@author Borisov Alexey <borisov@lcard.ru>
******************************************************************************/
#ifndef LCLOCK_ARCH_H_
#define LCLOCK_ARCH_H_
#include "lcspec.h"
#ifndef LCLOCK_TICKS_PER_SECOND
/** Количество тиков системного таймера в секунду */
#define LCLOCK_TICKS_PER_SECOND 1000
#endif
/** Тип для представления количества системных тиков */
typedef unsigned int t_lclock_ticks;
extern volatile t_lclock_ticks lclock_systicks;
static LINLINE t_lclock_ticks lclock_get_ticks(void) {
return lclock_systicks;
}
#endif /* LCLOCK_ARCH_H_ */

View File

@ -0,0 +1,66 @@
/***************************************************************************//**
@ingroup ltimer_cm_systick
@file ports/cm_systick/lclock.c
Файл содержит реализацию функций для работы с системным счетчиком
для Cortex-M с использованием системного таймера.
Порт требует наличие файла chip.h, который включает определение LPC_SYSCLK
и включать функции CMSIS (используется SysTick_Config).
Если LPC_SYSCLK не определена, то используется значение из переменной SystemCoreClock
@author Borisov Alexey <borisov@lcard.ru>
******************************************************************************/
#include "lclock.h"
/* файл должен определять LPC_SYSCLK и включать cmsis.h */
#include "chip.h"
#ifndef LCLOCK_IN_CLK_FREQ
#ifdef CHIP_CLK_SYSTICK_FREQ
/* используем частоту SysTick, если она определена в chip */
#define LCLOCK_IN_CLK_FREQ CHIP_CLK_SYSTICK_FREQ
#elif defined LPC_SYSCLK
/* для совместимости с версией chip, где определялось только значение LPC_SYSCLK */
#define LCLOCK_IN_CLK_FREQ LPC_SYSCLK
#else
/* если другие варианты не определены, то используем вариант с внешней
* переменной, который в частности используется в lpcopen */
extern uint32_t SystemCoreClock;
#define LCLOCK_IN_CLK_FREQ SystemCoreClock
#endif
#endif
volatile t_lclock_ticks lclock_systicks;
static char f_initialized = 0;
/*************************************************************************
* инициализация системного таймера
* ***********************************************************************/
void lclock_init_val(t_lclock_ticks init_val) {
/* инициализируем счетчик */
lclock_systicks = init_val;
SysTick_Config(LCLOCK_IN_CLK_FREQ / LCLOCK_TICKS_PER_SECOND);
f_initialized = 1;
}
char lclock_is_initialized(void) {
return f_initialized;
}
void lclock_disable(void) {
SysTick->CTRL = 0;
f_initialized = 0;
}
/* обработка прерывания от системного таймера - обновление числа тиков */
#if defined ( __ICCARM__ )
void SysTick_Handler(void) {
#else
void SysTick_IRQHandler(void) {
#endif
lclock_systicks++;
#ifdef LCLOCK_USE_USER_MS_CB
lclock_user_ms_cb();
#endif
}

View File

@ -0,0 +1,44 @@
/***************************************************************************//**
@ingroup ltimer
@defgroup ltimer_cm_systick Порт таймера для Cortex-M
Порт для работы с таймером для микроконтроллеров с ядром Cortex-M.
Для получения системного счетчика использует системный таймер (SysTick).
*****************************************************************************/
/***************************************************************************//**
@ingroup ltimer_cm_systick
@file ports/cm_systick/lclock_arch.h
Файл содержит определение типов и констант для работы с системным счетчиком
для процессоров с ядром Cortex-M с использованием системного таймера.
Порт использует внешний файл chip.h, в котором должно быть определено
значение частоты входной частоты системного таймера одним из следующих способов
(в порядке убывания приоритетов):
- определен явно макрос LCLOCK_IN_CLK_FREQ
- определен макрос CHIP_CLK_SYSTICK_FREQ (в новых версиях библиотеки chip)
- определен макрос LPC_SYSCLK (старая версия библиотеки chip или порта контроллера для LPC)
- в проекте должна существовать глобальная переменная SystemCoreClock типа uint32_t,
которая на момент lcock_init() должна содержать действительную частоту
системного таймера
******************************************************************************/
#ifndef LCLOCK_ARCH_H_
#define LCLOCK_ARCH_H_
#include "lcspec.h"
/** Количество тиков системного таймера в секунду */
#define LCLOCK_TICKS_PER_SECOND 1000
/** Тип для представления количества системных тиков */
typedef unsigned int t_lclock_ticks;
extern volatile t_lclock_ticks lclock_systicks;
static LINLINE t_lclock_ticks lclock_get_ticks(void) {
return lclock_systicks;
}
#endif /* LCLOCK_ARCH_H_ */

View File

@ -0,0 +1,7 @@
#ifndef LCLOCK_CONF_H
#define LCLOCK_CONF_H
/* задает, какой именно EPIT таймер будет использован (HW_EPIT1 или HW_EPIT2) */
#define LCLOCK_CONF_EPIT_INST HW_EPIT2
#endif // LCLOCK_CONF_H

View File

@ -0,0 +1,79 @@
/***************************************************************************//**
@ingroup ltimer_imx6_epit
@file ports/imx6_epit/lclock.c
Файл содержит реализацию функций для работы с системным счетчиком
для процессора imx6, использующую один из EPIT-таймеров.
@author Borisov Alexey <borisov@lcard.ru>
******************************************************************************/
#include <stdint.h>
#include "lclock.h"
#include "core/ccm_pll.h"
#include "registers/regsepit.h"
//! @brief Available clock sources for the timers.
enum _timer_clock_sources {
CLKSRC_OFF = 0, //!< clock source is OFF
CLKSRC_IPG_CLK = 1, //!< clock source is peripheral clock
CLKSRC_PER_CLK = 2, //!< clock source is high-freq reference clock
CLKSRC_CLKIN = 3, //!< clock source is external from a CLKIN input
CLKSRC_CKIL = 3 //!< clock source is low-freq reference clock
};
static char f_initialized = 0;
/*************************************************************************
* инициализация системного таймера
* использует для этого RIT
* ***********************************************************************/
void lclock_init_val(t_lclock_ticks init_val) {
uint32_t freq = get_main_clock(IPG_CLK);
uint32_t control_reg_tmp = 0;
uint32_t base = REGS_EPIT_BASE(LCLOCK_CONF_EPIT_INST);
uint32_t prescaler = freq / LCLOCK_TICKS_PER_SECOND;
// enable the source clocks to the EPIT port
clock_gating_config(base, CLOCK_ON);
// start with a known state by disabling and reseting the module
HW_EPIT_CR_WR(LCLOCK_CONF_EPIT_INST, BM_EPIT_CR_SWR);
// wait for the reset to complete
while ((HW_EPIT_CR(LCLOCK_CONF_EPIT_INST).B.SWR) != 0) ;
// set the reference source clock for the counter
control_reg_tmp |= BF_EPIT_CR_CLKSRC(CLKSRC_IPG_CLK);
// set the counter clock prescaler value - 0 to 4095
control_reg_tmp |= BF_EPIT_CR_PRESCALAR(prescaler-1);
// set behavior for low power mode
control_reg_tmp |= BM_EPIT_CR_WAITEN;
control_reg_tmp |= BM_EPIT_CR_STOPEN;
// make the counter start from a known value when enabled, this is loaded from
// EPITLR register if RLD=reload_mode=1 or 0xFFFFFFFF if RLD=reload_mode=0
control_reg_tmp |= BM_EPIT_CR_IOVW | BM_EPIT_CR_ENMOD;
// finally write the control register
HW_EPIT_CR_WR(LCLOCK_CONF_EPIT_INST, control_reg_tmp);
// finally, enable the counter
HW_EPIT_CR_SET(LCLOCK_CONF_EPIT_INST, BM_EPIT_CR_EN);
f_initialized = 1;
}
char lclock_is_initialized(void) {
return f_initialized;
}
t_lclock_ticks lclock_get_ticks(void) {
t_lclock_ticks val = -HW_EPIT_CNR_RD(LCLOCK_CONF_EPIT_INST);
return val;
}

View File

@ -0,0 +1,29 @@
/***************************************************************************//**
@ingroup ltimer
@defgroup ltimer_imx6_epit Порт таймера для процессора iMX6
Порт для работы с таймером для процессоров iMX6 от Freescale на базе таймера EPIT.
Для данного порта необходим файл в проекте lclock_conf.h, который бы задавал номер
используемого EPIT-таймера
*****************************************************************************/
/***************************************************************************//**
@ingroup ltimer_imx6_epit
@file ports/imx6_epit/lclock_arch.h
Файл содержит определение типов и констант для работы с системным таймером
для процессоров iMX6 от Freescale на базе таймера EPIT.
@author Borisov Alexey <borisov@lcard.ru>
******************************************************************************/
#ifndef LCLOCK_ARCH_H_
#define LCLOCK_ARCH_H_
#include "lclock_conf.h"
#ifndef LCLOCK_TICKS_PER_SECOND
#define LCLOCK_TICKS_PER_SECOND 1000000
#endif
typedef unsigned int t_lclock_ticks;
#endif /* LCLOCK_ARCH_H_ */

View File

@ -0,0 +1,34 @@
#include "lclock_arch.h"
static char f_initialized = 0;
char lclock_is_initialized(void) {
return f_initialized;
}
void lclock_init_val(t_lclock_ticks init_val) {
chip_per_clk_en(CHIP_PER_CLK_NUM_SYSCTR);
CHIP_REGS_SYSCTR_CTRL->CNTCR = 0;
CHIP_REGS_SYSCTR_CTRL->CNTCV0 = init_val & 0xFFFFFFFFUL;
CHIP_REGS_SYSCTR_CTRL->CNTCV1 = (init_val >> 32) & 0xFFFFFFFFUL;
CHIP_REGS_SYSCTR_CTRL->CNTCR = CHIP_REGFLD_SYSCTR_CNTCR_EN | CHIP_REGFLD_SYSCTR_CNTCR_FCR(0);
f_initialized = 1;
}
void lclock_disable(void) {
CHIP_REGS_SYSCTR_CTRL->CNTCR = 0;
chip_per_clk_dis(CHIP_PER_CLK_NUM_SYSCTR);
f_initialized = 0;
}
t_lclock_ticks lclock_get_ticks(void) {
chip_isb();
uint32_t h1 = CHIP_REGS_SYSCTR_CTRL->CNTCV1;
uint32_t l = CHIP_REGS_SYSCTR_CTRL->CNTCV0;
uint32_t h2 = CHIP_REGS_SYSCTR_CTRL->CNTCV1;
if ((h2 != h1) && (l > 0x80000000U)) {
h2 = h1;
}
return ((uint64_t)h2 << 32) | l;
}

View File

@ -0,0 +1,12 @@
#ifndef LCLOCK_ARCH_H
#define LCLOCK_ARCH_H
#include <chip.h>
#include <stdint.h>
typedef uint64_t t_lclock_ticks;
#define LCLOCK_TICKS_PER_SECOND CHIP_CLK_SYSCTR_BASE_FREQ
#endif // LCLOCK_ARCH_H

View File

@ -0,0 +1,58 @@
/***************************************************************************//**
@ingroup ltimer_linux
@file ports/linux/lclock.c
Файл содержит реализацию функций для работы с системным счетчиком в OC Linux
через clock_gettime() из librt.
@date 16.09.2011
@author Borisov Alexey <borisov@lcard.ru>
******************************************************************************/
#include "lclock.h"
#include <time.h>
#include <stddef.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifdef HAVE_SYS_TIMERS_H
#include <sys/timers.h>
#endif
#ifdef NO_CLOCKGETTIME
#include <sys/time.h>
#else
#ifdef CLOCK_MONOTONIC
#define LTIMER_CLK_ID CLOCK_MONOTONIC
#else
#define LTIMER_CLK_ID TIMEOFDAY
#endif
#endif
void lclock_init_val(t_lclock_ticks init_val) {
/* инициализация системного таймера не требуется */
}
char lclock_is_initialized(void) {
return 1;
}
t_lclock_ticks lclock_get_ticks(void) {
#ifdef NO_CLOCKGETTIME
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec*1000 + tv.tv_usec/1000;
#else
struct timespec tp;
clock_gettime(LTIMER_CLK_ID, &tp);
return tp.tv_sec*1000 + tp.tv_nsec/1000000;
#endif
}

View File

@ -0,0 +1,30 @@
/***************************************************************************//**
@ingroup ltimer
@defgroup ltimer_linux Порт таймера для Linux
Порт для работы с таймером в ОС Linux. Для получения системного счетчика
использует функцию clock_gettime() из librt для получения CLOCK_MONOTONIC,
который нельзя устанавливать и дает приемлемую точность (если нет в ОС, то
используется TIMEOFDAY).
*****************************************************************************/
/***************************************************************************//**
@ingroup ltimer_linux
@file ports/linux/lclock_arch.h
Файл содержит определение типов и констант для работы с системным счетчиком
в OC Linux через функцию clock_gettime().
@author Borisov Alexey <borisov@lcard.ru>
******************************************************************************/
#ifndef LCLOCK_ARCH_H_
#define LCLOCK_ARCH_H_
#include <stdint.h>
/* Возвращаем счетчик в миллисекундах, хотя clock_gettime() может дать нс,
но реально они не изменяются + с мс сохраняется достаточное время
переполнения для 32-битного счетчика */
#define LCLOCK_TICKS_PER_SECOND 1000
/* для простоты и скорости операций используем 32-битное слово */
typedef uint32_t t_lclock_ticks;
#endif /* LCLOCK_ARCH_H_ */

View File

@ -0,0 +1,70 @@
/***************************************************************************//**
@ingroup ltimer_lpc17xx_rit
@file ports/lpc17xx_rit/lclock.c
Файл содержит реализацию функций для работы с системным счетчиком
в LPC17xx с использованием RIT.
@author Borisov Alexey <borisov@lcard.ru>
******************************************************************************/
#include "lclock.h"
#include "LPC17xx.h"
#include "iolpc17XX.h"
#include "system_LPC17xx.h"
static volatile t_lclock_ticks lclock_systicks;
static char f_initialized = 0;
/*************************************************************************
* инициализация системного таймера
* использует для этого RIT
* ***********************************************************************/
void lclock_init_val(t_lclock_ticks init_val) {
/* инициализируем счетчик */
lclock_systicks = init_val;
/* подаем питание на RIT */
LPC_SC->PCONP |= LPC_SC_PCONP_PCRIT_Msk;
/* останавливаем счетчик (на случай если был запущен) и иницилизируем его */
LPC_RIT->RICTRL =0;
LPC_RIT->RICOUNTER = 0;
LPC_RIT->RICOMPVAL = SystemCoreClock / (4 * 1000);
LPC_RIT->RIMASK = 0x0;
LPC_RIT->RICTRL = LPC_RIT_RICTRL_RITENCLR_Msk | LPC_RIT_RICTRL_RITEN_Msk
| LPC_RIT_RICTRL_RITENBR_Msk;
/* разрешаем прерывания */
NVIC_EnableIRQ(RIT_IRQn);
f_initialized = 1;
}
char lclock_is_initialized(void) {
return f_initialized;
}
t_lclock_ticks lclock_get_ticks(void) {
return lclock_systicks;
}
void lclock_disable(void) {
NVIC_DisableIRQ(RIT_IRQn);
LPC_RIT->RICTRL = 0;
f_initialized = 0;
}
/* обработка прерывания от RIT - обновление числа тиков */
#include "lcspec_interrupt.h"
void RIT_IRQHandler(void) {
LPC_RIT->RICTRL |= LPC_RIT_RICTRL_RITINT_Msk;
lclock_systicks++;
#ifdef LCLOCK_USE_USER_MS_CB
lclock_user_ms_cb();
#endif
}

View File

@ -0,0 +1,24 @@
/***************************************************************************//**
@ingroup ltimer
@defgroup ltimer_lpc17xx_rit Порт таймера для LPC17xx
Порт для работы с таймером для микроконтроллеров семейства LPC17xx (Cortex-M3).
Для получения системного счетчика использует RIT (Repetitive Interrupt Timer).
*****************************************************************************/
/***************************************************************************//**
@ingroup timer_lpc17xx_rit
@file ports/lpc17xx_rit/lclock_arch.h
Файл содержит определение типов и констант для работы с системным счетчиком
в LPC17xx с использованием RIT.
@author Borisov Alexey <borisov@lcard.ru>
******************************************************************************/
#ifndef LCLOCK_ARCH_H_
#define LCLOCK_ARCH_H_
#define LCLOCK_TICKS_PER_SECOND 1000
typedef unsigned int t_lclock_ticks;
#endif /* LCLOCK_ARCH_H_ */

View File

@ -0,0 +1,22 @@
#include "chip.h"
#include "lclock_arch.h"
void lclock_init_val(t_lclock_ticks init_val) {
uint32_t l = init_val & 0xFFFFFFFF;
uint32_t h = (init_val >> 32) & 0xFFFFFFFF;
if (l < 0xE0000000) {
CHIP_REGS_MCHTMR->MTIME.l = l;
CHIP_REGS_MCHTMR->MTIME.h = h;
} else {
CHIP_REGS_MCHTMR->MTIME.l = 0;
CHIP_REGS_MCHTMR->MTIME.h = h;
CHIP_REGS_MCHTMR->MTIME.l = l;
}
}
t_lclock_ticks lclock_get_ticks(void) {
return CHIP_REGS_MCHTMR->MTIME.val64;
}

View File

@ -0,0 +1,11 @@
#ifndef LCLOCK_ARCH_H
#define LCLOCK_ARCH_H
#include "chip.h"
typedef uint64_t t_lclock_ticks;
#define LCLOCK_TICKS_PER_SECOND CHIP_CLK_MCHTMR_FREQ
#endif // LCLOCK_ARCH_H

View File

@ -0,0 +1,18 @@
#include "chip.h"
#include "lclock_arch.h"
void lclock_init_val(t_lclock_ticks init_val) {
CHIP_REGS_STK->CTLR = 0;
CHIP_REGS_STK->CNTH = (init_val >> 32) & 0xFFFFFFFF;
CHIP_REGS_STK->CNTL = init_val & 0xFFFFFFFF;
CHIP_REGS_STK->CTLR |= CHIP_REGFLD_STK_CTLR_STE;
}
t_lclock_ticks lclock_get_ticks(void) {
uint32_t h = CHIP_REGS_STK->CNTH;
uint32_t l = CHIP_REGS_STK->CNTL;
uint32_t h2 = CHIP_REGS_STK->CNTH;
return ((uint64_t)h << 32) | l;
}

View File

@ -0,0 +1,11 @@
#ifndef LCLOCK_ARCH_H
#define LCLOCK_ARCH_H
#include "chip.h"
typedef uint64_t t_lclock_ticks;
#define LCLOCK_TICKS_PER_SECOND (CHIP_CLK_SYSTICK_FREQ/8)
#endif // LCLOCK_ARCH_H

View File

@ -0,0 +1,24 @@
/***************************************************************************//**
@ingroup ltimer_win
@file ports/win/lclock.c
Файл содержит реализацию функций для работы с системным счетчиком
в OC Windows через функцию GetTickCount().
@author Borisov Alexey <borisov@lcard.ru>
******************************************************************************/
#include "lclock.h"
void lclock_init_val(t_lclock_ticks init_val) {
}
char lclock_is_initialized(void) {
return 1;
}
t_lclock_ticks lclock_get_ticks(void) {
return GetTickCount();
}

View File

@ -0,0 +1,30 @@
/***************************************************************************//**
@ingroup ltimer
@defgroup ltimer_win Порт таймера для Windows
Порт для работы с таймером в ОС Windows. Для получения системного счетчика
использует функцию WinApi GetTickCount().
*****************************************************************************/
/***************************************************************************//**
@ingroup ltimer_win
@file ports/win/lclock_arch.h
Файл содержит определение типов и констант для работы с системным счетчиком
в OC Windows через функцию GetTickCount().
@date 10.06.2011
@author Borisov Alexey <borisov@lcard.ru>
******************************************************************************/
#ifndef LCLOCK_ARCH_H_
#define LCLOCK_ARCH_H_
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include "Windows.h"
/* GetTickCount() возвращает счетчик в миллисекундах */
#define LCLOCK_TICKS_PER_SECOND 1000
/* GetTickCount() возвращает в качестве значения DWORD */
typedef DWORD t_lclock_ticks;
#endif /* LCLOCK_ARCH_H_ */