Atmel에서 AT91SAM7X256을 프로그래밍 중이며 레지스터를 정의하는 매크로와이를 사용하는 방법에 대해 조금 혼란 스럽습니다.비트를 설정하는 매크로 확장
나는 같은 라인을 사용하는 레지스터의 비트 설정하려면 다음 나는 매크로 확장 후이 볼 때 이런 식으로 뭔가 보이는 지금
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PWMC;
을 :
((AT91PS_PMC) 0xFFFFFC00)->PMC_PCER = 1 << (10);
정의를 파일에서 찾을 수있는 것 AT91SAM7X256.h
#ifndef __ASSEMBLY__
typedef volatile unsigned int AT91_REG;// Hardware register definition
#define AT91_CAST(a) (a)
#else
#define AT91_CAST(a)
#endif
하고는 내가 더 아래
...
#define AT91C_BASE_CKGR (AT91_CAST(AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address
#define AT91C_BASE_PMC (AT91_CAST(AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address
#define AT91C_BASE_RSTC (AT91_CAST(AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address
...
AT91C_BASE_PMC의 (고화질)은 그래서이 매우 간단 확장받을 것으로 보인다 찾을 수 있습니다. 마찬가지로 매크로 AT91C_ID_PWMC는
...
#define AT91C_ID_TWI (9) // Two-Wire Interface
#define AT91C_ID_PWMC (10) // PWM Controller
#define AT91C_ID_UDP (11) // USB Device Port
...
로 정의되어 있지만 어떻게 역 참조 ((AT91PS_PMC) 0xFFFFFC00가) 수행 -> PMC_PCER 사용할 수 있습니까? PMC_PCER에 대한 몇 가지 정의를 찾을 수 있습니다.
#ifndef __ASSEMBLY__
typedef struct _AT91S_SYS {
...
AT91_REG Reserved20[1]; //
AT91_REG PMC_PCER; // Peripheral Clock Enable Register
AT91_REG PMC_PCDR; // Peripheral Clock Disable Register
...
} AT91S_SYS, *AT91PS_SYS;
#else
#endif
그리고 다시 내려 간다.
#ifndef __ASSEMBLY__
typedef struct _AT91S_PMC {
...
AT91_REG Reserved0[1]; //
AT91_REG PMC_PCER; // Peripheral Clock Enable Register
AT91_REG PMC_PCDR; // Peripheral Clock Disable Register
...
} AT91S_PMC, *AT91PS_PMC;
#else
...
#define PMC_SCSR (AT91_CAST(AT91_REG *) 0x00000008) // (PMC_SCSR) System Clock Status Register
#define PMC_PCER (AT91_CAST(AT91_REG *) 0x00000010) // (PMC_PCER) Peripheral Clock Enable Register
#define PMC_PCDR (AT91_CAST(AT91_REG *) 0x00000014) // (PMC_PCDR) Peripheral Clock Disable Register
...
#endif
그래서 제 질문은
- 어떻게 그 매크로 작업을 할 수 있습니다?
- 나는 AT91C_BASE_PMC-> PMC_PCER = 1 식으로 단일 비트를 설정할 수 있다는 인상을 가지고있다. < < AT91C_ID_PWMC; ? 사실입니까?
- 어떻게 그 비트를 해제하겠습니까?
- 값을 직접 설정하는 것이 아니라 왜 이렇게 복잡합니까?
감사합니다. 아주 좋은 설명. 나는 functionally를 가능하게하는 쓰기 전용 레지스터에 쓰기 때문에 단일 비트와 혼동을 느꼈지만 별도의 레지스터는 functionallity를 비활성화합니다. – Lucas