로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Sensor Applications
아듀이노 응용소스
작성자 avrtools™        
작성일 2018/02/17
ㆍ추천: 0  ㆍ조회: 188   
  STM32F103C 기판의 1~8CH ADC DMA 전송
STM32F103C 개발기판에서 4CH analog 입력을 DMA로 자동전송하는 기능이다.
ARM-cortex 32비트 CPU STM32F103C는 STM32 Blue-Pill 이라는 상품으로 USD 5.60으로 무료배송이다.  
 
 
STM32 기판은 주로 중국산으로 국내 online 매장에서 6,00원+배송비로 구입할 수 있다.
만일 적은 수량을 구입한다면 STM32F103C8T6를 사용한 Maple-mini를 추천한다.

Maple-mini (국내가격 15,000원, 해외 USD 9.50)는 RAM 20K Falsh 120K로 Blue-Pill의 2 배이며 I/O 핀도 많다.
결정적인 기능은 DFU bootloader가 들어 있어 bootloader를 굽지 않아도 아두이노 IDE에 바로 연결된다. 
  
 
STM32 Blue-Pill을 가지고 있다면 아래의 ST-Link (USD 12.00)로 STM32 기판의 펌웨어를 구울 수 있다.
 
 
J-Link (해외 USD 5.80 무료배송)로 STM32 기판의 펌웨어를 구울 수 있다.
 
 
 STM32dunio의 소개  
상세한 정보는 STM32-duino의 소개에 있다. (STM32F103C 부트로더의 개조)
공개 하드웨어/소스 Maple-mini DFU bootloader로 개조하면 아두이노 IDE에서 바로 사용할 수 있다.
 
  
STM32duino wiki 사이트에서 STM-duino의 부트로더 개조방법을 찾았다.
STM32F103C8 개발기판의 USB 포트가 결국 펌웨어 굽는(Uploading Programmer) 도구로 작동한다.

STM32-duino Maple-mini wiki :  http://wiki.stm32duino.com/index.php?title=Installation
STM32-duino Maple-mini 회로도:  Maple_mini_clone_schematic.jpg(126.7KB)

 주함수에서는 AD[0]에서 AD[3]까지 DMA가 전송한 배열변수를 직렬데이터로 전송한다.
 

AD0과 AD2는 VDD에 연결하고, AD1과 AD3은 GND에 연결해서 아날로그 값이 다른 채널로 혼입되는지 확인한다.
사용하지 않는 아날로그 채널은 GND로 연결해야, 사용하는 아날로그 채널의 잡음 혼입을 방지할 수 있다.
 
STM32의 10채널 12 비트 ADC의 아날로그 값들의 흔들림(drift) 즉 안정도는 6mV/3300mV =0.18%로 나온다.  
STM32의 M3 계열 F103C CPU는 12비트 ADC 2개로 10개 CH에 연결하여 아날로그 값을 읽을 수 있다.
아날로그 값으로 읽을 수 있는 포트의 핀은 PA0~PA7, PB0~PB1으로 모두 10개다.

 Maple-mini bootloader로 개조한 STM32F103C 기판의 실험에 사용한 Arduino 코드.
코드는 크게 6 부분으로 분리된다. 순서대로 설명하면 다음과 같다.

1. 주석부: 소스의 용도와 분류, 소속, 작성자 혹은 출처를 설명하는 부분
2. 선언부: 상수와 변수를 정의한다.
3. 가로채기 함수: 선언부에서 설정한 interrupt가 있는 경우 발생한 interrupt를 처리하는(handller) 함수다.
4. setup() : CPU가 리셋이후에 처음 한번만 작동하는 함수, 주로 hardware를 설정하는 함수다.
5. loop(): 주함수 main() 이며, 보이지 않는 while(1){,,,,,} 안에 있다. setup()을 실행하고 여기로 온다. 
6: 보조함수 : 주함수가 호출하여사용하는 하위 코드, 반복사용시 FLASH 용량을 절약한다.

또한 주함수에서 보조함수를 호출만 하면 되므로, 주함수에서 코드의 생성을 편하게 한다.
위의 순서대로 DMA 전송기능으로 ADC를 읽어서 배열변수로 자동전송하는 소스를 설명한다.
 
 여러개의 ADC CH(아날로극 입력 핀)의 아날로그 값을 DMA로 자동전송하는 소스
