본문 바로가기

컴퓨터/STM32 primer 2

Circle OS API를 활용하여 LCD에 Hello World 출력하는 프로그램 작성


지난시간에는 통합개발환경을 설치하는 방법을 알아보았습니다.
이번에는 통합개발환경에서 간단한 Hello World 프로그램을 작성해 보겠습니다.

먼저 USB단자를 primer2 DEBUG 단자에 연결합니다.

만약 처음으로 USB단자에 Primer2를 연결했다면 아래처럼 "새 하드웨어 검색 마법사" 대화상자가  나타날 것입니다. "아니오, 지금 연결 안 함"을 선택하고 다음을 클릭합니다.


다음을 클릭하면 RLink USB 드라이버 설치를 위한 대화상자가 나타납니다."소프트웨어 자동으로 설치(권장)"을 선택하고 다음을 클릭합니다.


드라이버가 정상적으로 설치가 되면 다음 대화상자가 나타납니다. 마침을 클릭하여 드라이버 설치를 종료합니다.
여기 까지의 과정은 다음부터는 나타나지 않습니다.



USB가 정상적으로 연결되었으면 RIDE7을 실행합니다.

RIDE7에서 File -  New - Project 를 선택합니다.
그럼 아래처럼 새로운 애플리케이션 대화상자가 나타납니다.
Type은 "New application to be built"를 선택하고
Processor는 Targets - ARM - Primer - STM32_Primer3_CircleOS를 선택하고
Name은 프로젝트 이름을 입력합니다. 여기서는 "HelloWorld"로 설정했습니다.
Location은 프로젝트가 저장될 폴더를 선택합니다. 여기서는 "C:\ARM\Helloworld"로 설정했습니다.
그리고 "마침"을 클릭하여 새로운 프로젝트를 생성합니다.


프로젝트가 생성되면 Project창에 프로젝트 이름이 나타나고 3개의 파일(Application.c  Primer2_Circle.elf  FAT.elf)이 추가되어 있음을 확인할 수 있다.
Application.c를 더블클릭하면 작업창에 해당 파일이 열린다.
다음과 같이 코드를 추가한다. 빨간색이 추가된 코드이다.

 /********************** (C) COPYRIGHT 2007-2009 RAISONANCE ********************
* File Name          :  Application.c
* Author             :
* Date First Issued  :
* Description        :  Circle_App CircleOS application template.
* Revision           :
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "circle_api.h"

/* Private defines -----------------------------------------------------------*/

// The following should be the minimal CircleOS version needed by your application
#define NEEDEDVERSION "V 3.7"

/* Private functions ---------------------------------------------------------*/
static enum MENU_code MsgVersion(void);

/* Public variables ----------------------------------------------------------*/
const char Application_Name[8+1] = {"My App"};      // Max 8 characters


/*******************************************************************************
* Function Name  : Application_Ini
* Description    : Initialization function of Circle_App. This function will
*                  be called only once by CircleOS.
* Input          : None
* Return         : MENU_CONTINUE_COMMAND
*******************************************************************************/
enum MENU_code Application_Ini(void)
    {
    // Ensure that the current OS version is recent enough
    if(strcmp(UTIL_GetVersion(), NEEDEDVERSION) < 0)
        {
        return MsgVersion();
        }


    // TODO: Write your application initialization function here.
    DRAW_Clear ();


    return MENU_CONTINUE_COMMAND;
    }

/*******************************************************************************
* Function Name  : Application_Handler
* Description    : Management of the Circle_App.
*
* Input          : None
* Return         : MENU_CONTINUE
*******************************************************************************/
enum MENU_code Application_Handler(void)
    {


    // TODO: Write your application handling here.
    DRAW_DisplayString (10, 10, "Hello World!", 12);


    // This routine will get called repeatedly by CircleOS, until we
    // return MENU_LEAVE

#if 1
    // If the button is pressed, the application is exited
    if(BUTTON_GetState() == BUTTON_PUSHED)
        {
        BUTTON_WaitForRelease();
        return MENU_Quit();
        }
#endif

    return MENU_CONTINUE;   // Returning MENU_LEAVE will quit to CircleOS
    }

/*******************************************************************************
* Function Name  : MsgVersion
* Description    : Display the current CircleOS version and the version needed
*                  exit to main menu after 4 secondes
*
* Input          : None
* Return         : MENU_REFRESH
*******************************************************************************/
static enum MENU_code MsgVersion(void)
   {
   int hh,mm,ss,ss2;
  
   DRAW_DisplayString(5,60,"CircleOS",17);
   DRAW_DisplayString(80,60,UTIL_GetVersion(),6);
   DRAW_DisplayString(5,34,NEEDEDVERSION,6);
   DRAW_DisplayString(50,34," required",12);
  
   RTC_GetTime( &hh, &mm, &ss);
   ss = ss + 4;                  // 4 secondes
   ss = ss%60;
  
   do
        {
        RTC_GetTime( &hh, &mm, &ss2 );
        }
   while ( ss2 != ss );           // do while < 4 secondes
  
   DRAW_Clear();
   return MENU_REFRESH;
   }



