avr-fw-modules/cpu/atmega1284p/src/m1284_timer0.c

34 lines
702 B
C
Executable File

#include <hwo/utils.h>
#include <avr/io.h>
#include <avr/wdt.h>
uint16_t t0_steps[] = { 1,8,64,256,1024 };
void systick_timer_init(uint32_t systick_us)
{
uint64_t clocks = ((uint64_t)systick_us) * ((uint64_t)__freq_cpu) / 1000000LL;
uint8_t n_prescaler;
for (n_prescaler = 0; n_prescaler < 5 ; n_prescaler++)
{
if ((clocks / t0_steps[ n_prescaler ]) < 256) {
break;
};
};
if (n_prescaler > 4)
return;
n_prescaler++;
TCCR0A = _BV(WGM01);
OCR0A = (uint8_t)(clocks / t0_steps[ n_prescaler-1 ]);
TCCR0B = (n_prescaler & 0x07);
TIMSK0 |= _BV(OCIE0A);
//_systick_us = 1000000LL * (1LL << prescale_shift[ n_prescaler ]) * (ocr + 1) / __freq_cpu;
_systick_us = systick_us;
};