Hallo zusammen, ich versuche gerade einen einfachen Pin auf High (MCU: MKL26xxx) zu setzten, leider funktioniert das irgendwie nicht so einfach wie bei den AVR's. Bin mir nicht sicher was ich falsch mache bzw. habe den Verdacht das ich generell irgendetwas bei ARM-Programmierung übersehe. vllt könnt Ihr mir helfen wie ich ein einfachen Pin (hier PTC01) auf High setzte bzw. mich aufklären was ich Falsch mache... Danke schon mal im Vorfeld für eure Unterstützung. Nach dem Hauptprogramm hab ich noch Auszüge aus der Headerdatei MKL26Z4. eingefügt. Hauptprogramm: #include "system_MKL26Z4.h" #include "MKL26Z4.h" int main (void){ SystemInit(); PORTC->PCR[1]|=(1<<8); // Pin PTC01 auf Alternative 1 (GPIO) PTC->PDDR|=(1<<1); //Pin PTC01 auf Ausgang PTC->PDOR|=(1<<1); //Pin PTC01 auf High while(1){ } return 0; } /* ------------------------------------------------------------------------ ---- -- GPIO Peripheral Access Layer ------------------------------------------------------------------------ ---- */ /*! * @addtogroup GPIO_Peripheral_Access_Layer GPIO Peripheral Access Layer * @{ */ /** GPIO - Register Layout Typedef */ typedef struct { __IO uint32_t PDOR; /**< Port Data Output Register, offset: 0x0 */ __O uint32_t PSOR; /**< Port Set Output Register, offset: 0x4 */ __O uint32_t PCOR; /**< Port Clear Output Register, offset: 0x8 */ __O uint32_t PTOR; /**< Port Toggle Output Register, offset: 0xC */ __I uint32_t PDIR; /**< Port Data Input Register, offset: 0x10 */ __IO uint32_t PDDR; /**< Port Data Direction Register, offset: 0x14 */ } GPIO_Type; /* ------------------------------------------------------------------------ ---- -- GPIO Register Masks ------------------------------------------------------------------------ ---- */ /*! * @addtogroup GPIO_Register_Masks GPIO Register Masks * @{ */ /* PDOR Bit Fields */ #define GPIO_PDOR_PDO_MASK 0xFFFFFFFFu #define GPIO_PDOR_PDO_SHIFT 0 #define GPIO_PDOR_PDO(x) (((uint32_t)(((uint32_t)(x))<<GPIO_PDOR_PDO_SHIFT))&GPIO_PDOR_PDO_MASK) /* PSOR Bit Fields */ #define GPIO_PSOR_PTSO_MASK 0xFFFFFFFFu #define GPIO_PSOR_PTSO_SHIFT 0 #define GPIO_PSOR_PTSO(x) (((uint32_t)(((uint32_t)(x))<<GPIO_PSOR_PTSO_SHIFT))&GPIO_PSOR_PTSO_MASK ) /* PCOR Bit Fields */ #define GPIO_PCOR_PTCO_MASK 0xFFFFFFFFu #define GPIO_PCOR_PTCO_SHIFT 0 #define GPIO_PCOR_PTCO(x) (((uint32_t)(((uint32_t)(x))<<GPIO_PCOR_PTCO_SHIFT))&GPIO_PCOR_PTCO_MASK ) /* PTOR Bit Fields */ #define GPIO_PTOR_PTTO_MASK 0xFFFFFFFFu #define GPIO_PTOR_PTTO_SHIFT 0 #define GPIO_PTOR_PTTO(x) (((uint32_t)(((uint32_t)(x))<<GPIO_PTOR_PTTO_SHIFT))&GPIO_PTOR_PTTO_MASK ) /* PDIR Bit Fields */ #define GPIO_PDIR_PDI_MASK 0xFFFFFFFFu #define GPIO_PDIR_PDI_SHIFT 0 #define GPIO_PDIR_PDI(x) (((uint32_t)(((uint32_t)(x))<<GPIO_PDIR_PDI_SHIFT))&GPIO_PDIR_PDI_MASK) /* PDDR Bit Fields */ #define GPIO_PDDR_PDD_MASK 0xFFFFFFFFu #define GPIO_PDDR_PDD_SHIFT 0 #define GPIO_PDDR_PDD(x) (((uint32_t)(((uint32_t)(x))<<GPIO_PDDR_PDD_SHIFT))&GPIO_PDDR_PDD_MASK) /*! * @} */ /* end of group GPIO_Register_Masks */ /* GPIO - Peripheral instance base addresses */ /** Peripheral PTA base address */ #define PTA_BASE (0x400FF000u) /** Peripheral PTA base pointer */ #define PTA ((GPIO_Type *)PTA_BASE) /** Peripheral PTB base address */ #define PTB_BASE (0x400FF040u) /** Peripheral PTB base pointer */ #define PTB ((GPIO_Type *)PTB_BASE) /** Peripheral PTC base address */ #define PTC_BASE (0x400FF080u) /** Peripheral PTC base pointer */ #define PTC ((GPIO_Type *)PTC_BASE) /** Peripheral PTD base address */ #define PTD_BASE (0x400FF0C0u) /** Peripheral PTD base pointer */ #define PTD ((GPIO_Type *)PTD_BASE) /** Peripheral PTE base address */ #define PTE_BASE (0x400FF100u) /** Peripheral PTE base pointer */ #define PTE ((GPIO_Type *)PTE_BASE) /** Array initializer of GPIO peripheral base pointers */ #define GPIO_BASES { PTA, PTB, PTC, PTD, PTE } /*! * @} */ /* end of group GPIO_Peripheral_Access_Layer */ /* ------------------------------------------------------------------------ ---- -- PORT Peripheral Access Layer ------------------------------------------------------------------------ ---- */ /*! * @addtogroup PORT_Peripheral_Access_Layer PORT Peripheral Access Layer * @{ */ /** PORT - Register Layout Typedef */ typedef struct { __IO uint32_t PCR[32]; /**< Pin Control Register n, array offset: 0x0, array step: 0x4 */ __O uint32_t GPCLR; /**< Global Pin Control Low Register, offset: 0x80 */ __O uint32_t GPCHR; /**< Global Pin Control High Register, offset: 0x84 */ uint8_t RESERVED_0[24]; __IO uint32_t ISFR; /**< Interrupt Status Flag Register, offset: 0xA0 */ } PORT_Type; /* ------------------------------------------------------------------------ ---- -- PORT Register Masks ------------------------------------------------------------------------ ---- */ /*! * @addtogroup PORT_Register_Masks PORT Register Masks * @{ */ /* PCR Bit Fields */ #define PORT_PCR_PS_MASK 0x1u #define PORT_PCR_PS_SHIFT 0 #define PORT_PCR_PE_MASK 0x2u #define PORT_PCR_PE_SHIFT 1 #define PORT_PCR_SRE_MASK 0x4u #define PORT_PCR_SRE_SHIFT 2 #define PORT_PCR_PFE_MASK 0x10u #define PORT_PCR_PFE_SHIFT 4 #define PORT_PCR_DSE_MASK 0x40u #define PORT_PCR_DSE_SHIFT 6 #define PORT_PCR_MUX_MASK 0x700u #define PORT_PCR_MUX_SHIFT 8 #define PORT_PCR_MUX(x) (((uint32_t)(((uint32_t)(x))<<PORT_PCR_MUX_SHIFT))&PORT_PCR_MUX_MASK) #define PORT_PCR_IRQC_MASK 0xF0000u #define PORT_PCR_IRQC_SHIFT 16 #define PORT_PCR_IRQC(x) (((uint32_t)(((uint32_t)(x))<<PORT_PCR_IRQC_SHIFT))&PORT_PCR_IRQC_MASK) #define PORT_PCR_ISF_MASK 0x1000000u #define PORT_PCR_ISF_SHIFT 24 /* GPCLR Bit Fields */ #define PORT_GPCLR_GPWD_MASK 0xFFFFu #define PORT_GPCLR_GPWD_SHIFT 0 #define PORT_GPCLR_GPWD(x) (((uint32_t)(((uint32_t)(x))<<PORT_GPCLR_GPWD_SHIFT))&PORT_GPCLR_GPWD_MA SK) #define PORT_GPCLR_GPWE_MASK 0xFFFF0000u #define PORT_GPCLR_GPWE_SHIFT 16 #define PORT_GPCLR_GPWE(x) (((uint32_t)(((uint32_t)(x))<<PORT_GPCLR_GPWE_SHIFT))&PORT_GPCLR_GPWE_MA SK) /* GPCHR Bit Fields */ #define PORT_GPCHR_GPWD_MASK 0xFFFFu #define PORT_GPCHR_GPWD_SHIFT 0 #define PORT_GPCHR_GPWD(x) (((uint32_t)(((uint32_t)(x))<<PORT_GPCHR_GPWD_SHIFT))&PORT_GPCHR_GPWD_MA SK) #define PORT_GPCHR_GPWE_MASK 0xFFFF0000u #define PORT_GPCHR_GPWE_SHIFT 16 #define PORT_GPCHR_GPWE(x) (((uint32_t)(((uint32_t)(x))<<PORT_GPCHR_GPWE_SHIFT))&PORT_GPCHR_GPWE_MA SK) /* ISFR Bit Fields */ #define PORT_ISFR_ISF_MASK 0xFFFFFFFFu #define PORT_ISFR_ISF_SHIFT 0 #define PORT_ISFR_ISF(x) (((uint32_t)(((uint32_t)(x))<<PORT_ISFR_ISF_SHIFT))&PORT_ISFR_ISF_MASK) /*! * @} */ /* end of group PORT_Register_Masks */ /* PORT - Peripheral instance base addresses */ /** Peripheral PORTA base address */ #define PORTA_BASE (0x40049000u) /** Peripheral PORTA base pointer */ #define PORTA ((PORT_Type *)PORTA_BASE) /** Peripheral PORTB base address */ #define PORTB_BASE (0x4004A000u) /** Peripheral PORTB base pointer */ #define PORTB ((PORT_Type *)PORTB_BASE) /** Peripheral PORTC base address */ #define PORTC_BASE (0x4004B000u) /** Peripheral PORTC base pointer */ #define PORTC ((PORT_Type *)PORTC_BASE) /** Peripheral PORTD base address */ #define PORTD_BASE (0x4004C000u) /** Peripheral PORTD base pointer */ #define PORTD ((PORT_Type *)PORTD_BASE) /** Peripheral PORTE base address */ #define PORTE_BASE (0x4004D000u) /** Peripheral PORTE base pointer */ #define PORTE ((PORT_Type *)PORTE_BASE) /** Array initializer of PORT peripheral base pointers */ #define PORT_BASES { PORTA, PORTB, PORTC, PORTD, PORTE } /*! * @} */ /* end of group PORT_Peripheral_Access_Layer */
1.) Wie sieht Deine SystemInit() aus? Werden da die Clocks für die GPIO-Ports bereits eingeschaltet? Wenn nein dann mach das:
1 | // PORT C einschalten
|
2 | SIM->SCGC5 |= SIM_SCGC5_PORTC_MASK; |
3 | |
4 | // Pin PTC01 auf Alternative 1 (GPIO)
|
5 | PORTC->PCR[1] = PORT_PCR_MUX(1); |
6 | |
7 | PTC->PDDR |= (1 << 1); //Pin PTC01 auf Ausgang |
8 | PTC->PDOR |= (1 << 1); //Pin PTC01 auf High |
Beachte daß ich das nicht ins PCR[1] Register reingeodert sondern reingeschrieben habe! 2.) Kannst Du mal nachschauen ob in Deinem Startup-Code die SystemInit() bereits vor der main() aufgerufen wird, wenn ja dann musst Du das nicht nochmal in main() tun. 3.) hier hab ich für den KL25 (Du hast den KL26) ein kleines Demo-Projekt, das ist zwar ein geringfügig anderer Prozessor aber sehr sehr ähnlich, teilweise fast gleich: https://github.com/prof7bit/frdm-kl25z-minimal-usb-hid Du kannst ja mal versuchen das auf den KL26 zu portieren (musst Startup anpassen (die Vektoren), Linker-Script anpassen, MKLxxZyy-Header austauschen, Ordner umbenennen, Makefile anpassen, schaun ob USB unverändert funktioniert (wahrscheinlich), wenn nicht Unterschied finden und entsprechend anpassen), das wäre eine nette Übung für den Einstieg.
:
Bearbeitet durch User
Hallo Bernd K. erstmal danke für deine Antwort... nein ich ruf SystemInit() nicht davor auf. mein SystemInit() sieht so aus: #define DISABLE_WDOG 1 #define CLOCK_SETUP 1 /* Predefined clock setups 0 ... Multipurpose Clock Generator (MCG) in FLL Engaged Internal (FEI) mode Reference clock source for MCG module is the slow internal clock source 32.768kHz Core clock = 41.94MHz, BusClock = 13.98MHz 1 ... Multipurpose Clock Generator (MCG) in PLL Engaged External (PEE) mode Reference clock source for MCG module is an external crystal 8MHz Core clock = 48MHz, BusClock = 24MHz 2 ... Multipurpose Clock Generator (MCG) in Bypassed Low Power External (BLPE) mode Core clock/Bus clock derived directly from an external crystal 8MHz with no multiplication Core clock = 8MHz, BusClock = 8MHz */ /*---------------------------------------------------------------------- ------ Define clock source values *----------------------------------------------------------------------- -----*/ #if (CLOCK_SETUP == 0) #define CPU_XTAL_CLK_HZ 8000000u /* Value of the external crystal or oscillator clock frequency in Hz */ #define CPU_INT_SLOW_CLK_HZ 32768u /* Value of the slow internal oscillator clock frequency in Hz */ #define CPU_INT_FAST_CLK_HZ 4000000u /* Value of the fast internal oscillator clock frequency in Hz */ #define DEFAULT_SYSTEM_CLOCK 41943040u /* Default System clock value */ #elif (CLOCK_SETUP == 1) #define CPU_XTAL_CLK_HZ 8000000u /* Value of the external crystal or oscillator clock frequency in Hz */ #define CPU_INT_SLOW_CLK_HZ 32768u /* Value of the slow internal oscillator clock frequency in Hz */ #define CPU_INT_FAST_CLK_HZ 4000000u /* Value of the fast internal oscillator clock frequency in Hz */ #define DEFAULT_SYSTEM_CLOCK 48000000u /* Default System clock value */ #elif (CLOCK_SETUP == 2) #define CPU_XTAL_CLK_HZ 8000000u /* Value of the external crystal or oscillator clock frequency in Hz */ #define CPU_INT_SLOW_CLK_HZ 32768u /* Value of the slow internal oscillator clock frequency in Hz */ #define CPU_INT_FAST_CLK_HZ 4000000u /* Value of the fast internal oscillator clock frequency in Hz */ #define DEFAULT_SYSTEM_CLOCK 8000000u /* Default System clock value */ #endif /* (CLOCK_SETUP == 2) */ /* ------------------------------------------------------------------------ ---- -- Core clock ------------------------------------------------------------------------ ---- */ uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK; /* ------------------------------------------------------------------------ ---- -- SystemInit() ------------------------------------------------------------------------ ---- */ /* ------------------------------------------------------------------------ ---- -- SystemInit() ------------------------------------------------------------------------ ---- */ void SystemInit (void) { #if (DISABLE_WDOG) /* Disable the WDOG module */ /* SIM_COPC: COPT=0,COPCLKS=0,COPW=0 */ SIM->COPC = (uint32_t)0x00u; #endif /* (DISABLE_WDOG) */ #if (CLOCK_SETUP == 0) /* SIM->CLKDIV1: OUTDIV1=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,OUTDIV4=2,??=0,?? =0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0 */ SIM->CLKDIV1 = (uint32_t)0x00020000UL; /* Update system prescalers */ /* Switch to FEI Mode */ /* MCG->C1: CLKS=0,FRDIV=0,IREFS=1,IRCLKEN=1,IREFSTEN=0 */ MCG->C1 = (uint8_t)0x06U; /* MCG->C2: LOCRE0=0,RANGE0=0,HGO0=0,EREFS0=0,LP=0,IRCS=0 */ MCG->C2 &= (uint8_t)~(uint8_t)0xBFU; /* MCG->C4: DMX32=0,DRST_DRS=1 */ MCG->C4 = (uint8_t)((MCG->C4 & (uint8_t)~(uint8_t)0xC0U) | (uint8_t)0x20U); /* OSC0->CR: ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=0,SC4P=0,SC8P=0,SC16P=0 */ OSC0->CR = (uint8_t)0x80U; /* MCG->C5: ??=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=0 */ MCG->C5 = (uint8_t)0x00U; /* MCG->C6: LOLIE0=0,PLLS=0,CME0=0,VDIV0=0 */ MCG->C6 = (uint8_t)0x00U; while((MCG->S & MCG_S_IREFST_MASK) == 0x00U) { /* Check that the source of the FLL reference clock is the internal reference clock. */ } while((MCG->S & 0x0CU) != 0x00U) { /* Wait until output of the FLL is selected */ } #elif (CLOCK_SETUP == 1) /* SIM->SCGC5: PORTA=1 */ SIM->SCGC5 |= (uint32_t)0x0200UL; /* Enable clock gate for ports to enable pin routing */ /* SIM->CLKDIV1: OUTDIV1=1,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,OUTDIV4=1,??=0,?? =0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0 */ SIM->CLKDIV1 = (uint32_t)0x10010000UL; /* Update system prescalers */ /* PORTA->PCR18: ISF=0,MUX=0 */ PORTA->PCR[18] &= (uint32_t)~0x01000700UL; /* PORTA->PCR19: ISF=0,MUX=0 */ PORTA->PCR[19] &= (uint32_t)~0x01000700UL; /* Switch to FBE Mode */ /* MCG->C2: LOCRE0=0,RANGE0=2,HGO0=0,EREFS0=1,LP=0,IRCS=0 */ MCG->C2 = (uint8_t)((MCG->C2 & (uint8_t)~(uint8_t)0x9BU) | (uint8_t)0x24U); /* OSC0->CR: ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=1,SC4P=0,SC8P=0,SC16P=0 */ OSC0->CR = (uint8_t)0x80U; /* MCG_C1: CLKS=2,FRDIV=3,IREFS=0,IRCLKEN=1,IREFSTEN=0 */ MCG->C1 = (uint8_t)0x9AU; /* MCG->C4: DMX32=0,DRST_DRS=0 */ MCG->C4 &= (uint8_t)~(uint8_t)0xE0U; /* MCG->C5: ??=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=1 */ MCG->C5 = (uint8_t)0x01U; /* MCG->C6: LOLIE0=0,PLLS=0,CME0=0,VDIV0=0 */ MCG->C6 = (uint8_t)0x00U; while((MCG->S & MCG_S_IREFST_MASK) != 0x00U) { /* Check that the source of the FLL reference clock is the external reference clock. */ } while((MCG->S & 0x0CU) != 0x08U) { /* Wait until external reference clock is selected as MCG output */ } /* Switch to PBE Mode */ /* MCG->C6: LOLIE0=0,PLLS=1,CME0=0,VDIV0=0 */ MCG->C6 = (uint8_t)0x40U; while((MCG->S & 0x0CU) != 0x08U) { /* Wait until external reference clock is selected as MCG output */ } while((MCG->S & MCG_S_LOCK0_MASK) == 0x00U) { /* Wait until locked */ } /* Switch to PEE Mode */ /* MCG->C1: CLKS=0,FRDIV=3,IREFS=0,IRCLKEN=1,IREFSTEN=0 */ MCG->C1 = (uint8_t)0x1AU; while((MCG->S & 0x0CU) != 0x0CU) { /* Wait until output of the PLL is selected */ } #elif (CLOCK_SETUP == 2) /* SIM->SCGC5: PORTA=1 */ SIM->SCGC5 |= (uint32_t)0x0200UL; /* Enable clock gate for ports to enable pin routing */ /* SIM->CLKDIV1: OUTDIV1=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,OUTDIV4=0,??=0,?? =0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0 */ SIM->CLKDIV1 = (uint32_t)0x00000000UL; /* Update system prescalers */ /* PORTA->PCR18: ISF=0,MUX=0 */ PORTA->PCR[18] &= (uint32_t)~0x01000700UL; /* PORTA->PCR19: ISF=0,MUX=0 */ PORTA->PCR[19] &= (uint32_t)~0x01000700UL; /* Switch to FBE Mode */ /* MCG->C2: LOCRE0=0,??=0,RANGE0=2,HGO0=0,EREFS0=1,LP=0,IRCS=0 */ MCG->C2 = (uint8_t)0x24U; /* OSC0->CR: ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=1,SC4P=0,SC8P=0,SC16P=0 */ OSC0->CR = (uint8_t)0x80U; /* MCG->C1: CLKS=2,FRDIV=3,IREFS=0,IRCLKEN=1,IREFSTEN=0 */ MCG->C1 = (uint8_t)0x9AU; /* MCG->C4: DMX32=0,DRST_DRS=0 */ MCG->C4 &= (uint8_t)~(uint8_t)0xE0U; /* MCG->C5: ??=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=0 */ MCG->C5 = (uint8_t)0x00U; /* MCG->C6: LOLIE0=0,PLLS=0,CME0=0,VDIV0=0 */ MCG->C6 = (uint8_t)0x00U; while((MCG->S & MCG_S_IREFST_MASK) != 0x00U) { /* Check that the source of the FLL reference clock is the external reference clock. */ } while((MCG->S & 0x0CU) != 0x08U) { /* Wait until external reference clock is selected as MCG output */ } /* Switch to BLPE Mode */ /* MCG_C2: LOCRE0=0,RANGE0=2,HGO0=0,EREFS0=1,LP=1,IRCS=0 */ MCG->C2 = (uint8_t)((MCG->C2 & (uint8_t)~(uint8_t)0x99U) | (uint8_t)0x26U); while((MCG->S & 0x0CU) != 0x08U) { /* Wait until external reference clock is selected as MCG output */ } #endif /* (CLOCK_SETUP == 2) */ }
Bitte poste Codeschnipsel im Forum mit den C-Tags, sonst bekommt man Kopfschmerzen, ganze Dateien kannst Du auch mit der endung .c oder .h als Anhang anhängen.
1 | [c] |
2 | code... |
3 | [/c] |
Dein SystemInit() schaltet nur PORTA ein, weil es im Zuge der Taktkonfiguration irgendwas an den Xtal Pins herumkonfiguriert. Für jeden PORT (und für jedes andere Peripheriegerät ebenso gibt es in den SIM->SCGC4 (... bis SCGC7) Registern Bits zum Einschalten des Clocks und somit Einschalten der jeweiligen Peripherie. Per Default aus dem Reset heraus bekommen die erstmal keinen Clock aus Energiespargründen.
:
Bearbeitet durch User
Ok danke, ich wusste gar nicht das ich davor noch ein Clock setzen muss. wie ist den der Generelle Ablauf wenn ich den Microcontroller Initialisieren will und ein Pin setzen muss? bzw. Was muss ich davor beachten was gesetzt werden muss?
Arm'er Newbie schrieb: > Ok danke, ich wusste gar nicht das ich davor noch ein Clock setzen > muss. > > wie ist den der Generelle Ablauf wenn ich den Microcontroller > Initialisieren will und ein Pin setzen muss? bzw. Was muss ich davor > beachten was gesetzt werden muss? Das ist eigentlich schon alles. * SCGC5 Bit setzen zum Einschalten * PCR-Register für den jeweiligen Pin konfigurieren (dort befindet sich alternate-mux, evtl Interrupt, drive-strength, pullup) Kapitel 11.5.1 (PORT->PCR) * Ein-Ausgang konfigurieren wie oben bereits gemacht, Kapitel 42 * Lesen oder Ausgang Setzen wie oben bereits gemacht, Kapitel 42 Zum schnellen setzen und löschen kannst Du auch die PSOR und PCOR Register nehmen also statt
1 | PTC->PDOR |= (1 << 1); |
kannst Du schreiben:
1 | // Pin 1 setzen (und alle anderen gleich lassen)
|
2 | PTC->PSOR = (1 << 1); |
3 | |
4 | // Pin 1 loeschen (und alle anderen gleich lassen)
|
5 | PTC->PCOR = (1 << 1); |
Beachte: Hier hab ich nicht geodert sondern einfach reingeschrieben, alle bits die 0 sind bewirken nichts, alle die 1 sind bewirken setzen oder löschen. Es gibt auch noch ein PTOR Register zum Toggeln. Anstelle von PTA, PTB, PTC, PTD, PTE zum Setzen und Lesen in obigen Beispielen kannst Du auch FPTA, FPTB, FPTC, FPTD, FPTE verwenden, letztere gehen über einen anderen Bus, zeitgleich zum Instruction-Fetch und brauchen nur einen einzigen Taktzyklus. Nachteil ist letztere Adressen lassen sich nicht über den DMA erreichen. Das sind übrigens die einzigen Register die im Reference Manual anders heißen als sie in den Headern benannt sind. Im Manual musst Du bei Kapitel 42 GPIO schauen und dort heißen sie GPIOx (oder FGPIOx), im Header heißen sie PTx (bzw FPTx für die schnelle Busanbindung). Alle anderen Register heißen im Header genauso wie auch im Manual.
:
Bearbeitet durch User
Verdammte scheiße, es funktioniert!!!!!!!! Vielllen Dankeeeeeeeeeeee Bernd K. du weist gar nicht wie sehr du mir geholfen hast, ich will gar nicht erzählen wie lange ich hier schon am verzweifeln bin....ich würde dich jetzt am liebsten Knuddel :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.