임베디드 52

Context와 AAPCS

Context : 현재 CPU에 대한 모든 정보( == Register들의 현재 값들)    현재 System이 동작하는데 필요한 모든 정보를 담고 있음.  R0~R12 : CPU의 연습장. R13 : Stack Pointer, 현재 CPU가 사용하고 있는 Stack의 주소 중,, 마지막 Push한 Data가 있는 곳의 주소. R14 : Linked Register ::어디서 왔는지, 어디로 돌아가야 하는지에 대한것, R15 : (PC) : 현재 실행 주소 정보 CPSR : 현재 CPU의 상태에 대한 주소.  Register 값들만 잘 보존하면 pc를 왔다갔다 가능  > Function Callvoid ContextDaughter();void ContextMother (void){     나불나불나불~ ..

GPIO >SPI

stm32 cubeide  프로젝트 복사해도 복사한 파일의 값을 변경하면 원래 파일의 정보가 바뀜  > metadata 등의 관계에의해 + 백업 잘해두자,, 다 날려버림 해결책 1. second 로 실행시 ide에 first라고 뜨는데 그거 제거     ** 이때 contents on disk 체크 박스 꼭 해제 2. import projects 3. general > existing projects into workspace 4. second > browse 5. ioc 이름도 secoond 로 변경 // 속성에서 잘 확인 6. 디버그 속성에서도 second.elf로 변경 7. project > clean ------------------------------------------------------..

FND 분석

// SCLK   HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, LOW); HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, HIGH); // HIGH 로 끝나므로 시작도 HIGH // DO (DATA OUT)    if (X & 0x80)     {       HAL_GPIO_WritePin(FND_DIO_GPIO_Port, FND_DIO_Pin, HIGH);     }     else     {      HAL_GPIO_WritePin(FND_DIO_GPIO_Port, FND_DIO_Pin, LOW);     }     send(0xF8); HAL_Delay(1000); > 오실로스코프로 1111 1000 확인 ..

Scatter Loading 주의점, heap 및 stack

1)  우리 나름대로의 Stack과 Heap을 사용하게됨   > 자동으로 Compiler가 만들어주는 Stack과 Heap은 안씀 "그런데, 우리가 만들어낸 image의 ZI에 포함되지 않는 여기서의 Stack과 Heap은 도대체 뭐냐!   Default Memory model > RO, RW, ZI : Application 하나 올린것  Embedded OS (또는 Kernel)같은 복잡한 것이 porting되지 않았음     > Application이 사용하는 Stack과 Standard Library가 사용하는 (malloc같은) Heap인것      >  Compiler가 알아서 Stack과 Heap영역을 만들어줌 /* 스택(stack) 영역 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는..

Reset Handler에서 main까지 (Entry Point)

ARM core Embedded System Power on == Reset Exception  >  SVC mode > Reset Vector > PC setting    Reset Vector( Low Vector ) : 0x0 // Reset Handler로 branch하는 code가 있음 Exception Vector AREA    INT_VECT, CODE, READONLY CODE32                         ; 32 bit ARM instruction set. ENTRY B       Reset_Handler                       ; 0x0  // Reset Handler로 branch B       Undefined_Handler              ..

SPI통신

SPI데이터 주고받는 선 : 3가닥 ( 클럭, 데이터2 )  > 전압차이 이용 HIGH > LOW or LOW > HIGH 데이터 구분  1. Time base : bps (1초를 쪼개서) 2. CLK : 1주기에 대한 데이터의 값 구분 > SPI : CLK 전이중 > A의선 B의선 두개로 서로 말할 수 있음 반이중 > A와 B 가 하나의 선을 번갈아 사용 > SPI :default 전이중, + 둘다 사용 1:다수 통신  A  1) > B C D       2) > B C D  CLK > B C D >> 단점1)  A입장 >누구한테 말할지 알 수 없음        "    2) BCD입장 > 누가 말하는지 알 수 없음 (SPI 해결)  2) Master, Slave 전용으로 만듬 slave : maste..

FND 모듈제어

모듈 구성 : 메인칩 + 필요한 최소한의 회로   (쪽보드) 제어 단계 1. 칩, 부품 모델명 확인 : TM74HC595 , 7세그먼트  2. 데이터시트 구글링 1) TM74HC595 2) 모듈 자체의 데이터시트 QA , QB, QC ,,, 찾는법  1) 모듈 데이터시트 2) 쇼트테스트 3) 남이 정리한것 찾기 4) 샘플 코드를 구해서, 일단 동작시키고     > 그다음 추리     구글에 칩 sample code 검색.. @ STI 통신 CLK > DI( data )  클럭을 기준으로 데이터를 보냄 GPIO3개 outut > CLK, DATA Input , DATA output @ cpp 코드 > stm 으로 변환 해석 void TM74HC595Display::send(unsigned char X) {..

LED 회로

다이오드 : 긴쪽 + 짧은쪽 - 저항 220R GPIO > 1 ( 3.3v , HIGH ) ,0 ( LOW ) 으로 해서 가운데의 LED가 껏다 켜졌다 할 수 있음 HAL_GPIO_WritePin(GPIOx, GPIO_Pin, PinState); GPIOx : GPIO group   > MX_GPIO_Init();       >  HAL_GPIO_WritePin(PB6_LED1_GPIO_Port, PB6_LED1_Pin, GPIO_PIN_SET); 1,3번 연결2,4번 연결 > s/w : on > 1234 다연결// 테스터기로 1,3 과 2,4를 찾을 수 있음  1. s/w off : PB0_TEMP-SET-UP 으로 전류가 흐름 > HIGH2. s/w on : GND > 다 흐름 , PB0_TEMP-S..

UART로 printf() 구현

리눅스에서 표준출력 바꾸는 방법 있음 printf > 파일에 기록되게 할 수 있다. UART : 장치 관리자 > 포트 > usb serial port(com3) 3.3v 로 스위치 바꾸어 줘야함 모듈                  보드 DTR RX (수신부) - 보드에서는 TX   (PA9), 60번 TX(송신부) - 보드에서는 RX (PA10) ,55번 VCC CTS GND //신호의 기준선 XShell5 세션만들기 > 프로토콜 :serial > serial 설정 : com3 STM32 char senddata[20]= "hello world\r\n"; // 엔터 하려면 \r\n FTDI 모듈 > 컴퓨터 (드라이버)  >Port3 > xshell > hello world   오실로스코프  start 1..

Coprocessor Assembly

Coprocessor:  Co-worker , cpu 혼자 모든걸 처리할 수는 없으니Coprocessor 명령 : 전용 registerData를 전송하는 명령1) Coprocessor 내부의 Register들을 장난 침. (Coprocessor 내부 Register ↔ Coprocessor 내부 Register) 여기에 붙은 모든 것들은 Coprocessor 내부에 정의 된 녀석들(형식)CDP Coprocessor번호, Coprocessor 명령어, CRd, CRnCoprocessor 명령어 : Coprocessor마다 준비된 명령어가 다름CRd: Coprocessor 내부에 있는 Register,, Destination Register로 사용 CRn: Coprocessor 내부에 있는 Register ..