- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Kann Register nicht beschreiben - AFIO_MAPR - AF remap and debug I/O config register

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33

    Kann Register nicht beschreiben - AFIO_MAPR - AF remap and debug I/O config register

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Kollegen,

    hoffe es gibt genug Programmierer die keine Bibliotheken verwenden, sondern die Register direkt programmieren.

    Bin dabei Programmteile eines auf STM3L2476RG funktionierenden CAN-Treibers auf den STM32F103RB anzupassen und . . . es will nicht.
    Den Treiber für STM3L2476RG hab ich selbst programmiert und hoffte genug Kenntnisse dafür gesammelt zu haben.

    Der Fehler ist auf den AFIO_MAP Register eingegrenzt.
    Hier sollen die CAN Tx und Rx auf die Pins Port B, Pin 8(Rx) und 9(Tx) remapped werden.
    AFIO_MAP, Bits [14:13] = 0xb10 setzten -> CAN_RX mapped to PB8, CAN_TX - to PB9.

    Leider wird die Bitkombination NICHT in das Register übernommen. ????

    Habe
    - Takt auf AFIO geschaltet (RCC_APB2ENR, Bit 0 = 1).
    Port B wird vom selben APB2 getaktet und die Register des Port B nehmen Änderungen an - > APB2 ist mit Takt versorgt.

    - CAN Rx und Tx, Pins B8, B9 eingestellt und erst dann remapped. Hab es auch anders rum versucht . . .

    - Die Register Adressen und Offsetzs mehr Malls geprüft.

    Unten der Code und . . . Danke für jeden Hinweis:

    ++++++++++++++++++++++++++++++++++++++++++++++++++
    void GpioInit(void) {

    #define CNF_MODE_INPUT_ANALOG 0x00
    #define CNF_MODE_INPUT_FLOATING 0x04 /* reset value */
    #define CNF_MODE_INPUT_PU_PD 0x08
    #define CNF_MODE_OUTPUT_PP_10MHz 0x01
    #define CNF_MODE_OUTPUT_OD_10MHz 0x05
    #define CNF_MODE_OUTPUT_AF_PP_10MHz 0x09
    #define CNF_MODE_OUTPUT_AF_OD_10MHz 0x0D

    uGPIO_CRH * pGpioBCrH = (uGPIO_CRH *)0x40010C04;
    uGPIO_CRH GpioBCrH;
    uGPIOx_ODR * pGpioBOdr = (uGPIOx_ODR *)0x40010C0C;
    uGPIOx_ODR GpioBOdr;
    uAFIO_MAPR * pAfioMap = (uAFIO_MAPR *)0x40010004;
    uAFIO_MAPR AfioMap;

    GpioBCrH.All = 0;
    GpioBCrH.Bit.CnfMode08 = CNF_MODE_INPUT_PU_PD; //CAN_Rx
    GpioBCrH.Bit.CnfMode09 = CNF_MODE_OUTPUT_AF_PP_10MHz; //CAN_Tx
    pGpioBCrH->All = GpioBCrH.All;

    GpioBOdr.All = 0;
    GpioBOdr.Bit.ODR08 = 1; //pull-up for CAN_Rx
    pGpioBOdr->All = GpioBOdr.All;

    AfioMap.All = 0;
    AfioMap.Bit.CAN_REMAP = 2; //2: CAN remapping to PB8-Rx, PB9-Tx - AN DIESEM BEFEHL SCHEITERT ES
    pAfioMap->All = AfioMap.All;

    }


    ++++++++++++++++++++++
    Die Bitfelder sehen so oder änlich aus:

    typedef struct {
    unsigned long CnfMode08 : 4;
    unsigned long CnfMode09 : 4;
    unsigned long CnfMode10 : 4;
    unsigned long CnfMode11 : 4;
    unsigned long CnfMode12 : 4;
    unsigned long CnfMode13 : 4;
    unsigned long CnfMode14 : 4;
    unsigned long CnfMode15 : 4;
    } tGPIO_CRH;

    typedef union {
    tGPIO_CRH Bit;
    unsigned long All;
    } uGPIO_CRH;

    +++++++++++++++++++++++++++++++++++++++++++

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Die Doku sagt

    For alternate function outputs, the port must be configured in Alternate Function Output mode (Push-Pull or Open-Drain).
    For bidirectional Alternate Functions, the port bit must be configured in Alternate Function Output mode (Push-Pull or Open-Drain). In this case the input driver is configured in input floating mode
    Wenn ich deinen Code + Kommentare gerade richtig deute sind deine Pins aber im Pull-Up, oder ist das eine Zusatzfunktion bei STM?!

    Was für eine Variante des Chips hast du, die Doku sagt die Variante mit 36 Pins hat dieses Remap nicht
    10: CAN_RX mapped to PB8, CAN_TX mapped to PB9 (not available on 36-pin package)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Du must das Bit AFIOEN Bit 0 im RCC_APB2ENR erst setzen
    APB2 peripheral clock enable register (RCC_APB2ENR)

    Bit 0 AFIOEN: Alternate function IO clock enable
    Set and cleared by software.
    0: Alternate Function IO clock disabled
    1: Alternate Function IO clock enabled

    Siro

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    - Takt auf AFIO geschaltet (RCC_APB2ENR, Bit 0 = 1).
    hat er doch meinte er!?
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    @Ceos:
    Okay, sorry, das habe ich jetzt im Code nicht gesehen.

    evtl. muss er auch noch den IOPBEN: IO port B clock enable einschalten ? da bin ich mir aber nicht sicher.
    Ich hab das bei meinen LPC Cortex Controllern auch,
    dass da etliche von Clocks erstmal eingeschaltet werden müssen,
    damit man auf die Register überhaupt zugreifen kann.

    Siro

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33
    Hallo und schönen Abend allerseits

    DANKE erstmal für die Antworten.

    . . . der Chip hat 64 Pins - also sollte der Remapp eigentlich funktionieren.
    . . . Takt für Port B und auch für AFIO ist AN.
    . . . CAN Rx -PB8 wurde auch schon mal ins input floating gesetzt - ohne Erfolg.

    In mehreren C-Codes mit Librarys wird der Rx Pin in GPIO_Mode_IPU = Input, Pull Up gesetzt. So habe ich es auch gemacht. Das ist aber erst für den CAN Daten Transfer wichtig, so weit ist es leider noch nicht.

    Die Frage ist eigentlich - wie kriegt man die AFIO zum laufen?
    Warum werden die Bits im AFIO_MAPR Register nicht gesetzt? Jedes Bit steht auf 0 und reagiert auf nichts.

    Die GPIO Register für Port B kann ich sogar in Eclipse in der View "Variable" mit neuen Werten belegen. Es geht.
    Das AFIO_MAPR reagiert auf gar nichts, kein Bit - so als ob das Register defekt ist oder keinen Takt bekommt.
    Ich meine - theoretisch kann natürlich schon mal was zu Bruch gehen aber - die Dinge sind ja fast unkaputbar, oder . . . ???
    Geändert von arwar52 (26.02.2019 um 21:30 Uhr)

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Ein defektes Register ist quasi ausgeschlossen, aber ich habe über die Suche nach ähnlichen Problemen 2 Dinge gefunden

    Zum einen scheint das Register WriteOnly zu sein, jedes zurücklesen wird also sinnlos sein. Wie sich das mit dem debug monitor verhält kann ich dir nicht sagen.

    Zum anderen lese ich immer weider von einem gelösten Issue mit der library aber keine konkreten Hinweise oder tiefer gehende Links, aber es hört sich so an als ob du mal deine Libarys und die IDE/Compiler auf Aktualisierungen prüfen solltest
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Ich hab hier auch noch was gefunden:
    Ob das weiterhilft weis ich aber nicht

    Klicke auf die Grafik für eine größere Ansicht

