arwar52
25.02.2019, 19:49
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;
+++++++++++++++++++++++++++++++++++++++++++
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;
+++++++++++++++++++++++++++++++++++++++++++