2017년 3월 5일 일요일

ARM 걸음마 떼기(beginner) #1

우연치 않게 EWARM을 구할수 있어 무조건 시작하자 생각에
책부터 구입하고..
윤덕용씨의 "STM32F051 마스터"를 구입했는데..  "STM32F091 정복"이 왔다.
아마 이름이 비슷하여 옴사로 주문이 잘못 들어갔던지 배송담당자가 잘못 넣었는지 가격도 똑 같은데 그냥 쓰자. - 뭐 그놈이 그넘이지.. 

그런데..그게 아니다.. 뭔 책이 이렇게 두껍나..(쓸데 없는 자료도 보인다)

051 discovery, 030 Nucleo도 있었는데
Nucleo-F091RC 보드를 또 구입(ICBanQ) 택배비(2500원) 아낀다고 ST-LINK/V2도 같이구입
그런데 이건 살 필요 없다-Discovery, Nucleo 보드등에 내장되어있다.
거기다 Alibaba에서 J Link까지 구입.. 이넘의 장비 구입 병이 또 도졌다.

결국 J Link, ST-LINK/V2, 030 Nucleo, 051 Discovery, 091 Nucleo, STM32F091정복
책상 가득..

여기서 tip: 빵판(Bread board)로 실험하려면 051 discovery를 구입할것
외부 핀들이 일렬로 나열되어 있어 빵판에서 사용가능. 다른 보드들은 두줄로 출력되어 기판을 이용하여 납땜을 해야한다.( 물론 ST-LINK내장되어 있다.)



자 시작이다.. 맨땅에 헤딩..

EWARM설치하고.. 책 대로 구성하는데.. 와 이건 책의 두께(1058 page)만큼 이나 엄청난 압박이...
그래도 프로그램으로 밥 먹고 사는사람이.. 아자아자..

이건 장난이 아니네.. 책대로 깔고 하라는대로 config잡고.. 그런데 ER가 65개??
뭐가 없고 뭐가 없다고..

이건 ATmega128과는 차원이 다르네.. 구글신께..빌어보지만.. 모두 뜬 구름 잡는 얘기들만
네이버의 전자공작카페에서 자료를 구할까해봐도 EWARM이 아닌 무료 컴파일러 Atollic TrueSTUDIO를 사용하여 도움이 않된다.

열심히 구글신과 대화를 계속하니.. 뭔가가 보인다. 납땜..또 납땜





해냈다.. LED 끄고 켜기는 존심이 있지.. ㅎ pass..

-----------------------------------------------------------------------------------------------
/* ============================================================================ */
/* Text-LCD.c : 기본 텍스트 LCD 출력 프로그램(8MHz HSI 사용)               */
// stm32f091 nucleo boar에서 Test - done! - 기본동작 확인하였다
// ST-Link이용 - compile후 Hex일때 Er, Bin으로 정상동작(주소 0x08000000)
//
// AHBENR(주변장치 clock공급(enable) - 중요
// GPIO - BRR, BSRR, MODER등 설정에 주의(BRR에서 1일때 bit reset등)
// BSRR 상위(reset),하위(set)로 나누어있어 동시에 제어가능
/* ============================================================================ */


#include "stm32f091xc.h"

void Delay_us(unsigned int time_us); /* time delay for us in 8MHz */
void Delay_ms(unsigned int time_ms); /* time delay for ms in 8MHz */
void Initialize_LCD(void); /* initialize text LCD module */
void LCD_command(unsigned char command); /* write a command(instruction) to text LCD */
void LCD_data(unsigned char data); /* display a character on text LCD */
void LCD_string(unsigned char command, char *string); /* display a string on LCD */

/* ----- 메인 프로그램 -------------------------------------------------------- */

int main(void)
{

  RCC->AHBENR = 0x003E0000;                // A,B,C,D,E enable
                                                // 091 nucleo b/d port변경작업
  GPIOC->MODER = 0x00005555; // set PC7~0 to output( LCD data)
  GPIOA->MODER = 0x00000005; // set PA1(LCD_E), PA0(RS) to output

  Delay_ms(10);                                 // wait for system stabilization
  Initialize_LCD(); // initialize text LCD module
  Delay_ms(10);

  while(1){
    LCD_string(0x80,"TEST Nixtek LCD ");
    Delay_ms(100);
    LCD_string(0xC0,"TEST information");
    Delay_ms(100);
//    LCD_string(0x90,"TEST Co.,       ");  // 4line*20Ch LCD ER(제위치 표시못한다)
//    Delay_ms(100);                        // LCD module이 느려서??- 16*2line은 정상동작!
//    LCD_string(0xd0,"  Electronix    ");
 
    Delay_ms(1000);
    LCD_command(0x01); // clear display
    Delay_ms(100);
  }
}

