Hallo Zusammen,
Ich beschäftige mich zur Zeit mit dem AtsamC21J18A auf dem XPlained
Board.
Die Registerzugriffe mache ich selbst zu Fuß mithilfe von CMSIS und
Microchips DFP.
Beim Port ist mir aufgefallen, dass das Toggeln eines Pins nicht so
funktioniert wie gewünscht. Scheinbar werden andere aktive PortPins
gelöscht, wenn ein anderer getoggelt wird.
1 | static void GetPortRegister(PortPin *me)
|
2 | {
|
3 | if(me->port == PORT_A)
|
4 | port_register = (port_registers_t*)(0x41000000);
|
5 | else
|
6 | port_register = (port_registers_t*)((0x41000000)+0x80);
|
7 | }
|
8 | void HAL_Portpin_OutputToggle(PortPin *me)
|
9 | {
|
10 | ASSERT(me == NULL)
|
11 |
|
12 | GetPortRegister(me);
|
13 |
|
14 | port_register->GROUP->PORT_OUTTGL |= (1UL << me->pin); // Hier werden andere aktive Pins gelöscht!
|
15 | }
|
Als Alternative habe ich es jetzt so umgesetzt:
1 | void HAL_Portpin_OutputToggle(PortPin *me)
|
2 | {
|
3 | ASSERT(me == NULL)
|
4 |
|
5 | GetPortRegister(me);
|
6 |
|
7 | if(GetOutputLevel(me) == LEVEL_HIGH)
|
8 | HAL_Portpin_SetOutputLevel(me, LEVEL_LOW);
|
9 | else
|
10 | HAL_Portpin_SetOutputLevel(me, LEVEL_HIGH);
|
11 | }
|
12 | void HAL_Portpin_SetOutputLevel(PortPin *me, Level level)
|
13 | {
|
14 | ASSERT(me == NULL || level > 1)
|
15 |
|
16 | GetPortRegister(me);
|
17 |
|
18 | if(level == LEVEL_HIGH)
|
19 | port_register->GROUP->PORT_OUT |= (1UL << me->pin);
|
20 | else
|
21 | port_register->GROUP->PORT_OUT &= ~(1UL << me->pin);
|
22 | }
|
Die Frage ist, was mache ich falsch?
Wie kann ich verhindern, dass andere aktive Pins gelöscht werden, wenn
ich OUTTGL nutze?
Viele Grüße