ST Visual Develop 에서 컴파일 하려면 Cosmic 컴파일러를 깔아야 하는데 그에 관련된 내용이 있는 카페

http://cafe.naver.com/rtboss/101

 

그 외에 좋은 내용이 많습니다.

 

제가 설명 못한 bootloader에서 시리얼을 이용해 다운로드 하는 방법

http://cafe.naver.com/fwdh/80

 

 

 

 

'공부 > STM8' 카테고리의 다른 글

[STM8] STM8 살펴 보기  (0) 2012.11.13
[STM8L] 참고회로  (0) 2012.11.12
[STM8] STM8L 해보기 6  (3) 2012.11.12
[STM8] STM8L 해보기 5  (0) 2012.11.12
[STM8] STM8L 해보기 4  (0) 2012.11.12

STM8L 해보기 6

약간의 소스 설명을 해보고자 한다.

 

1. Main 에서 먼저 해야 할 것은 GPIO를 선언하는 것이다.

GPIO 선언부를 확인해 보자

#define BUTTON_SW1_GPIO_PORT GPIOC

#define BUTTON_SW1_GPIO_PIN GPIO_Pin_5

GPIO_Init( BUTTON_SW1_GPIO_PORT, BUTTON_SW1_GPIO_PIN, GPIO_Mode_In_PU_IT);

GPIOC 에 PIN5번이 pullup으로 설정된 인터럽트 가능한 입력 포트로 설정된 것이다.

 

또 다른 GPIO 선언부를 확인해 보면

#define LED_GREEN_PORT        GPIOB

#define LED_GREEN_PIN        GPIO_Pin_1

GPIO_Init( LED_GREEN_PORT, LED_GREEN_PIN, GPIO_Mode_Out_PP_High_Fast);

GPIOB 에 PIN1번이 pullup으로 설정된 출력 포트로 설정된 것이다.

 

실제 사용 예를 보면

// GPIO_LOW(a,b)        a->ODR&=~b

GPIO_LOW(LED_GREEN_PORT,LED_GREEN_PIN);

 

2. Clock 를 선언한다.

내부 또는 외부 Clock 을 선언 할 수 있는데 처음 BOOT 하면 내부 Clock 사용으로 선택 되고 16M의 8분주로 2MHz로 동작 된다.

이후 만약 내부 클럭 최대 속도로 동작하려면

CLK_SYSCLKSourceSwitchCmd(ENABLE);

CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);

CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); // system clock prescaler: 1

while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI) {}

내부 클럭 HIS로 선언하고 prescaler을 1로 선언해서 최대 속도로 동작한다.

설정이 완료된 후 안정화 될 때까지 기다린다.

 

만약 내부 클럭 최저 속도로 동작하려면

CLK_SYSCLKSourceSwitchCmd(ENABLE);

CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);

CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_128); // system clock prescaler: 1

while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI) {}

내부 클럭 HIS로 선언하고 prescaler을 128로 선언해서 최소 속도로 동작한다.

설정이 완료된 후 안정화 될 때까지 기다린다.

 

3. 인터럽트를 선언한다.

EXTI_SetPinSensitivity(EXTI_Pin_0, EXTI_Trigger_Falling);

enableInterrupts();    //EA enable

PIN0에 해당하는 I/O중 GPIO_Mode_In_PU_IT 로 선언된 포트에 에지가 Trigger_Falling 으로 입력되면 인터럽트가 발생 하게 된다.

 

인터럽트가 동작되는 곳은

INTERRUPT_HANDLER(EXTI0_IRQHandler,8) 에 있다.

 

4. 다른 동작을 한다.

실제 운영을 위해 동작을 하면 된다.

 

이로서 간단하게 STM8L을 살펴보았다.

예제 소스가 필요하다면 Comment에 메일 주소를 달아 주면 보내드리도록 하겠다. -> 하드디스크 문제로 소스가 분실되었습니다.^.^

사실 타이머,ADC등 다양한 내용이 많으나 stm8l15x_stdperiph_lib_um.chm에 들어있는 예제 만큼 잘 설명 할 수 없을 듯 하다. 문서 참 잘 만들었다.

 

예제 소스

um0774.zip

 

예제 회로

1265357684.pdf

 

 

'공부 > STM8' 카테고리의 다른 글

[STM8L] 참고회로  (0) 2012.11.12
STM8 관련 국내 사이트  (0) 2012.11.12
[STM8] STM8L 해보기 5  (0) 2012.11.12
[STM8] STM8L 해보기 4  (0) 2012.11.12
[STM8] STM8L 해보기 3  (0) 2012.11.12

 

