startup 코드(asm) 를 거쳐 main.c 로옴
#define asd \( \ : 다음줄까지도 이어짐)
디버깅할때 if define 안에 안들어오면 회색배경으로 바뀜 > ide의 편리성
(FLASH->ACR |= FLASH_ACR_PRFTBE)
typedef struct
{
__IO uint32_t ACR;
__IO uint32_t KEYR;
__IO uint32_t OPTKEYR;
__IO uint32_t SR;
__IO uint32_t CR;
__IO uint32_t AR;
__IO uint32_t RESERVED;
__IO uint32_t OBR;
__IO uint32_t WRPR;
} FLASH_TypeDef;
1. 하나하나 찾기
#define FLASH ((FLASH_TypeDef *)FLASH_R_BASE) // FLASH_R_BASE 라는 주소담김
#define FLASH_R_BASE (AHBPERIPH_BASE + 0x00002000UL)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000UL) // Flash registers base address
#define PERIPH_BASE 0x40000000UL //Alias 영역에서의 주변기기 베이스 주소 (Peripheral :주변기기)
>FLASH = FALSH구조체 타입의 FLASH_R_BASE = 0x40022000
2. 디버깅 expressions > FLASH > 0x40022000 바로나옴
3. &(FLASH->ACR) = 0x40022000
FLASH->ACR = 0x40022000
FLASH->KEYR= 0x40022004
FLASH->OPTKEYR = 0x40022008
등등,,
4. FLASH_ACR_PRFTBE = 16
// |= 연산자 : a |= b , a와b를 비트연산 한거를 a에 넣음
5. FLASH->ACR |= 16
= *(0x40022000) |=16
// 16 = 00010000
>>FLASH 구조체의 ACR 에 FLASH_ACR_PRFTBE =16 비트연산 값을 넣는다
// ACR은 32비트(4바이트) 레지스터 ( type : __IO uint32_t )
Bit definition for FLASH_ACR register 라서
구조체처럼 직접적인 멤버로 존재 x > 비트필드로 정의 되어있음
그래서 비트연산자 |= 로 값을 제어함.
/*
__IO
#define __IO VOLATILE ( 휘발성물질)
: 최적화하는것을 방지하기 위해서 사용
컴파일러는 최적화라는것을함.
> 안쓰는 명령문은 없애버림
// 무조건 메모리 번지에 올려서 사용,, cpu레지스터에 넣는게 아니라
*/
FLASH->ACR |= FLASH_ACR_PRFTBE
>
volatile unsigned int * reg = 0x40022000
*reg |= 16
FLASH_ACR_PRFTBE_Pos (4U)
FLASH_ACR_PRFTBE_Msk (0x1UL << FLASH_ACR_PRFTBE_Pos) /*!< 0x00000010 */
FLASH_ACR_PRFTBE FLASH_ACR_PRFTBE_Msk /*!< Prefetch Buffer Enable */
0x1UL (UL:unsigned long) 를 4Unsigned 칸 시프트
0x00000001 << 4칸
0x00010000 = 16(10) = 0x10(16)
unsigned 를 쓰는 이유
0~ 양수 까지라 무조건 양수만됨, 음수로 처리될 여지x
리눅스 그랩
grep -rn AHBPERIPH_BASE*
> 모든 파일중에 해당되는것을 찾음
'임베디드 > 고추건조기' 카테고리의 다른 글
데이터 시트 보는법 (1) | 2024.11.23 |
---|---|
GPIO 마무리, 회로도 보기 (0) | 2024.11.21 |
GPIO 탐구 (0) | 2024.11.21 |
GPIO제어 (0) | 2024.11.19 |
ACR 레퍼런스 메뉴얼 (1) | 2024.11.16 |