LBubble schrieb:
> mit dem man
> Register einfach à la RegisterXYZ |= 0x0101010101 maskieren kann.
> Beim STM32 spreche ich die Register über structs an, also GPIOx->ODR =
> 0x010101101;.
Hi,
allgemein:
1 | GPIOx->ODR |= 0x010101101;
|
2 | GPIOx_ODR |= 0x010101101;
|
ist "das gleiche". In beiden Fällen steckt eine Adresse dahinter, nur
die Adressbildung ist anders. Im ersten Fall berechnet der Compiler die
Adresse aus BASE+OFFSET, im zweiten Fall hat der Vendor das im
Headerfile selbst addiert.
Im Zuge der Standardisierung unter CMSIS wurde das für alle Cortex-M
Devices vereinheitlicht.
Zum Einen erhöht es die Übersichtlichkeit (struct TIMER_type und
#define-Mapping auf TIMER0,1,2,3,n), und zum Anderen ermöglicht es Tools
mit IntelliSense Feature das automatische Einsehen der Member
(Register).
1 | /*------------------------ General Purpose and Alternate Function IO ---------*/
|
2 | typedef struct {
|
3 | __IO uint32_t CRL;
|
4 | __IO uint32_t CRH;
|
5 | __IO uint32_t IDR;
|
6 | __IO uint32_t ODR;
|
7 | __IO uint32_t BSRR;
|
8 | __IO uint32_t BRR;
|
9 | __IO uint32_t LCKR;
|
10 | } GPIO_TypeDef;
|
11 |
|
12 | #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
|
13 | #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
|
14 | #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
|
15 | #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
|
16 | #define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
|
17 | #define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
|
18 | #define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
|
STM32 speziell:
Im Gegensatz zu einigen anderen Controllern (AVR, LMI CM3, NXP) hat STM
die PortPin-Konfigurationsmöglichkeiten in 2x 2Bits verpackt: MODE und
CONF.
Hintergrund ist das Glitchfreie Umschalten zwischen den Modes.
VG,
/th.