[임베디드 5강] HAL 드라이버 코드 분석하는 방법

강지원·2024년 6월 10일

STM32 강의

목록 보기
8/33

코드분석 방법

  1. 소스가 어떤 환경에서 돌아가는 지 이해하기
  2. 소스가 돌아갈 수 있는 환경 만들기
  3. 디버거를 할수있는 상황 만들기
  4. 브레이크 포인트 걸고 디버깅

HAL 드라이버 분석하는방법

  1. HAL_Init(); 코드 분석하기
HAL_Init(); 
// Ctrl + 코드 클릭
  1. 브레이크 포인트 걸기
__HAL_FLASH_PREFETCH_BUFFER_ENABLE(); // 브레이크 포인트 걸어보기
  • defined(STM32F103XB) 에 해당해서 브레이크 포인트가 걸린다
  1. 분석할 코드를 메모장에 옮겨 적기

    (FLASH->ACR |= FLASH_ACR_PRFTBE)

  2. 코드 분석하기

  • (ctrl + 코드) 해서 쭉 들어가서 확인 할 수 도 있음.
  • expression 에 적으면 Type, Value 를 알 수 있음.

    FLASH -> ACR : 40022000
    FLASH_ACR_PRFTBE : 16
    따라서,
    (FLASH->ACR |= FLASH_ACR_PRFTBE)
    = *(40022000) |= 16;
  1. 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) 번지 , ...

* 최적화 방지 이유 (volatile)

gpio에 따라 a가 바뀌는 상황도 있는데 최적화 해버리면 의도한대로 동작할 수 없음

int a = 3;
a = 7;
a = 8;
a = 12;

printf("%d\n",a);
// 위의 코드를 

int a = 12;
printf("%d\n",a);
// 이런식으로 컴파일러가 최적화 해버림
  1. 코드 총 정리
(FLASH->ACR |= FLASH_ACR_PRFTBE)
*(40022000) |= 16; 

volatile unsigned int * reg = 40022000
*reg |= 16; 

16 = 1 << 4 이므로
*reg |= 1 << 4;
  1. 데이터 시트 읽기
    FLASH -> ACR 관련 부분 읽기
  • *reg |= 1 << 4; //Bit 4를 1로 만들어라
    PRFTBE : Prefetch buffer enable
    0 : Prefetch is disabled
    1 : Prefetch is enabled
    -> 플래시 메모리의 프리패치 기능을 활성화 한 것이다.
  1. 플래시 메모리의 프리패치?
    문장이 이해가 되지 않는다면 컴퓨터 지식, 백그라운드 지식의 문제이다
    구글 검색을 통해 이해하거나 컴퓨터 지식을 쌓아야함.

0개의 댓글