╱╱╭╮╱╱╱╱╱╱╭━━━╮╱╱╱╭╮╱╭╮╱╱╱╱╱╱ ╱╱┃┃╱╱╱╱╱╱┃╭━╮┃╱╱╱┃┃╱┃┃╱╱╱╱╱╱ ╱╱┃┣━━┳━━╮┃┃╱┃┣━╮╱┃╰━╯┣━━┳━╮╱ ╭╮┃┃╭╮┃┃━┫┃╰━╯┃╭╮╮┃╭━╮┃╭╮┃╭╮╮ ┃╰╯┃╭╮┃┃━┫┃╭━╮┃┃┃┃┃┃╱┃┃╭╮┃┃┃┃ ╰━━┻╯╰┻━━╯╰╯╱╰┻╯╰╯╰╯╱╰┻╯╰┻╯╰╯

CS/임베디드 시스템

임베디드 시스템 설계및 실험 정리

재안안 2023. 12. 15. 18:45

GPIO 제어
각 레지스터 마다 메모리매핑된 주소가 있다.
APB2에 각 GPIO포트가 할당되있는데 할당된 주소에 offset을 더하면 해당 레지스터 주소가 된다.

RCC를 사용해 사용하고자 하는 GPIO에 clock 인가
APB2 peripheral reset register 0x4002 1018

CRL, CRH (0~7, 8~15)
입출력 방향및 방식 설정, 특수 목적인지 설정 : CNFn 핀, MODE

GPIOG -> CRH = (1 << CNF9) | (2 << MODE9);

Output Mode
출력 형태 출력 속도
Push-Pull 10 MHz (기본적인 성능을 요구할 시) 1이면 High, 0이면 Low 출력
2 Mhz (저전력)
50 Mhz (USART, I2C)

Open-drain 10 Mhz (기본적인 성능) 1이면 floating, 0이면 Low 출력
2 Mhz (저전력)
50 Mhz (USART, I2C)

Input Mode
입력 형태 ODR 상태
Input floating 상관 없음  플로팅 상태가 요구될 때 사용
Input pull-down Low 내부 Pull-down 저항 사용 ODR 비트가 0이어야한다
Input pull-up High 내부 Pull-up 저항 사용 ODR 비트 1

volatile

사용할 핀에 클럭 할당하고 핀 모드 설정, volatile 키워드를 통해 컴파일러의 최적화 방지


Scatter file, 릴레이 모듈, 폴링
scatter file이란
실행시킬 바이너리 이미지가 메모리에 로드될 때, 바이너리 이미지의 어떤 영역이 어느 주소에 어느 크기만큼 배치되야 할 지 작성한 파일

Region > Output Section > Input Section (code, constant data, global data, zero initialized)

input section 위치
Load View : flash에 실행 image가 담겨 있을 때의 형태
Execution View : flash에 실행 image가 실행될 때의 형태

Polling : 하드웨어의 변화를 지속적으로 읽어들여 변화를 알아채는 방법

릴레이 모듈 3.3V
릴레이를 제어하는 모듈, 전자기 유도원리를 이용하여 스위치 역할
신호를 가하면 출력 상태가 변경된다.

COM : 제어 신호에 따라 NO 또는 NC로 붙는다
Normally Open : High 신호가 들어오면 close
Normally Close : High 신호가 들어오면 open

버튼
floating / pull-up mode / pull-down mode / chattering

스캐터 파일을 통해 특정 메모리를 가까운 곳에 배치하여 메모리 접근 시간을 줄일 수 있다.
약간의 딜레이를 통해 채터링을 방지할 수 있다.


Clock Tree
Main PLL, AHB Prescaler, APB1 Prescaler, APB2 Prescaler 등을 사용하여 다양한 Frequency 를 설정할 수 있다. 

Clock은 내부/외부및 Low/High Speed의 분류에 따라 구분한다.

