-
Notifications
You must be signed in to change notification settings - Fork 0
/
cPIO.cpp
110 lines (85 loc) · 2.31 KB
/
cPIO.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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "cPIO.h"
cPIO::cPIO(Pio *pio)
{
mPIO = pio;
}
cPIO::~cPIO()
{
}
void cPIO::configureRisingEdgeInterrupt(uint32_t mask)
{
mPIO->PIO_AIMER = mask; // additional interrupt
mPIO->PIO_REHLSR = mask; // rising edge / high level
mPIO->PIO_ESR = mask;
}
void cPIO::configureFallingEdgeInterrupt(uint32_t mask)
{
mPIO->PIO_AIMER = mask; // additional interrupt
mPIO->PIO_FELLSR = mask; // falling edge / low level status register
mPIO->PIO_ESR = mask;
}
uint32_t cPIO::interruptMask()
{
return mPIO->PIO_IMR;
}
uint32_t cPIO::interruptStatus()
{
return mPIO->PIO_ISR;
}
void cPIO::enableInterrupt(uint32_t source)
{
mPIO->PIO_IER = source;
}
void cPIO::disableInterrupt(uint32_t source)
{
mPIO->PIO_IDR = source;
}
void cPIO::setPeripheralA(uint32_t mask, uint8_t enablePullUp)
{
mPIO->PIO_IDR = mask; // Interrupt disable register
if (enablePullUp)
mPIO->PIO_PUER = mask;
else
mPIO->PIO_PUDR = mask;
mPIO->PIO_ABCDSR[0] &= (~mask & PIOA->PIO_ABCDSR[0]);
mPIO->PIO_ABCDSR[1] &= (~mask & PIOA->PIO_ABCDSR[1]);
mPIO->PIO_PDR = mask; // PIO disable register
}
void cPIO::setPeripheralB(uint32_t mask, uint8_t enablePullUp)
{
mPIO->PIO_IDR = mask; // Interrupt disable register
if (enablePullUp)
mPIO->PIO_PUER = mask;
else
mPIO->PIO_PUDR = mask;
mPIO->PIO_ABCDSR[0] = (mask | PIOA->PIO_ABCDSR[0]);
mPIO->PIO_ABCDSR[1] &= (~mask & PIOA->PIO_ABCDSR[1]);
mPIO->PIO_PDR = mask; // PIO disable register
}
void cPIO::setOutput(uint32_t mask)
{
mPIO->PIO_IDR = mask; // Interrupt disable register
mPIO->PIO_OER = mask;
mPIO->PIO_PER = mask;
}
void cPIO::setInput(uint32_t mask)
{
mPIO->PIO_IDR = mask; // Interrupt disable register
mPIO->PIO_PUER = mask; // Pullup enable register
mPIO->PIO_IFER = mask; // Input filter enable register (deglitch)
//mPIO->PIO_IFSCER = mask; // Input filter slow clock enable register (debounce) makes the servo jerking
mPIO->PIO_ODR = mask; // output disable register, therefore input
mPIO->PIO_PER = mask; // PIO enable register
}
void cPIO::set(uint32_t mask)
{
mPIO->PIO_SODR = mask;
}
void cPIO::clear(uint32_t mask)
{
mPIO->PIO_CODR = mask; // Clear Output Data Register
}
uint32_t cPIO::status(uint32_t mask)
{
return (mPIO->PIO_PDSR & mask)==0?0:1;
}