임베디드 기사/실기 - 임베디드 하드웨어

3. 임베디드 시스템 주변장치 분석하기

꿈을향해달리자 2023. 9. 15. 22:01
728x90

3.1 임베디드 시스템 주변 장치

1. GPIO란

- IC Chip의 Pin을 입력과 출력 또는 특정한 기능의 수행이 모두 가능하도록 설계된 방식

- 개발자에 의해 해당 Pin 용도를 다양하게 변경하여 활용이 가능한 확장 기술을 말함

 

2. GPIO 제어 레지스터 종류

- GPDR (GPIO Direction Register) : 해당 핀 방향을 입 / 출력으로 설정하는 레지스터

- GPLR (GPIO Level Register)

ㄴ 특정 GPIO의 입력 레벨 또는 출력 레벨을 검출

ㄴ 해당 핀의 전압 low인지 high 인지를 검출하는 Read Only 레지스터

 

- GPSR (GPIO Set Register)

ㄴ GPIO를 출력으로 사용하는 경우 High(1)로 설정

ㄴ 0값이 설정된 비트는 이전 상태를 유지

 

- GPCR (GPIO Clear Register)

ㄴ GPIO를 출력하는 사용하는 경우 Low(0)로 설정

ㄴ 0값이 설정된 비트는 이전 상태를 유지

 

- GPER (GPIO Rising-Edge Register)

ㄴ 상승/하강 에지 검출 허가 레지스터

ㄴ 입력 핀 상태가 Low에서 High로 변했을 때 에지 검출 레지스터를 1로 설정

 

- GFER (GPIO Falling-Edge Register)

ㄴ 상승/하강 에지 검출 허가 레지스터

ㄴ 입력 핀 상태가 High에서 Low로 변했을 때 에지 검출 레지스터를 1로 설정

 

- GEDR (GPIO Edge Detect Status Register)

ㄴ GPER, GFER에 설정된 값에 따라 해당 되는 bit에 천이가 발생 되었는지를 표시함

 

- GAFR (GPIO Alternate Function Register)

ㄴ 다수의 기능을 가진 핀을 다른 특정 기능으로 변경

 

3.2 인터럽트와 입/출력

1. 인터럽트 지원 함수

1) 인터럽트 등록

int request_irq(unsigned int irq, irqreturn_t (*handler) (int, void*, struct pt_regs*), unsigned long flags, const char *dev_name, void *dev_id)

① unsigned int irq : 요청 인터럽트 번호

② irqreturn_t (*handler) (int, void *, struct pt_regs *) : 인터럽트 처리할 함수 포인터

③ unsigned long flags : 인터럽트 관리 옵션 비트 마스크

ㄴ IRQF_DISABLED : 인터럽트 발생 비활성화

ㄴ IRQF_SAMPLE_RANDOM : 난수발생 여부 플래그. 커널 엔트로피 저장소에 저장

※ 커널 엔트로피 저장소 : https://blog.leocat.kr/notes/2017/08/26/linux-random-number-generator

ㄴ IRQF_TIMER : 타이머를 위한 인터럽트

ㄴ IRQF_SHARED : 인터럽트 공유로 참여하는 경우 모든 핸들러가 이 옵션을 선택해야 함

④ dev_name, dev_id : 인터럽트 소유자 정보 문자열과 포인터

 

2) 인터럽트 활성화와 비활성화

- 프로세스는 특정 시점에 인터럽트가 발생하거나 잠들지 않아야 하는 경우가 생긴다

- 특별한 경우 직접 인터럽트를 활성/비활성 시켜야 한다.

- 모든 인터럽트

ㄴ 비활성화 : void local_irq_save(unsigned long flags); void local_irq_disable(void)

ㄴ 활성화 : void local_irq_restore(unsigned long flags); void local_irq_enable(void)

- 특정 인터럽트

ㄴ 비활성화 : disable_irq(int irq);

ㄴ 활성화 : enable_irq(int irq)

 

3) 인터럽트 해제

- void free_irq(unsigned int irq, void *dev_id)

① unsigned int : 제거하려는 인터럽트 번호