Name:	Errata_1.png
Hits:	4
Größe:	90,3 KB
ID:	34032
    Siro

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33
    . . . @ Siro
    Alle andere Schnittstellen habe ich schon ausgeschaltet - kein Takt, keine Aktivierung.
    Remapp muss, leider, sein da nur über PB8 und PB9 CAN mit dem auf Board verhandenen CAN Transiver connected ist.

    Aus RM0008 - Reference manual, Seite 184 - 185
    ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++
    Bits 14:13 CAN_REMAP[1:0]: CAN alternate function remapping
    These bits are set and cleared by software. They control the mapping of alternate functions
    CAN_RX and CAN_TX in devices with a single CAN interface.
    00: CAN_RX mapped to PA11, CAN_TX mapped to PA12
    01: Not used
    10: CAN_RX mapped to PB8, CAN_TX mapped to PB9 (not available on 36-pin package)
    ++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++

    - - - Aktualisiert - - -

    @ Ceos " . . . Zum einen scheint das Register WriteOnly zu sein, jedes zurücklesen wird also sinnlos sein."

    Laut "RM0008 - Reference manual, Seite 184 - 185" " . . . STM32F103xx, . . ." ist der Register "ReadWrite".

    NUR Read - hat Sinn aus meiner Sicht, . . . was für ein Sinn steckt daninter ein Register NUR Writable zu machen???
    Obwohl auch in diesem Reg. sind die SWJCFG Bits NUR Writable ???

    Klicke auf die Grafik für eine größere Ansicht

Name:	AFIO_MARP.jpg
Hits:	1
Größe:	67,6 KB
ID:	34033

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Die Gründe sind sicher mannigfaltig, aber ja, es scheinen tatsächlich nur die Bits zu sein, also unwichtig für dein Problem ...

    bietet STM nicht üblicherweise auch ein Tool an mit dem man die Peripherie vorkonfigurieren kann?! Vielleicht findest du den notwendigen Trick in dem generierten Code?
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Stop Befehl = Register direkt beschreiben
    Von demmy im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 19.03.2013, 18:19
  2. MPU6000 übernimmt Register nicht
    Von Che Guevara im Forum Sensoren / Sensorik
    Antworten: 0
    Letzter Beitrag: 14.12.2012, 19:32
  3. Register AT90CAN128 beschreiben
    Von kaempferin1 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 01.02.2006, 08:34
  4. Interne Register und Register in SRAM
    Von FoCus im Forum AVR Hardwarethemen
    Antworten: 9
    Letzter Beitrag: 27.07.2005, 13:06
  5. UART Bautraten Register beschreiben?
    Von kautz im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 01.03.2005, 10:04

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus