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








 게시판 검색





 
 
회원등록 비번분실


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

      거래은행 바로가기
 
 Sensor Applications
아듀이노 응용소스
작성자 avrtools™        
작성일 2018/02/25
첨부#1 TFT_ILI9163C-master.zip (328KB) (Down:0)
첨부#2 generic_boot20_pc13.bin (21KB) (Down:0)
ㆍ추천: 0  ㆍ조회: 138   
  STM32F103C 32비트 ARM-CPU 2채널 Scope
72MHz 속도의 32비트 CPU 기판이 5,600원 이면, 이제 Arduino 기판도 32 비트로 세대교체가 되고있다.
 
 ARduino IDE에서 만든 소스로 컴파일도 잘되고 STM32F103C ARM32 기판에서 작동하는지 확인했다.
1. ARM32 M3 post complier의 확인
2. ARM32F1xx 기판의 작동확인
3. Blue-Pill STM32F103C 기판의 Timer, ADC, DMA의 작동확인
4. ILI9163C 128x128 TFT-LCD의 Library 성능확인 (첨부파일 #1)
 

 STM32F103C8T6 기판 (Blue-Pill 5,600원, 해외 USD 3.62)
사용한 MCU 기판: STM32F103C8T6 Blue-Pill
  

Blue-Pill STM32F103C 기판은 Maple-min의 호환성능의 Bootloader로 개조했다. (첨부파일 #2)
Bootloader generic_boot20_pc13.bin은 J-Link V8과 Segger사의 JFlash 6.31a로 구웠다.

Arduino IDE는 ARM32 post compile는 DUE를 보드관리에서 추가하여 설치했다.
STM32F103C 보드의 추가는 보드관리에서 STM32F1xx 보드를 추가하여 설치했다.  

Blue-Pill 기판의 Blootloader를 generic_boot20_pc13.bin으로 개조하면 ST-Link가 필요없다.
Blue-Pill 기판의 USB 포트는 직렬포트 COMx(보드 Maple-Mini)로 변경되어 Windows에서 자동으로 설치된다.
 

 ARduino IDE의 보드설정은 다음과 같다.
Generic STM32F103 Seriease,
Variant STM32F103C8(20K RAM 64K Falsh)
CPU speed 72MHz,
Upload Method STM32 Duino Bootloader
Optimizer Fastest -O3 혹은 with LTO
Port COMx (Maple Mini)
 
 STM32C103C Blue-Pill 기판의 핀 배열

 
위쪽의 4핀은 J-Link나 ST-Link를 연결하여 펌웨어를 변경하는 4핀 커넥터. (한번만 개조하면 된다)
아랫쪽의 노란 점퍼 2 개는 Boot-0과 Boot-1이다, J-Link로 펌웨어를 변경할 때만 Boot-0 위치를 변경한다.
참고로 STM32F103C8은 SRAM: 0x20000000~20KB, FALSH: 0x08000000~60KB를 내장하고 있다. 

 NOKIA 3310, 5110 크기의 1.44 인치 128x128 full-color TFT-LCD

 
NOKIA 5110,3310 크기와 같은 128x128의 TFT-LCD ILI9163C를 사용하려면 다음 Libarary를 설치해야 한다.
Library TFT_9163C.h: https://www.elecrow.com/wiki/images/1/15/TFT_ILI9163C_library.zip 
파일을 받아서 압축을 풀고 C:\문서\Arduino\libraries\ 안에 폴더를 통으로 옮겨 놓는다.

ILI9163C 1.44 인치 128x128 Full Color TFT LCD는 다음과 같이 STM32F102C8 기판과 연결한다.
1 VCC --- 3.3V --- VDD
2 GND --- GND --- GND
3 CS --- LCD_CS --- PB10
4 RST --- LCD_RST --- PB11
5 A0 --- LCD_DC --- PB12
6 SDA --- LCD_SDA --- PA7
7 SCK --- LCD_SCK --- PA4
8 LED --- 3.3V --- VDD (밝기 조절을 하려면 직렬로 저항을 사용하거나 PWM 포트에 연결한다)

//--------------------------------------------------------------------------------
// TFT-LCD Library =ILI9163C
//--------------------------------------------------------------------------------
#define LCD_CS PB10 // ILI9163-C PIN 3
#define LCD_RST PB11 // ILI9163-C PIN 4
#define LCD_DC PB12 // ILI9163-C PIN 5
#define LCD_SDA PA7 // 2nd SPI_MOSI =PB15
#define LCD_SCK PA5 // 2nd SPI_SCK =PB13

#include "SPI.h"
#include "Adafruit_GFX.h"
#include "TFT_ILI9163C.h"  // "TFT_ILI9163C.h"는 오류가 나면 '< >' 로 교체한다.
TFT_ILI9163C tft =TFT_ILI9163C(LCD_CS, LCD_DC, LCD_RST);

// Color definitions of ILI9163C
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF

// Color definitions of system display for graphic plot
#define BEAM1_ 0xFFFF // ILI9341_WHITE
#define BEAM2_ 0xFFE0 // ILI9341_YELLOW
#define GRID_ON 0x03EF // ILI9341_DARKSYAN
#define BEAM_OFF_ 0x0000 // ILI9341_BLACK
#define CURSOR_ 0x07E0 // ILI9341_GREEN

 STM32 O-scope 광역변수
//--------------------------------------------------------------------------------
// LED - blinks on trigger events
#define BOARD_LED PC13 // define as PC13 on the "Red/Blue Pill" boards

#define ANALOG_FS 4095 // Analog input max value 12 bit
float samplingTime =0;

// Variables for the beam position
uint16_t signalX ;
uint16_t signalY ;
uint16_t signalY1;
uint16_t signalY2;

// ZoomFactor (percentage)
int16_t xZoomFactor =1;
int16_t yZoomFactor =100; //Adjusted to get 3.3V wave to fit on screen
int16_t yPosition =0 ;

// Startup with sweep hold off or on
boolean triggerHeld = 0 ;
unsigned long timeBase =200; // grid scaling for time base =200us

// Screen dimensions
int16_t myWidth =128;
int16_t myHeight =128;
boolean notTriggered =true; // Trigger stuff

// If VAD =3.3 volts, then 1 unit of sensitivity is around 0.8mV
int32_t triggerValue = 2048; // Trigger default position (half of full scale)
int8_t triggerType =2; // 0-both 1-negative 2-positive
uint16_t triggerPoints[2]; // trigger points for detect level

// Serial output of samples - off by default. Toggled from UI/Serial commands.
//boolean serialOutput =false;
USBSerial usb; // Create USB serial port

//ILI9341 display 240x320 pixels,
#define maxSamples 1024*6 //1024*6 =Samples will use RAM 6,144 bytes
uint32_t startSample =1;
uint32_t endSample =maxSamples ;

// Array for the ADC data
uint32_t dataPoints32[maxSamples /2];
uint16_t *dataPoints =(uint16_t *)&dataPoints32;
uint16_t dataPlot[320]; //max(width,height) for this display

volatile static bool dma1_ch1_Active; // End of DMA indication
#define ADC_CR1_FASTINT 0x70000 // Fast interleave mode DUAL MODE bits 19-16

 DMA 설정 함수
//--------------------------------------------------------------------------------
//@brief Enable DMA requests
void adc_dma_enable(const adc_dev *dev)
{
//@param dev ADC device on which to enable DMA requests
bb_peri_set_bit(&dev->regs->CR2, ADC_CR2_DMA_BIT, 1);
};

// @brief Disable DMA requests
void adc_dma_disable(const adc_dev *dev)
{
//@param dev ADC device on which to disable DMA requests
bb_peri_set_bit(&dev ->regs ->CR2, ADC_CR2_DMA_BIT, 0);
};

static void DMA1_CH1_Event() // DMA interrupt handller
{
dma1_ch1_Active =0;
};

 하드웨어 장치(system) 초기화 함수
//--------------------------------------------------------------------------------
void setup()
{
// BOARD_LED blinks on triggering
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, HIGH);
delay(250);
digitalWrite(BOARD_LED, LOW);
delay(250);

usb.begin(115200);
adc_calibrate(ADC1);
adc_calibrate(ADC2);
initADCs (); //Setup ADC peripherals for interleaved continuous mode.

pinMode(PB0, INPUT_ANALOG); // Set up our sensor pin(s)
pinMode(PB1, INPUT_ANALOG); // Set up our sensor pin(s)
initDMA(); // start ADC1+ADC2 sampling by DMA

tft.begin();
tft.setBitrate(8000000); // spi clock divider =2 (max)
tft.setRotation(1);
myHeight =128;
myWidth =128;
tft.fillScreen(BLACK);

tft.setTextWrap(true);
tft.setTextColor(CURSOR_, BEAM_OFF_) ;
tft.setTextSize(1);
tft.setCursor(0, 0);

init_DAC(); // init 12 bit DAC of MCP4725 to do Timer2
start_DAC(); // start 1Khz sine wave DDS to MCP4725 by interrupt handller
}; // end of setup

  주함수
//--------------------------------------------------------------------------------
void loop()
{
f ( !triggerHeld ) // no hold?
{
trigger(); // Wait for trigger
if ( !notTriggered )
{
digitalWrite(BOARD_LED, !digitalRead(BOARD_LED)); // blinkLED();
startDMA(); // start ADC for analaog samples

samplingTime = micros();
while (dma1_ch1_Active); // wait end of dma transfer
samplingTime =(micros() -samplingTime);

erasePlot(BEAM_OFF_); // erase previous ploted
showGrid(); // Show Grid
drawPlot(BEAM1_); // Display new samples
}
else showGrid();
}
}; // end of loop()

 보조함수
//--------------------------------------------------------------------------------
// GRID를 그린다, 메뉴를 표시한다
//--------------------------------------------------------------------------------
void showGrid()
{
// draw grid box for 20x20 dots
tft.drawRect(1, 2, myWidth-1, myHeight-2, GRID_ON);
for(int y =5; y for(int x =4; x
// print menu
tft.setCursor(8, 8); // time base =10ms/div
tft.print("200us/div");
tft.setCursor(74, 8);
tft.print("0.5V/div");

tft.setCursor(8, 116);
tft.print(samplingTime/1000, 1);
tft.print("ms/frame");
};

//--------------------------------------------------------------------------------
// STM32F103C는 변환속도 2MHz의 12 비트 ADC가 2개다.
// ADC1과 ADC2를 DMA 고속전송 방식으로 초기화한다.
//--------------------------------------------------------------------------------
// STM32F103C8 Analog input pin: GPIO 10~17 (PA0~PA7), GPIO 18~19 (PB0~PB1)
const int8_t analogInPin1 =PA0; // 아날로그 핀 PA0을 ADC1으로 고정
const int8_t analogInPin2 =PA1; // 아날로그 핀 PA1을 ADC2로 고정 

void initADCs ()
{
int pinMapADCin1 =PIN_MAP[analogInPin1].adc_channel; // ADC1 =PA0
int pinMapADCin2 =PIN_MAP[analogInPin2].adc_channel; // ADC2 =PB1

adc_set_sample_rate(ADC1, ADC_SMPR_1_5); // 0.58uS/sample. use this one if Rin>10Kohm,
adc_set_sample_rate(ADC2, ADC_SMPR_1_5); // if not may get some sporadic noise. see datasheet.

adc_set_reg_seqlen(ADC1, 1);
ADC1 ->regs ->SQR2 =pinMapADCin1; // ADC1 =pinMapADCin1 =PA0
ADC1 ->regs ->CR1 |=ADC_CR1_FASTINT; // Interleaved mode
ADC1 ->regs ->CR2 |=(ADC_CR2_CONT); // Set continuous mode and DMA

adc_set_reg_seqlen(ADC2, 2);
ADC2 ->regs ->SQR3 =pinMapADCin2; // ADC2 =pinMapADC2 =PB0
ADC2 ->regs ->CR2 |=ADC_CR2_CONT; // ADC 2 continue and start
};

//--------------------------------------------------------------------------------
// 화면에 그리는 교류파형의 시작위치를 검출한다
//--------------------------------------------------------------------------------
void trigger()
{
triggerValue =1024 +(analogRead(analogInPin2) /2); // for level trigger by analogInPin2 =PB0
//triggerValue =2048; // reference level =0Vac

notTriggered =true;
switch (triggerType)
{
case 1:
triggerNegative() ;
break;

case 2:
triggerPositive() ;
break;
}
};

void triggerPositive()
{
triggerPoints[0] =analogRead(analogInPin1); // 1st data level
while(notTriggered)
{
triggerPoints[1] =analogRead(analogInPin1); // 2nd data level
if ((triggerPoints[1] >triggerValue) && (triggerPoints[0] {
notTriggered =false;
}
triggerPoints[0] =triggerPoints[1]; //analogRead(analogInPin);
}
};

void triggerNegative()
{
while(notTriggered)
{
triggerPoints[1] =analogRead(analogInPin1);
if ( (triggerPoints[1] triggerValue) )
{
notTriggered =false;
}
triggerPoints[0] =triggerPoints[1]; //analogRead(analogInPin);
}
};

//--------------------------------------------------------------------------------
// 이 함수는 동시에 2CH ADC를 변환하고, DMA를 자동전송으로 설정한다.
//--------------------------------------------------------------------------------
void initDMA()
{
dma_init(DMA1);
dma_attach_interrupt(DMA1, DMA_CH1, DMA1_CH1_Event); // init DMA interrurpt handller =DMA1_CH1_Event
adc_dma_enable(ADC1); // bb_peri_set_bit(&ADC1->regs->CR2, ADC_CR2_DMA_BIT, 1);

// start DMA transfer for dummy
dma_setup_transfer(DMA1, DMA_CH1, &ADC1->regs->DR, DMA_SIZE_32BITS, dataPoints32, DMA_SIZE_32BITS, (DMA_MINC_MODE | DMA_TRNS_CMPLT)); // Receive buffer =dataPoints32[]
dma_set_num_transfers(DMA1, DMA_CH1, maxSamples /2);
dma_enable(DMA1, DMA_CH1); // Enable the channel and start the transfer.
};

void startDMA()
{
dma_setup_transfer(DMA1, DMA_CH1, &ADC1->regs->DR, DMA_SIZE_32BITS, dataPoints32, DMA_SIZE_32BITS, (DMA_MINC_MODE | DMA_TRNS_CMPLT)); // Receive buffer =dataPoints32[]
dma_set_num_transfers(DMA1, DMA_CH1, maxSamples /2);
dma_enable(DMA1, DMA_CH1); // Enable DMA channel and start DMA transfer.

dma1_ch1_Active =1; // turn off at DMA interrupt handller
};

//--------------------------------------------------------------------------------
// 먼저 그려진 교류파형을 지운다
//--------------------------------------------------------------------------------
void erasePlot(uint16_t removeColor)
{
  for (signalX =1; signalX<myWidth -2; signalX +=2)
  {
    tft.drawLine (signalX, dataPlot[signalX -2], signalX +2, dataPlot[signalX], removeColor) ; // erase ploted ADC1
  }
 
  for (signalX =2; signalX <myWidth -2; signalX +=2)
  {
    tft.drawLine (signalX, dataPlot[signalX -2], signalX +2, dataPlot[signalX], removeColor) ; // erase ploted ADC2
  }
};

//--------------------------------------------------------------------------------
// dataPoint[ ]로 들어온 교류파형을 화면에 그린다.
// 그린 파형은 화면을 빨리 지우기 위해 dataPlot[ ]에 저장한다.
//--------------------------------------------------------------------------------
void drawPlot(uint16_t beamColour)
{
//calculate first sample
signalY =((myHeight *dataPoints[0 *((endSample -startSample) /(myWidth *timeBase /100)) +1]) /ANALOG_FS) *(yZoomFactor /100) +yPosition;
dataPlot[0] =signalY *99 /100 +1;

// Scale our samples to fit our screen. Most scopes increase this in steps of 5, 10, 25, 50, 100, 250, 500, 1000 etc
for (signalX =1 ; signalX<myWidth -2; signalX +=2)   // ADC1 value in even address (PA0)
{
  signalY1 =((myHeight *dataPoints[(signalX) *((endSample -startSample) /(128 *timeBase /100)) +1]) /4095) *(yZoomFactor /100) +yPosition+5 ;
  dataPlot[signalX] =signalY1 *99 /100; // store scalled value to plot
  tft.drawLine (signalX, dataPlot[signalX -2], signalX +2, dataPlot[signalX], BEAM1_); // plot ADC1
  signalY =signalY1;
}
 
for (signalX =2 ; signalX <myWidth -2; signalX +=2)   // ADC2 vale in odd address (PA1)
{
  signalY2 =((myHeight *dataPoints[(signalX) *((endSample -startSample) /(128 *timeBase /100)) +1]) /4095) *(yZoomFactor /100) +yPosition+5 ;
  dataPlot[signalX] =signalY2 *99 /100; // store scalled value to plot
  tft.drawLine (signalX, dataPlot[signalX -2], signalX +2, dataPlot[signalX], BEAM2_); // plot ADC2
  signalY =signalY2;
}
}; // end of code

 참조: STM32 O-scope http://stm32duino.com/viewtopic.php?f=19&t=107&p=1202#p1194 
 첨부파일 #1: ILI9163C.h+Adafruit_GFX.h
 첨부파일 #2: generic_boot20_pc13.bin (STM32duino Bootloader) 

 이 펌웨어 소스를 응용한 장치의 개발이나, 주문형 펌웨어가 들어간 모듈 주문 받습니다.
 주의 : 이 자료의 무단 복제 및 무단 배포를 금지합니다.
이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
 AVRTOOLS™
   
윗글 STM32F103C ILI9341 TFTLCD Scope V2
아래글 STM32F103C의 ILI9341 ILI9163 TFT-LCD 연결방법
    N         제목    글쓴이 작성일 조회 추천
아듀이노 응용소스 게시판 avrtools™ 2016/02/05 (금) 423 0
41 STM32F103C 12비트 정현파 DDS V2 avrtools™ 2018/03/08 (목) 109 0
40 STM32F103C ILI9341 TFTLCD Scope V2 avrtools™ 2018/03/05 (월) 132 0
39 STM32F103C 32비트 ARM-CPU 2채널 Scope avrtools™ 2018/02/25 (일) 138 0
38 STM32F103C의 ILI9341 ILI9163 TFT-LCD 연결방법 avrtools™ 2018/02/19 (월) 136 0
37 STM32F103C+MCP4725 DDS 1KHz 정현파 발생기 avrtools™ 2018/02/18 (일) 135 0
36 STM32F103C 기판의 1~8CH ADC DMA 전송 avrtools™ 2018/02/17 (토) 136 0
35 STM32F103C 기판의 SSD1306 OLED 구동 avrtools™ 2018/02/16 (금) 132 0
34 STM32F103C ARM32 기판의 독립 IDE 소개 avrtools™ 2018/02/14 (수) 166 0
33 STM32F103C ARM32 기판의 Bootloader 개조 avrtools™ 2018/02/14 (수) 174 0
32 ESP32+OLED 기판과 PWM generator avrtools™ 2018/02/11 (일) 135 0
31 Wemos-Lolin32 Audio FFT Analyzer 제작 avrtools™ 2018/02/07 (수) 140 0
30 DUE SAM3X8E Audio FFT Analyzer 제작 avrtools™ 2018/01/30 (화) 154 0
29 AD5933 LCR-Impedance Analyzer 제작 avrtools™ 2012/03/17 (토) 661 0
28 ESP-01 펌웨어 업그레이드와 WiFi 2 Relay Control avrtools™ 2017/12/24 (일) 133 0
27 ESP12E-devKit로 만드는 WiFi 4 Relay 제어장치 avrtools™ 2017/12/23 (토) 155 0
26 M328-mini로 만드는 Touch 용량검출센서 avrtools™ 2017/12/19 (화) 142 0
25 ESP8266 MQTT Relay Control avrtools™ 2016/03/03 (목) 626 0
24 2 채널 ESP8266 WiFi Switch의 제작 avrtools™ 2016/02/25 (목) 784 0
23 ESP-12E SDK 0.9.5 사용방법 avrtools™ 2016/02/18 (목) 672 0
22 ESP8266 ESP-12E WiFi 센서 서버의 제작 avrtools™ 2016/02/17 (수) 635 0
21 Arduino DS3231 RTC to 5110 LCD avrtools™ 2016/02/16 (화) 643 0
20 ESP8266 Weather Server의 제작 avrtools™ 2016/02/15 (월) 678 0
19 Arduino 온습도 센서 DHT-22 avrtools™ 2016/02/12 (금) 558 0
18 ESP8266 WiFi 펌웨어 업그레이드 avrtools™ 2016/02/11 (목) 878 0
17 Arduion ESP8266 WiFi 설정 방법 avrtools™ 2016/02/10 (수) 859 0
16 Arduino 정전용량식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 477 0
15 Arduino 전극식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 623 0
14 Arduino 정밀 전력계의 ADC avrtools™ 2016/02/02 (화) 903 0
13 Arduino 정밀 전력계의 LPF avrtools™ 2016/02/02 (화) 616 0
12 Ardunio 16비트 ADC Data Logger avrtools™ 2016/01/31 (일) 512 0
11 Arduino AC/DC Power Meter의 제작 avrtools™ 2016/01/29 (금) 1019 0
10 Arduino 교류 역율계(power factor)의 제작 avrtools™ 2016/01/29 (금) 651 0
9 Arduino DUE Pezo-SPeaker LCQ Meter 소스 avrtools™ 2016/01/24 (일) 425 0
8 QTouch ADC 근접검출 스위치 avrtools™ 2016/01/21 (목) 652 0
7 Arduino 음성인식 Speech/Voice Recognition avrtools™ 2013/09/14 (토) 1872 0
6 Arduino Uno로 만드는 3축 CNC avrtools™ 2013/09/10 (화) 2812 0
5 Arduino로 만드는 mySpectral 분광기 avrtools™ 2013/09/04 (수) 2335 0
4 8채널 12비트 ADC MCP3208 오실로스코프 avrtools™ 2012/03/29 (목) 708 0
3 교류저항 (impedance) 측정 AD5933 avrtools™ 2012/03/17 (토) 648 0
2 Arduino DMX512 수신기 제작 avrtools™ 2012/03/15 (목) 3922 0
1 TSL2561 조도 측정기의 제작 avrtools™ 2011/09/11 (일) 2874 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