HAL_Init();
// Ctrl + 코드 클릭

__HAL_FLASH_PREFETCH_BUFFER_ENABLE(); // 브레이크 포인트 걸어보기
분석할 코드를 메모장에 옮겨 적기

(FLASH->ACR |= FLASH_ACR_PRFTBE)
코드 분석하기

FLASH 구조 확인

* uint32_t
#typedef unsigned int uint32_t : 4바이트
* __IO
#define __IO volatile
volatile : 컴파일러가 최적화하는 것을 방지를 위해서 사용
FLASH 주소 : 40022000
레지스터 이름을 정해서 구조체화한 것
0 ACR 40022000
4 KEYR 40022004
8 OPTKEYR 40022008
12 SR 4002200C
16 CR 4002200F
20 AR 40022014
24 RESERVED 40022018
28 OBR 4002201C
32 WRPR 4002201F
메모리 번지에 접근해라
FLASH -> ACR (0) 번지
FLASH -> KETR (4) 번지 , ...
gpio에 따라 a가 바뀌는 상황도 있는데 최적화 해버리면 의도한대로 동작할 수 없음
int a = 3;
a = 7;
a = 8;
a = 12;
printf("%d\n",a);
// 위의 코드를
int a = 12;
printf("%d\n",a);
// 이런식으로 컴파일러가 최적화 해버림
(FLASH->ACR |= FLASH_ACR_PRFTBE)
*(40022000) |= 16;
volatile unsigned int * reg = 40022000
*reg |= 16;
16 = 1 << 4 이므로
*reg |= 1 << 4;