일반적으로 가장 윗단에는 소스를 설명하는 주석부가 들어간다. 

// PCB : STM32-Blue-Pill
// CPU: STM32F103C8T6
// IDE: Arduino IDE 1.8.5
// IDE Borad: STM32 duino
// Bootloader : Maple-mini bootloader 2.0
// Upload Software: Arduino IDE  Maple-mini DFU bootloader 0.1

 선언부
#define maxSmaples 8을 크게하면 PC가 멈출 때 까지 많은 데이터가 USB로 들어온다.
maxSamples는 DMA로 전송하는 buffer의 크기이다.

STM32 CPU의 DMA를 설정하면 ADC에서 아날로그 값을 읽어 배열변수로 자동전송한다.
예를 들어 전송 채널을 4로하면 등록된 A0~A4를 배열변수에 순서대로 전송한다.

#include <STM32ADC.h>
STM32ADC myADC(ADC1);

USBSerial usb;

#include <HardwareTimer.h>
long ticks;

const int A0 =PA0;
const int A1 =PA1;
const int A2 =PA2;
const int A3 =PA3;
const int LED =PC13;

#define maxSamples 8
uint16_t buffer[maxSamples];
uint16_t *buff_select[2];
uint8_t buff_rd;
uint8_t buff_wr;

#define sampleFreqKhz 200
#define samplePeriodus 1000 /sampleFreqKhz
#define ticksPerSecond 2 *sampleFreqKhz *1000 /maxSamples

 가로채기 처리함수
void TimerIRQ(void)
{
  ticks++;
}

void DmaIRQ(void)
{
  buff_wr =(buff_wr +1) %2; // end of write to buffer
}

 초기화 함수
// the setup function runs once when you press reset or power the board
void setup()
{
  pinMode(A0, INPUT_ANALOG); // PA0 on A0 12bit
  pinMode(A1, INPUT_ANALOG); // PA1 on A1 12bit
  pinMode(A2, INPUT_ANALOG); // PA2 on A2 12bit
  pinMode(A3, INPUT_ANALOG); // PA3 on A3 12bit
  pinMode(LED, OUTPUT); // PC13 on borad LED

  ticks =0;
  buff_rd =0; // flag of read dma buffer
  buff_wr =0; // flag of write dma buffer

  buff_select[0] =&buffer[0]; // buffer selector of buffer[0]
  buff_select[1] =&buffer[maxSamples/2]; // buffer selector of buffer[1]

  Timer3.setPeriod(samplePeriodus);
  Timer3.setMasterModeTrGo(TIMER_CR2_MMS_UPDATE);

  myADC.calibrate(); //calibrate ADC
  myADC.setSampleRate(ADC_SMPR_1_5);//set the Sample Rate
  myADC.setScanMode(); //set the ADC in Scan mode.
  myADC.setPins(analogPins, 4); //set how many and which pins to convert.

  myADC.setDMA(buffer, maxSamples,
  (DMA_MINC_MODE | DMA_CIRC_MODE | DMA_HALF_TRNS | DMA_TRNS_CMPLT), DmaIRQ);

  myADC.setTrigger(ADC_EXT_EV_TIM3_TRGO); 
  myADC.startConversion(); // ADC is set as continuous mode, start the conversion.

  usb.begin(115200);
  usb.print(" ");
}; // end of setup

 광역변수
주함수와 보조함수가 사용하는 광역변수로 주함수 안에 있으면 보조함수에서 사용할 수 없다.

float adc0_value =0; // temp of 12 bit adc 0
float adc2_value =0; // temp of 12 bit adc 2

 보조함수
만일 보조함수가 있다면 여기에 넣는다. 혹은 주함수 아래에 있어도 된다.
STM32는 보조함수의 위치가 주함수 뒤에 있어도 잘 된다.
 
 주함수