HSI Clock (High-speed internal)
8 Mhz, RC에서 생성 => 시스템 클럭으로 사용하거나 PLL Clock으로 사용 가능
온도에 영향 받아 오차가 생길 수 있다 (25도에서 -1.1 ~ 1.8%)

PLLCLK = 8 Mhz / 2 * PLLMUL

HSE Clock (High-speed external)
25 Mhz, HSE OSC에서 생성 => 시스템 클럭으로 사용하거나 PLL Clock으로 사용
Real-time clock = HSE / 128

1. PLLCLK = 25 Mhz / PREDIV1 * PLLMUL
2. PLLCLK = 25 Mhz / PREDIV2 * PLL2MUL / PREDIV1 * PLLMUL

Clock Tree
시스템 클럭은 MCU, APB1, 또는 APB2로 전달된다.

시스템 클럭은 MCO MUX를 통해 MCO에 출력해 오실로스코프로 확인이 가능
APB1 prescaler를 사용해 최대 36 Mhz 클럭을 PCLK1에 제공 (APB1 peripherals)
APB2 prescaler를 사용해 최대 72 Mhz 클럭을 PCLK2에 제공 (APB2 peripherals)

PCLK : APB Bus에서 사용되는 clock
HCLK : DMA, Core memory, AHB Bus에서 사용되는 clock
FCLK : CPU에서 사용되는 clock

PLL (Phase-Locked Loop)
입력 신호와 출력 신호를 이용해 출력 신호를 제어하는 시스템
입력된 신호에 맞춰 출력 신호의 주파수 조절이 목적

HSE OSC에서 생성후 MUX, DIV, MUL을 사용해 원하는 주파수로 변경

사용 레지스터 : RCC_CFGR, RCC_CFGR2, RCC_CR

RCC_CFGR
PPRE2[2:0] : APB2
0xx : none
100 : HCLK devided by 2
101 : HCLK devided by 4
110 : HCLK devided by 8
111 : HCLK devided by 16

APB2 prescaler에서 2로 나누려면,
RCC->CFGR |= RCC_CFGR_PPRE2_DIV2

시리얼 통신
1. 병렬 통신 : 여러개의 데이터 선 이용, 각 선에 비트를 하나씩 보냄
2. 직렬 통신 : 하나의 데이터 선을 이용해 비트를 차례로 보냄

UART
비동기 통신 프로토콜
Rx Tx 교차 연결
Baud Rate를 일치 시켜야 한다. (초당 얼마나 많은 데이터를 전송하는지)

USART_BRR
DIV_Mantissa(정수)와 DIV_Fraction(소수)을 통해 baud rate를 결정하는 레지스터
총 16비트중 각 상위 12비트와 하위 4비트를 할당

Tx/Rx baud = input clock / 16 * USARTDIV

input clock이란,
PCLK1 for USART2, 3, 4, 5
PCLK2 for USART1

USARTDIV란,
USART_BRR에 할당된 16비트
DIV_Fraction (12), DIV_Mantissa (4)

USART1을 사용하고 baud rate 9600을 사용하려면,
SYS_CLK = HCLK = PCLK2 = 72 Mhz
9600 = 72,000,000 / (16 * USARTDIV)
USARTDIV = 72,000,000 / (9600 * 16) = 468.75
DIV_Mantissa = 468, DIV_Fraction = 0.75 * 16 = 12

Start bit : 통신 시작 신호
Data bit : 8~9 bit 데이터 (레지스터 설정)
Parity bit : 에러 검사 (Even, Odd)
Stop bit : 통신 종료 신호 (1, 1.5, 2 bit)

USART
동기식 통신을 지원하는 UART
클럭 전송을 위한 별도의 클럭선 필요
Start bis/ Stop bits가 없고 Data bits를 클럭에 동기화해 전송

MCO및 UART 사용을 위한 GPIO 설정
MCO, UART TX : Alternate function output Push-pull
UART RX : Input with pull-up / pull down