STM8L 해보기 5

 

IAR 정의 파일을 확인 해 보겠다.

 

 

Discover-Debug 메뉴가 있는 곳에서 오른쪽 마우스를 누르면 Option 메뉴가 나온다.

 

 

Option 을 선택 하면 여러 가지 메뉴가 나오는데 중요한 순서대로 정리해보겠다.

Target에서 MCU 종류를 고르고 Code와 Data model을 고른다.

출력 파일 디렉토리를 고른다.

Library를 어떻게 쓸 것인지 정의 한다.

Printf와 Scanf를 어떻게 쓸 것인지 정의 .. 이 함수를 사용 안 할 예정이어서 Small 로 지정 예를 들어 Printf를 많이 써야 한다면 Full 등으로 변경해야 한다.

컴파일러에서 사용한 Stack 과 Heap 을 조정한다. 함수를 많이 쓰거나 내부 변수를 많이 쓸경우 Stack를 늘려주는 것이 좋고 malloc 등을 사용한다면 Heap 을 늘리는 것이 좋다.

주의 할 것은 printf등 일부 함수는 자체적으로 malloc 를 사용하므로 이런 함수 사용시 Heap용량에 주의 해야 한다.

 

C,C++ 사용과 그에 대한 Option을 선택 한다.

압축율을 결정한다.

사용중인 라이브러리의 define header의 위치를 결정해 준다.

Linker 에서 Config의 경우 따로 정의 파일을 사용할 경우 설정해주고 사용 안 하면 정의 하지 않는다.

디버깅용으로 사용한 Tool을 선택 해준다. ST-LINK를 선택 했다.

'공부 > STM8' 카테고리의 다른 글

STM8 관련 국내 사이트  (0) 2012.11.12
[STM8] STM8L 해보기 6  (3) 2012.11.12
[STM8] STM8L 해보기 4  (0) 2012.11.12
[STM8] STM8L 해보기 3  (0) 2012.11.12
[STM8] STM8L 해보기 2  (0) 2012.11.12

 

IAR을 이용한 소스를 한번 만들어서 대략 정인 설명을 해보고자 한다.

처음에 discovery 소스를 이용해서 프로젝트를 만들었다. 늘 그렇듯 이것 또한 복병이 숨어 있었다. 내가 discovery 보드가 없기 때문에 discovery 보드에 관련된 소스를 지우는 것도 …

폴더는 EWSTM8, inc, src, STM8L15x_StdPeriph_Driver, STVD 로 구성했다.

원래에서 변경한 것은 STM8L15x_StdPeriph_Driver를 이동한 것이다.

 

이유는 디렉토리를 하나 압축하면 하나의 프로젝트로 완벽하게 관리하기 위해서다.

 

폴더를 설명해 보면

EWSTM8 : IAR 관련 프로젝트 정의 파일이 있다.

Inc : 코딩중인 Header 파일이 들어 있다.

Src : 코딩중인 Source 파일이 들어 있다.

STM8L15x_StdPeriph_Driver : 표준 라이브러리 파일들이 들어 있다.

STVD : ST Visual Develop 관련 프로젝트 정의 파일이 들어 있다.

'공부 > STM8' 카테고리의 다른 글

[STM8] STM8L 해보기 6  (3) 2012.11.12
[STM8] STM8L 해보기 5  (0) 2012.11.12
[STM8] STM8L 해보기 3  (0) 2012.11.12
[STM8] STM8L 해보기 2  (0) 2012.11.12
[STM8] STM8L 해보기 1  (0) 2012.11.12

 

STM8L 해보기 3

개발 환경을 구축 해보아야 하는데 컴파일러거의 IAR을 사용하는것으로 보인다. 그 외에 ST에서 배포하는 sttoolset 을 깔수도 있다.

인스톨 하면 대표적인 프로그램 2개와 예제 소스 매뉴얼 등인 인스톨 된다.

대표적인 프로그램은 아래와 같아.

ST Visual Develop : 프로젝트 만들어 컴파일하고 디버깅을 지원하는 프로그램

 

ST Visual Programmer : MCU의 FLASH를 쓰고 읽는등 양산용으로 사용하는 프로그램

 

사실 ST Visual Develop은 사용해 보지 않았다. IAR 컴파일러가 잘되어 있어서..

ST Visual Programmer은 양산을 하려면 꼭 필요하다.

 

또 하나 꼭 필요 한 것이 STLINK 다. SWIM 인터페이를 통해서 디버깅을 지원하는데 그 놈 참 똘똘하다. 써본 사람을 알겠지만 소스상태에서 디버깅이 가능하고, 운영 중 메모리나 변수의 값 등을 바로 바로 보면서 디버깅 가능하다.

 