// the loop function runs over and over again forever
void loop()
{
  if (buff_rd !=buff_wr) // exchanged buffer? 
  { 
    for(uint8_t p =0; p
    usb.print(" buffer["); 
    usb.print(p, DEC); 
    usb.print("]="); 

    adc0_value =buff_select[buff_rd][p] *3.3/4095; // make voltage 
    usb.print(adc0_value, 3); 

    usb.print("Vdc "); 
    } 
    buff_rd =(buff_rd +1) %2; // flag for end of read from dma buffer 
  } 

  if (ticks ==ticksPerSecond) 
  { 
    digitalWrite(LED, !digitalRead(LED)); 
    ticks = 0; 
  }
}; // end of main()

 STM32F103C Blue-Pill 기판의 Boot 점퍼
 
 
불루필 기판의 부트점퍼는 2개가 있다. 하나는 Flash로 굽는 Boot-0 이고, RAM으로 굽는 Boot-1 이다.
Flash는 64K 이므로 부트로더를 제외하면 60KB를 사용자 App으로 구울수 있으나 SRAM은 20KB 뿐이다.
그래서 Boot-1을 사용하면 굽기는 빠르지만, 메모리부족에 시달리므로 대부분 Boot-0를 사용한다.
 
아두이노는 STM32-duino Bootloader로 설정하면 IDE는 펌웨어 업로드용 USB-DFU 직렬포트를 찾는다.
만일 Bootloader를 Serial로 하면 Raw Serial로 나오면서 STM32 기판의 직렬포트로 전송해야 한다.
물론 별도의 FT232로 만든 USB2serial 어댑터가 있어야 한다. 다른 칩은 사용해도 잘 안된다.
 
ARM-CPU는 Boot 방법이 다른 CPU와 다르다. 리셋이 되면 내장 부트로더가 점퍼를 확인한다.
점퍼의 위치에 따라 이 부트로더는 펌웨어를 RAM과 Falsh로 분리하여 굽는다.
ST-Flash 프로그램으로 J-Link나 ST-Link로 구울 때도 Boot-0 점퍼는 위치를 우측(3.3V)으로 바꿔야 한다.

물론 다 굽고 나면, 점퍼를 원래 위치로 하고, 리셋하면 내장 부트로더->사용자 부트로더->응용코드로 작동된다.
그래서 사용자 부트로더(Maple-mini)가 PC13의 LED를 1초 동안 깜빡이는 작동이 중간에 나타난다. 
Maple-mini 부트로더를 구웠다면, 부트점퍼-0을 3.3V로 바꾸기 전에는 USB-DFU 포트로 펌웨어를 굽는다.

USB-DFU 부트로더는 통신포트로 연결하지만, 실제는 USB-DFU 드라이버를 사용하는 CDC 포트다.
USB-DFU 부트로더는 USB토트로 펌웨어를 구울때 점퍼를 바꾸지 않고 UNO처럼 App 상태로 둔다. 
부트점퍼를 사용하는 자체 부트로더는 Serial 과 J-Link로 연결되는 SWD포트를 모두 사용할 수 있다.

부트로더를 굽는 Flash 프로그램은 다른 CPU와 공용이므로 항상 Flash 메모리의 주소를 묻는다. 
STM32F103C 기판의 Flash 주소는 0x0800,0000 이다. RAM 주소는 0x20000,0000 이다. (편의상 4 자리로 분리) 
만일 USB-DFU 부트로더가 구워져 있다면, Bootloader는 자기영역 윗쪽의 주소부터 굽는다. (예 0x0800,3000)
 

이 펌웨어 소스를 응용한 장치의 개발이나, 주문형 펌웨어가 들어간 모듈 주문 받습니다.

주의 : 이 자료의 무단 복제 및 무단 배포를 금지합니다.
이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
 AVRTOOLS™

   
윗글 STM32F103C+MCP4725 DDS 1KHz 정현파 발생기
아래글 STM32F103C 기판의 SSD1306 OLED 구동
    N         제목    글쓴이 작성일 조회 추천