다음은 컴파일 및 빌드를 위하여 메뉴에서 Project - Build Project를 선택한다. 오타가 없이 정상적으로 입력되었다면 Build Log창에 로그가 쫙 나오고 가장 아래 줄에 "Build successful "이라는 단오가 나온다.

다음은 Primer 2 기기로 퓨징을 하고 실행을 하기 위하여 먼저 Primer2 전원을 켜고 Debug메뉴에서 Start를 선택한다.
정상적으로 퓨징이 되면 디버그 창에 기기의 각종 레지스트값이 보인다.

다음은 Debug메뉴에서 Run을 선택한다. 그리고 Primer2 기기에서 메뉴를 호출하고 "My App"를 선택하면 화면에 Hello World! 가 표시되어 있음을 확인할 수 있다.


위의 프로그램은 단 2줄만 추가하였다.
첫째추가한 것은 운영체제 프로그램 선택메뉴에서 해당 프로그램을 선택하는 이벤트가 발생하면 최초1회 전체 화면을 지우고
두번째 추가한 것은 1ms마다 계속 호출되는 이벤트 핸들러 위치에 화면의 10,10 위치에 해당 문자열을 출력하는 Circle API 함수이다.

화면 출력관련 함수는
void  DRAW_SetCharMagniCoeff (u16 Coeff)
u16  DRAW_GetCharMagniCoeff (void)
u16  DRAW_GetTextColor (void)
void  DRAW_SetTextColor (u16 Color)
u16  DRAW_GetBGndColor (void)
void  DRAW_SetBGndColor (u16 Color)
void  DRAW_Clear (void)
void  DRAW_SetLogoBW (void)
void  DRAW_SetImage (const u16 *imageptr, u8 x, u8 y, u8 width, u8 height)
  Draw a color bitmap at the provided coordinates.
void  DRAW_SetImageSel (const u16 *imageptr, u8 x, u8 y, u8 width, u8 height, u16 oldBgndColor, u16 newBgndColor)
  Draw a color bitmap at the provided coordinates, with selected background color.
void  DRAW_SetImageBW (const u8 *imageptr, u8 x, u8 y, u8 width, u8 height)
  Draw a monochrome bitmap at the provided coordinates.
void  DRAW_DisplayVbat (u8 x, u8 y)
void  DRAW_DisplayTime (u8 x, u8 y)
void  DRAW_DisplayString (u8 x, u8 y, const u8 *ptr, u8 len)
void  DRAW_DisplayStringInverted (u8 x, u8 y, const u8 *ptr, u8 len)
void  DRAW_SetDefaultColor (void)
void  DRAW_Line (s16 x1, s16 y1, s16 x2, s16 y2, u16 color)
void  DRAW_Putc (u8 Ascii)
void  DRAW_Puts (const u8 *ptr)
void  DRAW_SetCursorPos (s32 x, s32 y)
s32  DRAW_GetCursorPos ()
void  DRAW_SetCursorMargin (s32 lx, s32 rx, s32 hy, s32 ly)
void  DRAW_GetCursorMargin (s32 *lx, s32 *rx, s32 *hy, s32 *ly)


함수관련 자세한 사항은 관련 매뉴얼을 참고하기 바람
다음 시간에는 Primer2에 내장된 2개의 LED를 켜고 끄는 프로그램을 작성해 보겠습니다.


관련 자료 링크
- 통합개발환경 RIDE 7 CD이미지 - http://www.stm32circle.com/resources/download.php?CD_STM32-Primer_BN28.zip
- STM32 primer 사용자 매뉴얼 - http://www.stm32circle.com/resources/download.php?STM32-Primer-Manual.pdf
- STM32 primer 회로도 - http://www.stm32circle.com/resources/download.php?schema_stm32_primer_1_2.PDF
- Primer Upgrade ver3.8 - http://www.stm32circle.com/resources/download.php?Primer_upgrade.zip
- Circle OS ver 3.8 - http://www.stm32circle.com/projects/download.php?id=101&file=Circle-OS-v3.8-3.8.zip
- Circle OS 온라인 도큐먼트 - http://www.stm32circle.com/circleos_doc/index.html
- Circle OS 도큐먼트 다운로드 - http://www.stm32circle.com/resources/download.php?circleos_doc.zip

주의)본 자료는 개인(박용준)이 작성한 자료로 본 자료를 활용하여 일어난 어떠한 손해도 책임을 지지 않습니다. 또한 본 자료의 일부 또는 전부를 무단으로 발췌를 금합니다.