Interrupt
CPU가 특정 이벤트 발생시 현재 작업을 멈추고 해당 인터럽트 서비스 루틴을 수행후 다시 이전 작업으로 돌아가는 방식

Hardware Interrupt
비동기식 이벤트 처리, 하드 디스크 읽기 요청및 응답, 키보드 입력에 발생, 우선순위 높음

Software Interupt
동기식 이벤트 처리, trap, exception과 같이 프로그램에서 발생, 우선순위 낮음

EXTI (External Interrupt)
외부에서 신호가 입력될 경우 Device에 Event나 Interrupt 발생
Rising-Edge, Falling-Edge, Rising & Falling Edge등 각 포트의 핀에 EXTI n을 연결해 신호를 입력 받는다

EXTI는 Event Mode와 Interrupt Mode를 선택해 사용
Interrupt Mode일 경우 Interrupt Handler가 20개의 Edge Detector Line을 통해 Rising/Falling Trigger를 감지

외부 Interrupt는 EXTI0~15까지의 각 GPIO 포트의 핀 번호가 Interrupt Pin과 매치됨
EXTI를 사용할 때 Line, Mode, Trigger, Lineconfig를 설정후 Handler 구현 필요 
(8번핀은 EXTI9_5_IRQHandler 오버라이드)

EXTI line을 통해 입력 받은 신호는 레지스터 설정에 비교해 NVIC로 보내짐

NVIC란,
인터럽트 우선순위 비교하는 하드웨어 (Interrupt vector table의 값이 작을수록 우선순위가 높음)

Interrupt가 실행되고 NVIC가 Handler의 위치를 읽어 MCU에게 알려줘서 실행되기전 까지의 상태 => Pending (12 cycles정도 소요)
Handler가 실행되고 끝나기까지의 상태 => Active

GPIO_InitTypeDef {
  GIPO_Pin //핀 번호
  GPIO_Speed // 속도
  GPIO_Mode // 입출력 모드
}

GPIO_EXTILineConfig(GPIO_PortSourceGPION, GPIO_PinSourceN);

EXTI_InitTypeDef {
  EXTI_Line // 사용하는 exti line
  EXTI_Mode // 인터럽트 or 이벤트
  EXTI_Trigger // falling rising
  EXTI_LineCmd // enable
}

USART_InitTypeDef {
  USART_BaudRate // 송수신 속도
  USART_WordLength // 데이터 길이
  USART_StopBits // stop bit
  USART_Parity // parity no
  USART_Mode // Tx or Rx
  USART_HardwareFlowControl // none
}

USART_ITConfig(USART1, USAR_IT_RXNE, ENABLE);

NVIC_InitTypeDef {
  NVIC_IRQChannel // irq 채널
  NVIC_IRQCHannelPreemptionPriority // 0~15
  NVIC_IRQCHannelSubPriority // 0~15
  NVIC_IRQChannelCmd // ENABLE
}

void EXTI15_10_IRQHandler (void) {
  if (EXTI_GetITStatus (EXTI_Line10) != RESET) {
    if (GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_10) == Bit_Reset)
// do something
  }
  EXTI_ClearITPendingBit(EXTI_Line13);
}


Bluetooth
근거리 무선통신 기술 2.4 Mhz ISM 주파수 대역 사용
Master와 Slave 역할로 동작
Master가 Inquiry(검색)및 page(연결 요청)
Slave는 Inquiry Scan(검색 대기)및 page scane(연결 대기)

SPP (Serial Port Profile)
RS232 시리얼 케이블 에뮬레이션을 위한 블루투스 기기에 사용되는 프로파일
유선 RS232 케이블이 연결된 것처럼 무선 블루투스 통신을 수행할 수 있음

Identifier
SSID : 무선렌을 통해 클라이언트가 접속할 때 각 무선렌을 구별하기 위한 고유 식별자
UUID : 네트워크 상에서 서로 다른 개체들을 구별하기 위한 128비트 고유 식별자

