-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconfig.cpp
74 lines (64 loc) · 2.65 KB
/
config.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*
* config.cpp
*
* Created: 20.04.2018 13:50:11
* Author: kamil
*/
#include "config.h"
#define F_CPU 32000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <stddef.h>
void OscXtal(void) {
// konfiguracja generatora kwarcowego
OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | // wybór kwarcu od 12 do 16 MHZ
OSC_XOSCSEL_XTAL_16KCLK_gc; // czas na uruchomienie generatora
OSC.CTRL = OSC_XOSCEN_bm; // uruchomienie generatora kwarcowego
// czekanie na ustabilizowanie się generatora
for(uint8_t i=0; i<255; i++) {
if(OSC.STATUS & OSC_XOSCRDY_bm) {
_delay_ms(20);
CPU_CCP = CCP_IOREG_gc; // odblokowanie zmiany źródła sygnału zegarowego
CLK.CTRL = CLK_SCLKSEL_XOSC_gc; // wybór źródła sygnału zegarowego na XTAL 16MHz
// układ nadzorujący kwarc
CPU_CCP = CCP_IOREG_gc; // odblokowanie modyfikacji ważnych rejestrów
OSC.XOSCFAIL = OSC_XOSCFDEN_bm; // włączenie układu detekcji błędu sygnału zegarowego
return; // wyjście z funkcji jeśli generator się uruchomił
}
_delay_us(10);
}
}
void Osc32MHz(void) {
OSC.CTRL = OSC_RC32MEN_bm; // włączenie oscylatora 32MHz
while(!(OSC.STATUS & OSC_RC32MRDY_bm)); // czekanie na ustabilizowanie się generatora
CPU_CCP = CCP_IOREG_gc; // odblokowanie zmiany źródła sygnału
CLK.CTRL = CLK_SCLKSEL_RC32M_gc; // zmiana źródła sygnału na RC 32MHz
_delay_ms(1000);
}
void set_main_interrupts()
{
//============================== timery =========================================================
TCD1.INTCTRLA = TC_OVFINTLVL_LO_gc; // przepełnienie ma generować przerwanie LO
TCD1.CTRLB = TC_WGMODE_NORMAL_gc; // tryb normalny
TCD1.PER = 192;
TCC1.INTCTRLA = TC_OVFINTLVL_MED_gc; // przepełnienie ma generować przerwanie LO
TCC1.CTRLB = TC_WGMODE_NORMAL_gc; // tryb normalny
TCC1.PER = 192;
TCD1.CTRLA = TC_CLKSEL_DIV1024_gc;
TCC1.CTRLA = TC_CLKSEL_DIV1024_gc;
}
void pmic_init(void)
{
//////////////////////////////////////////////////////////////////////
//PMIC.CTRL
// 7 6 5 4 3 2 1 0
// | RREN | IVSEL | - | - | - | HILVLEN | MEDLVLEN | LOLVLEN |
// 0 0 0 0 0 0 0 0
// Enable all interrupt levels
// Load Int vectors to application section of flash
// Set interrupt priority to Static (lower address = higher priority)
PMIC.CTRL = PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm; //0x07
//////////////////////////////////////////////////////////////////////
}