임베디드 시스템과 통신 : 프로세서와 다른 디바이스들이 데이터를 교환화기 위해서는 통신 인터페이스가 필요하다. 예를 들어 GPS, IMU, 카메라 센서, AXLM ..
통신 방법
전용 통신제어 칩을 통하여 데이터 전송 프로토콜 이용, 데이터를 비트스트림으로 변환하여 연결
데이터 통신을 위해서는 에러처리, 주소지정, 데이터 요청, 메시지 포맷, 우선순위 등의 기능을 사용한다.
통신의 유형
완전이중화, 반이중화 : 양 쪽에서 "동시에" 데이터를 주고받을 수 있는지. 전화기 vs 무전기
동기형, 비동기형 : 동기형은 클럭에 맞추어 데이터를 주고받고, 비동기형은 타이밍에 상관없이 송수신 ( 콜백 함수 사용 등 )
P2P, Bus : 두 장치 통신 vs 여러 장치가 한 버스에 연결되어 한번에 한 장치만 데이터 송수신
UART 직렬포트 통신 - RS232
SPI
I2C
Can Bus

직렬 주변장치 인터페이스, 여러 전자부품이 MCU와 짧은 거리에서 빠르게 통신할 때 사용
마스터 : CPU
슬레이브 : 여러 주변 장치

1. 마스터의 데이터 출력 -> 첫번째 슬레이브의 입력으로 -> 첫번째 슬레이브의 출력 -> 두 번째 슬레이브의 입력 ..
즉 모든 슬레이브가 한 줄로 연결되어 이동
주로 Shift Register 방식의 장치에서 사용


마스터가 S 신호 이후에 address bit을 보냄 -> R/W bit 보냄 -> ACK 신호 받은 후, 데이터를 보냄

on borad diagnostics port

UART : MCU와 외부 장치 간의 통신 회로
UART, USART라는 이름으로 GPIO포트의 여러가지 추가 기능 중 하나로 설정이 가능
GPIO의 모든 핀들은 16개의 Alternate Function을 설정할 수 있다.
USART 비동기식 직렬 데이터 포맷을 사용하는 외부 장치 간에 완전이중화 방식으로 데이터를 교환하는 통신
완전이중화 : 데이터를 양방향으로 동시에 주받을 수 있음
NRZ : 데이터의 1과 0을 신호로 표현 즉 값은 값이 계속 연속되어도 신호가 중간에 바뀌지 않음
buad rate 설정가능
데이터 길이 - 한 번에 8비트 또는 9비트 데이터 전송 가능
STOP BIT 한개 또는 두개로 설정 가능
동기식 모드에서는 마스터가 클럭 신호를 출력함
Transfer Dectection Flags : 데이터가 다 전송되었는지, 수신 버퍼가 비었는지 상태를 알려주는 플래그
패리티 오류 검출을 위한 비트 있음
Error Detection Flags : 에러 검출을 위한 플레그 4개
여러 종류의 인터럽트 지원하는 플레그 10개
MODER 설정 -> 해당 핀의 모드를 Alternate Function로 설정
OTYPER, PUPDR, OSPEEDR : 출력 타입(푸쉬풀, 오픈드레인), 풀업풀다운 저항, 출력 속도 설정
AFRH/AFRL 설정
• PA2, PA3를 USART2로 쓰고 싶다면
• PA2, PA3의 MODER을 Alternate Function으로
• OTYPER, PUPDR, OSPEEDR도 적절히 설정
• AFRL에서 PA2, PA3를 AF7로 설정(USART2는 AF7)
-> GPIO포트의 핀을 통하여 AF의 input output 연결
USART_CR1 레지스터의 M 비트를 설정하여 8비트 또는 9비트 길이의 문자를 선택
[프로그램]
│
│ 1. TDR에 데이터 기록
▼
[TDR 레지스터] ──► [쉬프트 레지스터] ──► [Tx핀]
│ │ │
│ 2. TE=1이면 │ 3. 데이터가 │ 4. 실제로
│ 송신 시작 │ 한 비트씩 이동 │ 외부로 전송
문자 단위의 데이터 송신 절차. 반드시 해당 순서대로 레지스터를 설정할 것
1. USRART 활성화 UE(Usart enable) 비트를 1로
2. 데이터 길이 설정
3. stop 비트 개수 설정. 1개 또는 2개. USART_CR2 레지스터에서 설정
4. DMA(direct memory access) 설정 가능 . 여러 데이터를 연속으로 보낼 때
5. baud rate 설정. USART_BRR
6. 송신기 활성화 ( TE 비트 설정 ). USART_CR1의 비트를 1로
7. 송신 -> USART_DR 레지스터에 보낼 데이터를 씀 . 그러면 TXE가 자동으로 클리어. TC(transmission Complete) flag가 1이 될 때까지 기다림
USART 켜기 → 2) 데이터 길이/Stop Bit/속도 등 설정 → 3) 송신기 켜기 → 4) 데이터 쓰기 → 5) 마지막 데이터가 다 나갈 때까지 기다리기
마지막 데이터 바이트가 송신되고 TXE가 세팅된 후, USART를 비활성화 하기 전에 TC=1 되는지 기다려야함.
USART_SR (status register) 레지스터부터 읽기 작업을 하는 경우 TC = 1
USART_DR (Data register) 레지스터에 쓰기 작업을 하는 경우 -> TC = 1
USART_CR1 즉 UE 비트 1로 설정
데이터 길이 설정 -> USART_CR1dml M비트로 8인지 9인지 설정
STOP bit 개수 설정 -> USRT_CR2
DMA 설정 -> USART_CR3
buad rate 설정
RE 활성화.
문자가 수신되면
RXNE 비트가 1이 된다. Read Data register Not Empty. 즉 읽을 값이 있음
쉬프트 레지스터 내용이 RDR 레지스터로 전송
RXNEIE = 1 이면 인터럽트 발생 ? 이건 제어 비트이다. RXNE가 1일때, RXNEIE도 1이면 인터럽트
IE는 interrupt enable
error flag 설정 가능
RXNE 비트가 0이 되는 경우, 즉 값이 비는 경우는 소프트웨어가 해당 값을 읽어간 경우
USART 포트의 상태 저장
송수신 모드 설정
송수신 속도 결정

fck = 8 이고, USARTDIV = 416.6875 ( 정수부분 M=416, 소숫점 부분 F=1/16 ) , OVER8=0 -> 원하는 buadrate 1200bps 일때
공식에 대입하면 상위비트는 정수부분 416이고 하위비트는 소수부분 0.6875* 16 = 11이 4비트로 저장된다.
USART_BRR 레지스터(baudrate 설정 레지스터) 값에서, USARDIV(내부 클럭을 얼마나 나눠서 쓸지) 값을 어떻게 구하는가 ?
USART_DIV는 실제 나누는 값 즉 소수점 값
USART_BRR에는 정수부와 소수부를 나누어 레지스터에 저장.
이때 두 값 차이를 연산해보자.
DIV값이 주어졌다면, 정수부 그대로 쓰고 소수부 * 16해서 계산. 가장 가까운 16진수값으로
해서 만약 정수부 0x19, 소수부 0xA면 그대로 0x19A 쓰면 됨
정수부와 소수부가 주어졌다면, 소수부에 16곱해서 더하면 됨.