- 모든 외부 장치는 Port, Pin 을 통해 MCU와 연결
- 원하는 Port/Pin에 clock을 부여, 포트 설정을 한 뒤 입출력 가능
- 데이터시트에 각 레지스터에 대한 메모리 맵핑 주소가 나와 있음
- APB(advanced Preipheral Bus)2에 각 GPIO포트가 할당되어 있는 것을 확인할 수 있음
- 각 할당된 주소에 offset을 더하면 해당 레지스터 주소가 됨
레퍼런스 문서에 각 레지스터 설정값과 설명들이 나와 있음
포트의 핀 설정시 주의사항
- 레지스터의 사용하려는 부분을 0으로 초기화 후사용
- 0011(output push-pull 50MHz) = 0x3
|= 0x30000000 (X)
Reset value |= 0x3;
0100(2) -> 0111(2)(X) (output Open-drain 50MHz)
- 레퍼런스 문서에 각 레지스터설명과, 원하는 설정을 위한 bit Setting 값이 나와있음.
Bitwise Operation
AND 연산 : &
- 0b0011 & 0b0101 == 0b0001
- X & 0 == 0
- X & 1 == X
OR 연산 : |
- 0b0011 | 0b0101 == 0b0111
- X | 0 == X
- X | 1 == 1
XOR 연산 : ^
- 0b0011 ^ 0b0101 == 0b0110
- X ^ 0 == X
- X ^ 1 == ~X
Not 연산 : ~
- ~0b01 == 0b10
- ~0 = 1
- ~1 = 0
Shift 연산 : <<, >>
- 0b01011 << 1 == 0b10110
- 0b01011 >> 1 == 0b00101
Volatile Keyword
volatile 선언된 변수는 컴파일러가 최적화를 수행하지 않음.
(접근 시 항상 메모리 참조)
원하는 포트와 핀(GPIO)을 제어하기 위해 해야할 일들

각 레지스터의 필드값은 초기화 후 원하는 값을 대입해야 합니다. 기존 reset value가 이미 들어있기 때문에 그냥 |=로 대입하면 다른 값이 됩니다.
예) GPIO 포트 B 0번핀 input with pull-up / pull-down 설정 (GPIOB_CRL 레지스터 이용)
*((volatile unsigned int *)0x40010C00) &= ~0x0000000F; // 0번핀 관련 필드만 0값으로 초기화
*((volatile unsigned int *)0x40010C00) |= 0x00000008; // 0번핀 input with pull-up/pull-down 모드 설정
RCC_APB2ENR 레지스터에 넣고 싶다 하면 ReferenceManual.pdf 를 키고 ctrl+f 눌려서 RCC_APB2ENR 을 검색해보세요. 레지스터의 각 bit 들이 뭐를 의미하는지 다 나와있습니다. 포트 A에 clock을 주고 싶다 하면 RCC_APB2ENR 레지스터의 Bit2 IOPAEN에 1을 넣어야 되므로 0b100,즉, 0x4 값을 레지스터에 넣으면 되겠죠
오실로스코프

멀티미터

작성코드 및 보고서 : https://github.com/yunzae/Embeded-System/tree/main/Embeded/3주차
'Project > 나만의 주점(STM32,Arduino,android)' 카테고리의 다른 글
STM32- LCD 및 ADC (0) | 2022.12.16 |
---|---|
STM32-블루투스 (1) | 2022.12.16 |
STM32- Interrupt 방싱을 활용한 GPIO 제어 및 UART 통신 (0) | 2022.12.16 |
STM32- Clock tree (0) | 2022.12.16 |
STM32- Scatter file (0) | 2022.12.16 |