아듀이노 응용소스 게시판 avrtools™ 2016/02/05 (금) 462 0
41 STM32F103C 12비트 정현파 DDS V2 avrtools™ 2018/03/08 (목) 146 0
40 STM32F103C ILI9341 TFTLCD Scope V2 avrtools™ 2018/03/05 (월) 174 0
39 STM32F103C 32비트 ARM-CPU 2채널 Scope avrtools™ 2018/02/25 (일) 173 0
38 STM32F103C의 ILI9341 ILI9163 TFT-LCD 연결방법 avrtools™ 2018/02/19 (월) 169 0
37 STM32F103C+MCP4725 DDS 1KHz 정현파 발생기 avrtools™ 2018/02/18 (일) 185 0
36 STM32F103C 기판의 1~8CH ADC DMA 전송 avrtools™ 2018/02/17 (토) 188 0
35 STM32F103C 기판의 SSD1306 OLED 구동 avrtools™ 2018/02/16 (금) 166 0
34 STM32F103C ARM32 기판의 독립 IDE 소개 avrtools™ 2018/02/14 (수) 217 0
33 STM32F103C ARM32 기판의 Bootloader 개조 avrtools™ 2018/02/14 (수) 230 0
32 ESP32+OLED 기판과 PWM generator avrtools™ 2018/02/11 (일) 182 0
31 Wemos-Lolin32 Audio FFT Analyzer 제작 avrtools™ 2018/02/07 (수) 184 0
30 DUE SAM3X8E Audio FFT Analyzer 제작 avrtools™ 2018/01/30 (화) 197 0
29 AD5933 LCR-Impedance Analyzer 제작 avrtools™ 2012/03/17 (토) 711 0
28 ESP-01 펌웨어 업그레이드와 WiFi 2 Relay Control avrtools™ 2017/12/24 (일) 170 0
27 ESP12E-devKit로 만드는 WiFi 4 Relay 제어장치 avrtools™ 2017/12/23 (토) 197 0
26 M328-mini로 만드는 Touch 용량검출센서 avrtools™ 2017/12/19 (화) 183 0
25 ESP8266 MQTT Relay Control avrtools™ 2016/03/03 (목) 669 0
24 2 채널 ESP8266 WiFi Switch의 제작 avrtools™ 2016/02/25 (목) 878 0
23 ESP-12E SDK 0.9.5 사용방법 avrtools™ 2016/02/18 (목) 719 0
22 ESP8266 ESP-12E WiFi 센서 서버의 제작 avrtools™ 2016/02/17 (수) 694 0
21 Arduino DS3231 RTC to 5110 LCD avrtools™ 2016/02/16 (화) 703 0
20 ESP8266 Weather Server의 제작 avrtools™ 2016/02/15 (월) 738 0
19 Arduino 온습도 센서 DHT-22 avrtools™ 2016/02/12 (금) 589 0
18 ESP8266 WiFi 펌웨어 업그레이드 avrtools™ 2016/02/11 (목) 962 0
17 Arduion ESP8266 WiFi 설정 방법 avrtools™ 2016/02/10 (수) 935 0
16 Arduino 정전용량식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 516 0
15 Arduino 전극식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 660 0
14 Arduino 정밀 전력계의 ADC avrtools™ 2016/02/02 (화) 991 0
13 Arduino 정밀 전력계의 LPF avrtools™ 2016/02/02 (화) 643 0
12 Ardunio 16비트 ADC Data Logger avrtools™ 2016/01/31 (일) 563 0
11 Arduino AC/DC Power Meter의 제작 avrtools™ 2016/01/29 (금) 1091 0
10 Arduino 교류 역율계(power factor)의 제작 avrtools™ 2016/01/29 (금) 702 0
9 Arduino DUE Pezo-SPeaker LCQ Meter 소스 avrtools™ 2016/01/24 (일) 447 0
8 QTouch ADC 근접검출 스위치 avrtools™ 2016/01/21 (목) 724 0
7 Arduino 음성인식 Speech/Voice Recognition avrtools™ 2013/09/14 (토) 1908 0
6 Arduino Uno로 만드는 3축 CNC avrtools™ 2013/09/10 (화) 2863 0
5 Arduino로 만드는 mySpectral 분광기 avrtools™ 2013/09/04 (수) 2376 0
4 8채널 12비트 ADC MCP3208 오실로스코프 avrtools™ 2012/03/29 (목) 747 0
3 교류저항 (impedance) 측정 AD5933 avrtools™ 2012/03/17 (토) 699 0
2 Arduino DMX512 수신기 제작 avrtools™ 2012/03/15 (목) 3974 0
1 TSL2561 조도 측정기의 제작 avrtools™ 2011/09/11 (일) 2910 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0