ADC DMA
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
Temp Sensor 내장: Chip 과열 검출
5) 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
Address Offset 0x3C ~ 0x48 (0x3C, 0x40, 0x44, 0x48)
4) Resular 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;
이후에 추가 예정