해보지는 않았지만 STM32처럼 BOOT에서 시리얼 다운로드도 지원 한다고 되어 있다.

 

준비를 대충한 상태에서 PDF와 기존 소스만 보고 하려니 참 답답했다. 이때 몇 가지 문서를 발견했는데 꼭 필요한 레퍼런스 자료로 추천한다.

기본적은 MCU 설명이 들어 있는 PDF

자세한 설명과 그 소스가 들어있는 설명서 : stm8l15x_stdperiph_lib_um.chm

 

참고로 터치 관련된 설명과 소스가 들어있는 설명서 : stm8_ts_driver_um.chm

 

전부 ST 사이트에서 받았는데 정확하게 어디서 받았는지는 생각이 안 난다.

 

ST-LINK가 있어야 하는데 V2로 선택하길 바란다. 주의 사항은 전압이나 ESD에 좀 약한 것으로 보인다. USB단자의 불량 등 으로 인해 잘 죽는다고 한다. 나도 한 개 죽여 버리고 다시 산 후에 여러 곳에 바리스터를 덕지덕지 붙였다. 죽어도 A/S 불가니..

'공부 > STM8' 카테고리의 다른 글

[STM8] STM8L 해보기 6  (3) 2012.11.12
[STM8] STM8L 해보기 5  (0) 2012.11.12
[STM8] STM8L 해보기 4  (0) 2012.11.12
[STM8] STM8L 해보기 2  (0) 2012.11.12
[STM8] STM8L 해보기 1  (0) 2012.11.12

 

STM8L 해보기 2

이번에 사용하는 MCU 는 STM8L151 이다. 저전력용이라 예를 들어 리모콘용으로 사용 된다.

스펙을 한번 보면 아래와 같다.

  • Operating conditions

– Operating power supply: 1.65 to 3.6 V

(without BOR), 1.8 to 3.6 V (with BOR)

– Temperature range: -40 to 85 or 125 °C

( 전압범위와 온도범위는 기본적으로 산업용 장비에 사용 가능 하다.)

 

  • Low power features

– 5 low power modes: Wait, Low power run, Low power wait, Active-halt with RTC, Halt

– Ultralow leakage per I/0: 50 nA

– Fast wakeup from Halt: 5 μs

( 저전력으로 사용가능하도록 성계 되어 있다.)

 

  • Advanced STM8 core

– Harvard architecture and 3-stage pipeline

– Max freq: 16 MHz, 16 CISC MIPS peak

– Up to 40 external interrupt sources

(성능 좋은 CORE 같아. 사용하다 보면 Atmega128보다 좋아보인다.)

 

  • Reset and supply management

– Low power, ultrasafe BOR reset with 5 selectable thresholds

– Ultralow power POR/PDR

– Programmable voltage detector (PVD)

 

  • Clock management

– 32 kHz and 1-16 MHz crystal oscillators

– Internal 16 MHz factory-trimmed RC

– Internal 38 kHz low consumption RC

– Clock security system

(내부 발징을 이용해서 사용중인데 생각보다 좋다.)

  • Low power RTC

– BCD calendar with alarm interrupt

– Digital calibration with +/- 0.5 ppm accuracy

– LSE security system

– Auto-wakeup from Halt w/ periodic interrupt

 

  • Memories

– Up to 8 Kbytes of Flash program memory plus 256 bytes of data EEPROM with ECC

– Flexible write/read protection modes

– 1 Kbyte of RAM

  • DMA

– 4 channels supporting ADC, SPI, I2C,

USART, timers

– 1 channel for memory-to-memory

 

  • 12-bit ADC up to 1 Msps/28 channels

– Temp. sensor and internal ref. voltage

 

  • 2 ultralow power comparators

– 1 with fixed threshold and 1 rail to rail

– Wakeup capability

 

  • Timers

– Two 16-bit timers with 2 channels (IC, OC,PWM), quadrature encoder (TIM2, TIM3)

– One 8-bit timer with 7-bit prescaler (TIM4)

– 1 Window and 1 independent watchdog

– Beeper timer with 1, 2 or 4 kHz frequencies

 

  • Communication interfaces

– One synchronous serial interface (SPI)

– Fast I2C 400 kHz

– One USART

 

  • Up to 41 I/Os, all mappable on interrupt vectors

 

  • Up to 20 capacitive sensing channels

– supporting touchkey, proximity touch, linear touch, and rotary touch sensors

 

  • Development support

– Fast on-chip programming and nonintrusive debugging with SWIM

– Bootloader using USART

 

  • 96-bit unique ID