블루투스 모듈 FB755AC (v2.1, 최대 7, AT)
status : 연결 대기및 시도, 검색할 때 low, high를 반복
stream control, stream status, message control, message status : 1:N 통신을 위한 연결
config select : 블루투스 모듈 설정시 사용, high를 입력한 채로 전원을 키면 설정모드
connect check/dcd : 설정된 연결수 만큼 master 연결시 low, 하나라도 해지되면 high

CONFIG


LCD, ADC
TFT-LCD 초 박막 액정표시장치
액체와 고체의 중간 특성을 가진 액정의 상태 변화와 편관판의 편광 성질을 이용해 통과하는 빛의 양을 조절함으로써 정보를 표시

RGB 픽셀이 유리판에 코딩되어 컬러 영상을 구현하는 Color Filter
액정을 제어하기 위해 조박형 유리 기판 위에 반도체 막을 형성한 회로인 TFT 기판
Filter와 기판 사이에 주입된 액정과 광원인 Black light unit으로 구성

Timing Diagram
CS는 low일 때(falling edge), chip이 동작 되도록 하는 신호이고 
DC가 low일 때 command 전송, high일 때 data를 전송한다. 
WR, RD는 high에서 low로 (falling edge) 변할때, data를 write/read(D0~D17)한다. 

각 symbol의 min time 내에 falling/rising을 해야한다.
write cycle = 100
read cycle = 1000
data access = 250

각 cmd및 data access 후 cs를 High, WR를 high로 돌려 놓아야한다.

ADC
아날로그 신호를표본화, 양자화, 부호화를 통해 디지털로 변환하는 것
표본화 : 일정한 간격으로 아날로그 신호의 값 추출
양자화 : 추출한 표본 샘플 신호의 레벨을 단계로 나누어 나타냄
부호화 : 양자화로 나눈 레벨에 속한 값을 이진수로 변환

ADC_InitTypeDef {
  ADC_Mode // ADC_Mode_Independent
  ADC_ScanConvMode // DISABLE
  ADC_ContinuousConvMode //
  ADC_ExternalTrigConv
  ADC_DataAlign
  ADCNbrOfChannel
}

ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_239Cycles5);


Timer, PWM
주기적 시간 처리에 사용하는 디지털 카운터 회로 모듈
펄스폭 계측, 주기적인 interrupt 발생 등에 사용
주파수가 높기 때문에 우선 prescaler를 사용해 주파수를 낮춘 후 낮아진 주파수로 8, 16비트 등의 카운터 회로를 사용해 주기를 얻는다

타이머 종류
SysTick Timer
Watchdog Timer
Advanced-control Timer(TIM1, TIM8)
General-purpose Timer(TIM2 ~ TIM5)
Basic Timer(TIM6, TIM7)


Systick Timer
real-time operating system 전용이지만 standard down counter로 사용 가능
24 bit down counter
programmable clock source
autoreload capability

Watchdog
특수 상황에서 CPU가 올바르게 작동하지 않을 시 강제로 리셋시키는 기능
소프트웨어 고장으로 인한 오작동을 감지하고 해결하는 역할을 한다
카운터가 주어진 시간 초과 값에 도달했을 때 시스템 재설정 또는 인터럽트를 트리거한다

IWDG
LSI 클럭 기반으로 메인 클럭이 고장나도 활성 상태 유지 가능
타이밍 정확도가 제약이 낮은 애플리케이션에 적합하다
카운터가 0이되면 reset

WWDG
7 but down counter
APB1 클럭을 프리스케일해서 정의 가능
time-window를 통해 비정상적 어플리케이션 동작 감지 가능
time-window 내에서 반응하는 애플리케이션에 적합
카운터가 0x40보다 작을 경우 또는 time-window 밖에서 reload 됐을 경우 reset 가능
Early wakeup interrupt 카운터가 0x40에 도달했을 때, 발생하게 설정가능