② void *dev_id : 인터럽트 등록 시의 dev_id

 

2. DMA 처리 과정

1) CPU가 DMA에 명령 전달 (I/O 장치 주소, 연산 명령, 저장할 주기억장치 주소, 전송 데이터 단어의 수)

2) DMA 제어기가 CPU에 BUS REQ

3) CPU가 DMA 제어기에 BUS GNT

4) DMA 제어기가 데이터 읽어서 기억장치 주소에 저장

5) 전송할 데이터 남으면 2~4단계 반복

6) 전송 완료 후 CPU에 INTR 전송

 

3.3 입/출력 인터페이스 프로그래밍

1. 8051 시리얼 포트 동작 모드

- 모드의 설정은 SCON (Serial port Control Register)을 사용하여 설정하며 SCON 레지스터의 구조는 다음과 같다

① SM0, SM1 : 동작 모드를 설정하는 비트

② SM2 : 모드 1,2,3에서 인터럽트 발생 시점을 설정하는 비트

③ REN : 수신 Enable 비트

④ TB8 : 송신할 9번째 비트

⑤ RB8 : 수신할 9번째 비트

⑥ T1 : 1문자 송신 완료되어 송신부가 empty상태이면 해당 비트 1로 세트

⑦ R1 : 1문자 수신 완료되어 수신 준비 상태되면 1로 세트

 

2. I2C

1) I2C

- Inter-Integrated-Circuit의 약어로 두 가닥의 신호 선으로만 연결하여 동작하는 양방향 직렬 버스 규격

- 필립스 사에서 속도는 느리지만 저비용으로 가능한 많은 장치들 간에 데이터를 전송할 목적으로 만듬

 

2) I2C 개념도

- 통신 대상 : Master (MCU), Slave (주변장치)

- 통신 방식 : SDA, SCL 신호 선으로 MCU와 주변 장치 간에 데이터를 전송

ㄴ SCL : Serial Clock Line 의 약어로 데이터를 전송하기 위한 동기용 클럭 전달하는 단방향 신호선

ㄴ SDA : Serial Data Line 의 약어로 전달하고자 하는 데이터를 전송하기 위한 양방향 신호선

 

3. SPI

1) SPI

- Serial Peripheral Interface의 약어로 네 가닥의 신호 선이 연결되어 동작하는 양방향 직렬 버스 규격

- 모토롤라 사에서 개발된 Full duplex 통신이 가능한 동기 통신 규격이다.

- I2C와 마찬가지로 마스터-슬레이브 방식으로 동작한다.

- I2C와 다르게 Full-duplex 방식으로 데이터 전송과 수신이 동시에 가능하다.

 

2) SPI 개념도

- 통신 대상 : Master (MCU), Slave (주변 장치)

- 통신 방식 : SCLK, MOSI, MISO, SS 신호 선으로 MCU와 주변장치 간 데이터를 전송

ㄴ SCLK : Serial Clock의 약어로 데이터를 전송하기 위한 동기용 클럭 전달하는 단방향 신호선 

ㄴ MOSI : Master Output, Slave Input의 약어로 마스터가 SCLK에 맞추어 해당 신호선으로 데이터를 출력한다.

ㄴ MISO : Master Input, Slave Output의 약어로 마스터가 SCLK에 맞추어 해당 신호선으로 데이터를 입력 받는다.

ㄴ SS : Slave Select의 약어로 슬레이브를 활성화 시키는 데 사용되는 신호선

 

3.4 센서 프로그래밍

1. 센서 측정 값 읽는 과정

1) 센서 관련 초기 선언

2) ADC 초기화 및 설정 분주비 설정

3) 송수신 모드 설정 (동기, 비동기, 데이터 사이즈)

4) 송수신 속도 설정

5) 센서 값 읽기 (응답 대기 및 값 추출)

6) 수신 데이터 처리 및 종료

 

# References

https://raghavkrules.blogspot.com/2019/02/scon-register-in-8051.html

- https://velog.io/@d3fau1t/I2C-%ED%86%B5%EC%8B%A0-%EC%9D%B4%ED%95%B4-with-MCP23008

- https://twinw.tistory.com/149

 

728x90