(IC 별로 고유 ID가 있어서 재미있게 사용 가능 하다.)

세그먼트 LCD나 터치 등 다양한 기능이 있는다. 참 저렴한 놈이 별 기능이 다 들어 있다.

'공부 > STM8' 카테고리의 다른 글

[STM8] STM8L 해보기 6  (3) 2012.11.12
[STM8] STM8L 해보기 5  (0) 2012.11.12
[STM8] STM8L 해보기 4  (0) 2012.11.12
[STM8] STM8L 해보기 3  (0) 2012.11.12
[STM8] STM8L 해보기 1  (0) 2012.11.12

 

STM8L 해보기 1

저가의 개발이 편리하고 사이즈가 작은 MCU를 찾았다.

물론 해당하는 MCU 생각보다 많은 건 사실이다. 특히 저가로만 찾을 경우 생각보다 많다.

그런데 개발이 편리하다는 부분에서 많이 문제가 된다.

예를 들어 시리얼로 메시지를 보면서 개발하거나 Flash 등을 구울 때 복잡 하기도 하다.

이런 MCU 개발 할 때 마다 생각하는 것이 컴파일러에서 소스레벨 디버깅을 하면서 개발 하면 얼마나 좋을까 하는 것이다.

내가 MCU를 만지기 시작한 초창기에 많은 MCU들이 있었다. 그 당시 가지고 놀던 MCU는 PIC, 8051, 68xx 등인데 주로 어셈으로 프로그래밍 하고 모든 시물레이션과 디버깅은 머리로 해야 했다.

물론 좋은 점도 있다. MCU의 모든 레지스터를 마스터 하고, 머리가 훨씬 잘 돌아가게 만들어 준다.

하지만 요즘은 제조사가 주는 라이브러리에 컴파일러의 성능만 믿고 개발 하는 경우도 있다.

이번에 STM8L을 쓰게 되었다. STM8L 또한 라이브러리, 컴파일러, STLINK, 만 믿고 개발을 시작하게 되었다.

이 선택은 아직까지 잘된 것 같다는 생각을 하고 있다.

 

레퍼런스 메뉴얼 입니다.  

DM00027749.pdf

'공부 > STM8' 카테고리의 다른 글

[STM8] STM8L 해보기 6  (3) 2012.11.12
[STM8] STM8L 해보기 5  (0) 2012.11.12
[STM8] STM8L 해보기 4  (0) 2012.11.12
[STM8] STM8L 해보기 3  (0) 2012.11.12
[STM8] STM8L 해보기 2  (0) 2012.11.12

 

SOURCE 공개

 

1. I2C용 RTC S3530A 루틴

 

//-------- S3530A STATUS REG -----------

#define    S3530_REG_INT2FE_BIT    0x01        //INT2 level interrupt set

#define    S3530_REG_INT1FE_BIT    0x02        //INT1 level interrupt set

#define    S3530_REG_INT2ME_BIT    0x04        //INT2 edge interrupt

#define    S3530_REG_INT1ME_BIT    0x08        //INT2 edge interrupt

#define    S3530_REG_INT2AE_BIT    0x10 //INT2 interrupt output enable(1), disabled(0).

#define    S3530_REG_INT1AE_BIT    0x20 //INT1 interrupt output enable(1), disabled(0).

#define    S3530_REG_1224_BIT    0x40 //12(0), 24(1) time mode set

#define    S3530_REG_POWER_BIT    0x80 //Power Status, Normal(1), Fail(0)

 

typedef    struct{    

        _uchar    your;

        _uchar    mon;

        _uchar    day;

        _uchar    day_week;

        _uchar    time;

        _uchar    min;

        _uchar    sec;

        _uchar    reg;

        

}_rtc;

 

 

xdata _rtc rtc_temp;    //data를 읽은 원본,data를 저장할때 쓰는 버퍼

xdata _rtc rtc;

 

void rtc_time_read()