Advanced-control timers (TIM1 & TIM8)
prescaler를 이용해 설정 가능한 16 bit auto-reload counter를 포함
입력 신호 펄스 길이 측정(input capture) 또는 출력 파형(PWM) 생성등에 사용 가능
complementary output 기능을 지원해 PWM의 기능을 좀 더 보완

advanced-control과 general-purpose는 서로 독립적인 구조이지만 동기화 시키는 것도 가능하다

General-purpose timer (TIM2 ~ TIM5)
prescaler를 이용해 설정 가능한 16 bit up, down, up/down auto-reload counter를 포함
마찬가지로 입력 신호 철스 길이 측정 또는 출력 파형 발생등 다양한 용도로 사용할 수 있다.
펄스 길이와 파형 주기는 timer prescaler와 RCC clock controller prescaler를 사용해 몇 microsecond ~ ms까지 변조할 수 있다.
타이머들은 완전히 독립적이나 동기화가 가능하다.

분주란,
MCU에서 제공하는 Frequency를 우리가 사용하기 쉬운 값으로 바꾸는 작업
counter clock frequency를 1~65536의 값으로 나누기위해 16 bit programmable prescaler를 사용
period을 통해 몇 번 count 하는지 설정

1/Fclk * prescaler * period
1/72Mhz * 7200 * 10000 = 1s
1/72Mhz * 60000 * 1200 = 1s

Basic timer (TIM6 & TIM7)
16 bit auto-reload 업카운터
설정 가능한 16 bit prescaler를 이용해 the counter clock 주파수를 나누어 설정가능
DAC 트리거에 사용
카운터 오버플로우 발생시 인터럽트/DMA 생성

PWM
일정한 주기 내에서 Duty ratio를 변화시켜서 평균 전압을 제어하는 방법

서보모터는 50Hz의 주파수를 요구 (20ms)
~1ms (3.5) = -90
1.5ms (7.5) = 90
~2ms (11.5) = 180


DMA
Direct Memory Access
주변장치들이 메모리에 직접 접근하여 읽거나 쓸 수 있도록 하는 기능
CPU의 개입 없이 I/O 장치와 기억장치 데이터를 전송하는 접근 방식
Interrupt와 달리 별도의 중앙제어장치는 명령을 실행할 필요가 없음
메모리 처리 Interrupt의 사이클 만큼 성능의 향상

방식
1. RAM이 I/O 장치로부터 데이터가 필요해지면, CPU는 DMA 컨트롤러에게 신호를 보낸다
2. DMA 컨트롤러는 RAM 주소로 bus를 통해 데이터를 주고 받는다
3. 모든 데이터 전송이 끝나면, DMA Controller가 CPU에게 interrupt 신호를 보낸다

DMA Channel
모듈은 DMA Controoler의 DMA 채널을 통해 메모리 R/W
DMA 채널은 총 12개 (DAM1 7개, DMA2 5개)
한 DMA의 여러 채널 사이 요청은 prioritu에 따라 동작 (very high, high, medium, low)
periperal-to-memory, memory-to-peripheral, and peripheral-to-peripheral 전송

Normal Mode
DMA Controller는 데이터를 전송할 때 마다 NDT 값을 감소시킨다
NDT는 DMA를 통해 전송할 데이터의 총 용량을 의미하며 레지스터의 값이 0이 되면 데이터 전송을 중단한다
데이터 전송을 받고 싶을 때 마다 새롭게 요청이 필요하다

Circular Mode
주기적인 값의 전송(업데이트)이 필요할 때 사용하는 모드
NDT 값이 0이 될 경우 설정한 데이터 최대 크기로 재설정됨

DMA Controller
우선순위 설정 및 요청에 대한 서비스 제공
request/ack 방식을 통한 주변 장치 통신

DMA1 채널
ADC1, SPI/I2S, I2C, USART, TIM1, TIM2, TIM3, TIM4

DMA2 채널
ADC3, SPI/I2S3, SDIO, UART4, TIM5, TIM6/DAC_Channel1, TIM7, TIM8

ADC_DMACmd