Kann Register nicht beschreiben - AFIO_MAPR - AF remap and debug I/O config register
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;
+++++++++++++++++++++++++++++++++++++++++++
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab hier auch noch was gefunden:
Ob das weiterhilft weis ich aber nicht
Anhang 34032
Siro
Liste der Anhänge anzeigen (Anzahl: 1)
. . . @ 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 ???:confused:
Anhang 34033