/* ----- 사용자 함수 ---------------------------------------------------------- */

void SystemInit(void) /* dummy system function */
{
  asm ("NOP");
}

void Delay_us(unsigned int time_us) /* time delay for us in 8MHz */
{
  register unsigned int i;

  for(i = 0; i < time_us; i++) // 3 cycle
    { asm ("NOP");
      asm ("NOP");
      asm ("NOP");
      asm ("NOP"); // 4 cycle
    }
}

void Delay_ms(unsigned int time_ms) /* time delay for ms in 8MHz */
{
  register unsigned int i;

  for(i = 0; i < time_ms; i++)
    Delay_us(1000);
}

void Initialize_LCD(void) /* initialize text LCD module */
{
  LCD_command(0x38); // function set(8 bit, 2 line, 5x7 dot)
  Delay_ms(5);
  LCD_command(0x38); // function set(8 bit, 2 line, 5x7 dot)
  Delay_ms(5);
  LCD_command(0x0C); // display control(display ON, cursor OFF)
  LCD_command(0x06); // entry mode set(increment, not shift)
  LCD_command(0x01); // clear display
  Delay_ms(2);
}

void LCD_command(unsigned char command) /* write a command(instruction) to text LCD */
{
  //GPIOA->BRR = 0x00000003; // E = 0, Rs = 0
  GPIOA->BSRR = 0x00030000;                     //      "

  GPIOC->ODR = command; // output command
  GPIOA->BSRR = 0x00000002; // E = 1
  Delay_us(15);                   // 이 시간값들 줄이면 표시 제대로 않된다(16*2에서 10일때 Er)

  //GPIOA->BRR = 0x00000003; // RS,E = 0
  GPIOA->BSRR = 0x00030000;                        //    "

  Delay_us(15);
}

void LCD_data(unsigned char data) /* display a character on text LCD */
{
  //GPIOA->BRR = 0x00000002; // E = 0
 //GPIOA->BSRR = 0x00000001; // Rs = 1
  GPIOA->BSRR = 0x00020001;                     // E = 0, Rs = 1 동시제어

  GPIOC->ODR = data; // output data
  GPIOA->BSRR = 0x00000002; // E = 1
  Delay_us(15);

  //  GPIOA->BRR = 0x00000003; // RS,E = 0
  GPIOA->BSRR = 0x00030000;

  Delay_us(15);
}

void LCD_string(unsigned char command, char *string) /* display a string on LCD */
{
  LCD_command(command); // start position of string
  while(*string != '\0') // display string
    { LCD_data(*string);
       string++;
    }
}

핀구성은 PC0~7 - LCD D0~7
            PA0 - LCD RS
            PA1 - LCD Enable
                    LCD RW-Ground
나머지(전원등) 기본 구성.

위 소스는 윤덕용저 "STM32F091정복"에서 인용한후 Nucleo보드와 내가 구성한것에 맞추어 수정한것이다.
-------------------------------------------------------------------------------------------------

GPIO의 MODER, BRR, BSRR 그리고 가장 중요??한
RCC->AHBENR 이었다
역시 제대로 매뉴얼을 읽어야 한다.

책에 있던 자료를 옮겨 그대로 컴파일 하면  당연히 ER나거나 동작이 않되는 상태
하루 날렸다.

ATmega128등은 입,출력으로 지정하고 맞추어 출력하면 다~ 되었는데.. 이녀석은

내부 Clock을 공급해 주어야한다.(AHBENR - 주변장치 허용 레지스터)
0: clock을 차단하여 동작하지 않도록 금지한다.
1:  "        공급하여 동작을 허용한다.
-아주 중요!!

GPIO의 MODER, BRR, BSRR이 중요.
BRR과 BSRR은 같이 사용 가능하다.(빠른 동작을 할수있다고 하는데....)

------------------------------------------------------------------------------------------------
처음 안될때는 별 생각을 다 했었는데..
1) 091 chip에 Xtal연결이 않되었네.. - clock은 어떻게..(내부 RC??)
    - 확인하니 ST-Link(내장)에서 공급해준다(8MHz)
2) 091은 3V동작인데.. Text LCD는 5V version이라 제대로 동작이 될까?
    - 이것도 끝내고 나니 쓸데없는 걱정이 었다. - 아주 잘 된다.
-------------------------------------------------------------------------------------------------





댓글 없음:

댓글 쓰기