{

    i2c_start();

    i2c_write(0x65);      //access 1 mode

    rtc_temp.your = i2c_read(YES);

    rtc_temp.mon = i2c_read(YES);

    rtc_temp.day = i2c_read(YES);

    rtc_temp.day_week = i2c_read(YES);

    rtc_temp.time = i2c_read(YES);

    rtc_temp.min = i2c_read(YES);

    rtc_temp.sec = i2c_read(NO);

    i2c_stop();

 

    //data 가공

    rtc_temp.your = by_byte(rtc_temp.your);

    rtc_temp.mon = by_byte(rtc_temp.mon);

    rtc_temp.day = by_byte(rtc_temp.day);

    rtc_temp.day_week = by_byte(rtc_temp.day_week);

    rtc_temp.time = by_byte(rtc_temp.time);

    if(rtc_temp.time & 0x80) //상위 bit 1이면 12시간 제의 오후

    {

        rtc_temp.time = rtc_temp.time & 0x7F;

        //rtc_temp.time = rtc_temp.time + 11; //24시간 형태로 변경

        

    }

 

    rtc_temp.min = by_byte(rtc_temp.min); //Control register

    rtc_temp.sec = by_byte(rtc_temp.sec) & 0x7F; //Control register

 

    //data 버퍼에 복사

    rtc.your= rtc_temp.your;

    rtc.mon= rtc_temp.mon;

    rtc.day= rtc_temp.day;

    // //p_sts.rtc_time[3] = rtc.day_week = rtc_temp.day_week;

    rtc.time = rtc_temp.time;

    rtc.min = rtc_temp.min; //Control register

    rtc.sec = rtc_temp.sec; //Control register

 

 

}

 

/*

* 레지스터 내용

* bit 7 : 1(전원 들어옴) ,read only

* bit 6 : 0(12시간제) , 1(24시간제)

* bit 5 : /INT1 동작, 0(동작안함), 1(동작함)

* bit 4 : /INT2 동작, 0(동작안함), 1(동작함)

* bit 3 : 인터럽트 동작 설정 찾아서 해보길

* bit 2 :

* bit 1 :

* bit 0 :

*/

 

void rtc_reg_read()

{

    i2c_start();

    i2c_write(0x65);      //access 1 mode

     _nop_ ();

    rtc_temp.reg = i2c_read(NO);

    _nop_ ();

    i2c_stop();

    rtc.reg = by_byte(rtc_temp.reg); //Control register

 

}

 

//RTC 데이터 쓰기.....

void rtc_time_write()

{

 

    rtc_temp.your = by_byte(rtc_temp.your);

    rtc_temp.mon = by_byte(rtc_temp.mon);

    rtc_temp.day = by_byte(rtc_temp.day);

    //rtc_temp.day_week = by_byte(rtc_temp.day_week);

    rtc_temp.time = by_byte(rtc_temp.time);

    rtc_temp.min = by_byte(rtc_temp.min);

    rtc_temp.sec = by_byte(rtc_temp.sec);

 

 

    i2c_start();

    i2c_write(0x64);      //access 1 mode

     _nop_ ();

     _nop_ ();

    i2c_write(rtc_temp.your);

     _nop_ ();

     _nop_ ();

    i2c_write(rtc_temp.mon);

     _nop_ ();

     _nop_ ();

    i2c_write(rtc_temp.day);

     _nop_ ();

     _nop_ ();

    i2c_write(rtc_temp.day_week);     //주의 어떻게 될지 모름

     _nop_ ();

     _nop_ ();

    i2c_write(rtc_temp.time);

     _nop_ ();

     _nop_ ();

    i2c_write(rtc_temp.min);

     _nop_ ();

     _nop_ ();

    i2c_write(rtc_temp.sec);

     _nop_ ();

     _nop_ ();

    i2c_stop();

 

}

 

// RTC초기화 부분.. 상태register 에 쓰는부분....

void rtc_reg_write()

{

    rtc_temp.reg = by_byte(rtc_temp.reg);

 

    i2c_start();

    i2c_write(0x62);      //access 1 mode

     _nop_ ();

     _nop_ ();

    i2c_write(rtc_temp.reg);

     _nop_ ();

     _nop_ ();

    i2c_stop();

}

 

void rtc_init()

{

    rtc_temp.reg = S3530_REG_1224_BIT;    //rtc초기화

    rtc_reg_write();

}

 

//상위비트와 하위 비트를 바꾸어 준다.

unsigned char by_byte(unsigned char in_data)

{

    unsigned char i,temp_data, out_data = 0;

    bit k;

 

    for(i=0 ; i<8 ;i++)

    {

 

        k = ((in_data & 0x80) ? 1 : 0); //msb data

        in_data <<= 1;     // Shift the byte by one bit

        temp_data = 0;

        temp_data |= k;        //lsb data

        temp_data <<= i;

        out_data |= temp_data;

    }

 

    return out_data;

}

'공부 > 8051' 카테고리의 다른 글

[ADUC831] ADUC831 간단 매뉴얼 2  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 1  (0) 2012.11.12
[ADUC812] ADUC812 설명 7  (0) 2012.11.10
[ADUC812] ADUC812 설명 6  (0) 2012.11.10
[ADUC812] ADUC812 설명 5  (0) 2012.11.10

+ Recent posts