해보자

ADC DMA

chalie 2023. 4. 21. 17:46

ARM Cortex-M3 시스템 프로그래밍 완정 정복 책을 공부하며, 필요하다고 생각되는 부분을 정리하였다.

 

1. ADC(analog-to-digital converter)

1) Low/Medium-density

  - 2개의 12bit ADC

2) high -density

 - 3개의 12bit ADC

3) 이해를 돕기 위한 간략한 예시

 - ADC 12bit는 0x000 ~ 0xFFF의 범위

- 동작 전원이 3.3V의 경우 0 ~ 3.3V의 범위를 0x000 ~ 0xFFF로 표현

4) STM32 Line Block Diagram

ADC Block

Temp Sensor 내장: Chip 과열 검출

5) Clock Tree

Clock Tree

ADC Clock는 APB2 Prescaler를 지나 PCLK2로 공급되는 Clock를 받는다.

ADC의 최대 Clock는 14MHz이다 

 

2. Injected Ch & Regular Ch

1) Injected

 -> Regular Ch보다 우선 순위가 높다.

 -> injected data register 4개가 존재 (각 CH마다 data register 보유)

2) Regular

 -> Injected Ch보다 우선 순위가 낮다

 -> 16ch이 하나의 data register를 공유

3) Injected Data Register

injected data register (x=1..4)

Address Offset 0x3C ~ 0x48 (0x3C, 0x40, 0x44, 0x48)

4) Resular data Register

regular data register

Address Offset 0x4C

상위 Bit 31:16 ADC2DATA[15:0]: ADC2 data

ADC1, 2를 Dual mode로 사용 시 ADC2에 의해 변환된 값이 저장된다.

문서의 곰돌이 UI 부분은 잘 이해가 안간다. 책 421를 더 읽어보기 바란다.

 

4) Data alignment

-> ADC_CR2 register은 Align bit를 설정함

-> Conversation이 일어난 Data를 16bit data register에 저장 시 저장 방법

-> ADC는 12bit이고 16bit 저장 공간에 저장 시 공간이 남기 때문에 이를 설정하는 방법

 

5) Scan Mode

ADC_SQRx, ADC_JSQR register에서 선택된 CH을 순서대로 하나씩 각 CH에 대해 conversation 수행

ADC를 얼추 훌터보고 다시 봐야겠다. Page 422

 

6) Calibration

Calibration을 수행하여 capacitor의 측정 오차를 보정한다.

 

3. Code

1) Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c

ADC Clock는 최대 14Mhz, PCLK2는 72Mhz이기 때문에 6으로 나누어 사용

RCC->CFGR |= (uint32_t)RCC_CFGR_ADCPRE_DIV6;

 

이후에 추가 예정