240423 LOWLEVEL
INPUT Frequency --> HSE --> /4 *100 /2 (*PLL) -->peripherial
핀 번호 설정을 통해 생긴 함수
RCC Default 값 : 내부 CLOCK
DEFAULT = 0 이라서 0 설정을 쓰려는 애들은 건들이지 않아도 된다.
INPUT의 MODER도 INPUT MODE는 00 이라서 건들이지 않아도 된다.
GPIO_ READ
if 문 안의 마스킹 안의 방식은 반드시 0을 체크할 수 밖에 없다.
이해하기
DEBUG
컴파일, 링크가 하는 일이 뭘까?
부팅 절차
반도체 SOC 쪽이나 펌웨어쪽은 이 부을 이해해야 한다.
Flash Memory에 어떻게 들어갈지 보는곳.
.isr_vector 부터 차근차근 다 들어간다.
>FLASH로 가라
rodata (read only data) >flash로 가라
HEAP, STACK
제일 꼭대기 : stack의 시작주소 --> 위에서부터 아래로
Entry Point : 0번지. = start up 코드
.text : 실행코드 ==> FLASH
변수, 전역변수 - data (초기화 o), (bss 초기화 x) ==> RAM
실행코드가 다 다운로드가 됐다면 --> 먼저 실행하는거 : start up code // 어셈블리어로 되어있다.
제일 먼저 시작되는 언어.
스크립터에 다 선언되어 있다.
==> DATA : FLASH --> SRAM
==>BSS : 세팅된 값이 없으니 0으로 초기화
그러고 나서 bl main : main을 call 한다.
main 이 끝나면 bx lr : return 한다는 말
startup 코드 : 1. FPU, EXRAM(외부메모리), Vector 초기화 2. .data section Flash -> Ram copy 3. .bss section 영역을 0으로 초기화. 4. main 함수 call
br
anch로 뛰어서 start code --> 실행코드 실행
모든 C언어는 이렇게 동작한다.
스타트업 코드, 부트로더 코드 작성 가능.
부트로더
아두이노 : 시리얼 통신으로 데이터를 부트로더를 받는다.
Startup 과 LinkerScripter를 같이 봐야한다.
링커 스크립터 : 어느 부분에 어느 코드를 넣을까 ? 실행코드가 RAM, Flash 어디로 갈까?
.text, .data .bss 이라는 세션은 C, ARM 등등 공통으로 쓰인다.
*(.text) 이런애들은 다 FLASH 로 가라.
READ ONLY는 FLASH로 가라.
제조사들마다 다 다르다.
.data 초기화 값이 있는 전역변수. --> FLASH,-> RAM
.bss 초기화 되어있지 않은 전역변수 --> RAM 으로 들어가라.
.bss 영역이 0으로 초기화
-------------------------------------LowLevel------------------------------------