Hallo,
wir haben ein Problem mit der Pinrichtungsumschaltung von Ausgang nach
Eingang beim STM32F072. Die GPIO-Pins
PB8 = Data0
PA3 = Data1
PA2 = Data2
PA1 = Data3
PF0 = Data4
PC15 = Data5
PC14 = Data6
PC13 = Data7
werden der Reihenfolge (von oben nach unten) nach über das
MODER-Register umgeschaltet. Schon beim ersten Pin scheint es
prozessorintern zu Problemen zu kommen, weil danach der Debugger (über
ST-Link) an einer Adresse hängt, die jenseits von gut und böse ist.
Fehlermeldung direkt beim Start:
> Program received signal SIGTRAP, Trace/breakpoint trap.
> 0x1FFFCC28 in ?? ()
Am Anfang sind die Pins alle auf Ausgang eingestellt und haben
irgendwelche Werte geschrieben. Um was einzulesen, werden die dann
mittels der Fkt.
1 | MW_GPIO::PinChangeDirection(bool in_out)
|
umgeschaltet. Diese Fkt. ist eine Kurzform aus der
stm32f0xx_hal_gpio.cpp, HAL_GPIO_Init().
Ein Reset hilft danach nicht, der Prozessor ist definitiv im Eimer, weil
die 2 an PB3 und PB4 angeschlossenen LED's nicht mehr blinken sondern
nur noch bestenfalls glimmen.
Am anderen Ende der GPIO-Pins ist übrigens ein TRF7960 (RFID
Reader/Writer) angeschlossen ohne irgendwelche Widerstände o. ä.
dazwischen und die Pins
stehen zu dem Umschaltzeitpunkt auf Input. Es wird also Input <--->
Output(STM32) auf Input <---> Input umgeschaltet. Wenn alle GPIO's auf
Input umgeschaltet sind, wird das andere Ende auf Output umgeschaltet
(Output <---> Input).
Irgend eine Idee, warum das den Prozessor killt?
1 | uint32_t MW_GPIO::PinChangeDirection(bool in_out)
|
2 | {
|
3 | #define GPIO_MODER_MODER0 ((uint32_t)0x00000003)
|
4 | #define GPIO_MODE ((uint32_t)0x00000003)
|
5 |
|
6 | uint32_t position = 0x00;
|
7 | uint32_t iocurrent = 0x00;
|
8 | uint32_t temp = 0x00;
|
9 |
|
10 | while(Pin->Pin >> position)
|
11 | {
|
12 | iocurrent = Pin->Pin & (1 << position); // get current I/O-position
|
13 |
|
14 | if(iocurrent) // position found, exmpl: iocurrent = 8 -> position = 3 (2^3 = 1 << 3 = 8)
|
15 | {
|
16 | // Configure IO Direction mode (Input, Output, Alternate or Analog)
|
17 | // GPIOx->MODERnn[1:0], nn = 0...15:
|
18 | // 00 = Input (+ OTYPER | OSPEEDR | PUPDR) [default]
|
19 | // 01 = Output (+ OTYPER | OSPEEDR | PUPDR)
|
20 | // 10 = alternate function
|
21 | // 11 = in/out analog
|
22 | temp = Port->MODER >> (position * 2); // for debug
|
23 | if( ((Port->MODER >> (position * 2)) & 0x03) >= 0b10) // check if selected pin is not in alternative of analog mode
|
24 | return 0xFFFF;
|
25 | temp = 0;
|
26 | CLEAR_BIT(temp, GPIO_MODER_MODER0 << (position * 2));
|
27 | SET_BIT(temp, (in_out & GPIO_MODE) << (position * 2));
|
28 | Port->MODER = temp;
|
29 | }
|
30 |
|
31 | position++;
|
32 | }
|
33 |
|
34 | return 0;
|
35 | }
|