이번 시리즈에서는 STM32F407 기반 EVM Borad인 STM32F407G-DISC1을 IAR과 Standard Peripheral Libraries로 제어하기 위한 튜토리얼 내용이 담긴 포스팅입니다.

👨‍💻 개발일지 (1) : STM32F407G-DISC1 및 IDE 환경설정

1. STM32F407G-DISC1

STM32F407G-DISC1을 살펴보자.

STM32F407G-DISC1에는 ST-LINK가 미리 내장되어있어 따로 ST-LINK같은 H/W 툴을 구입하지 않고 Mini-USB Type-B 케이블을 이용해 자신의 F/W를 플래싱 할 수 있다. 또 8MHz 외부 크리스털을 이용해 HSE Clock을 활성화시켜 각 Peripheral에 필요한 클럭을 제공할 수 있다.

케이블이 준비되었다면 PC에 ST-LINK USB Driver를 설치해야한다. ST공식홈페이지에 있는 ST_LINK Dirver 설치사이트 접속해서 USB Driver를 설치하자.👇👇

🔗 USB Driver Install Page (USB Driver는 STSW-LINK009로 관리된다.)

Download latest 버튼을 클릭하면 License Agreement 팝업창이 뜨고, ACCEPT 버튼을 클릭하면 다운로드 받을 수 있다. 2022년 1월 26일 기준 최신버전은 ver2.0.2 이다.

다운로드된 압축파일을 해제하면 본인 프로세서에 맞춰 x84 혹은 amd64 맞춰 설치하면된다.

2. IDE Setting

2.1 Create Project

이제 IAR사에서 판매하는 IDE인 EWARM(Embedded Workbench for Arm)의 환경설정을 진행하자.

우선 자신의 PC에 빈 디렉토리하나를 만든다. (디렉토리 이름은 STM32F407G-DISC1_Tutorial) IAR EWARM을 실행해 상단 툴바에서 File > New Workspace 를 클릭한 뒤, 새로운 Workspace를 생성한다. Workspace를 생성한뒤 다시 상단 툴 바에서 Project > Create New Project... 을 선택해 새로운 프로젝트를 만든다.

(새로운 프로젝트는 Empty가아닌 main을 포함하는 C 프로젝트)

프로젝트 파일이름(STM32F407G-DISC1_Tutorial)을 정한뒤, 방금 생성한 빈 디렉토리에 저장한다. 다시 상단 툴 바에서 File > Save Workspace 를 클릭해() STM32F407G-DISC1_Tutorial) .eww 파일을 같은 디렉토리에 저장했다.

StdPeriph 디렉토리 내부 📁 Project > STM32F4xx_StdPeriph_Templates 를 살펴보면 각 IDE 별(EWARM, Keil, TrueSTUDIO) 샘플 프로젝트를 제공해 준다. 이 프로젝트 템플릿에 맞춰 개발을 진행하자. 템플릿에 있는 예시는 STM32F429_439XX 기반이므로 우리의 보드에 맞게 필요한것과 불필요한 코드를 나누어 주자.

stmm32f4xx_conf.h 내용을 확인하면 stm32f407에 맞는 StdPeriph 라이브러리 코드를 찾아볼 수 있다. 79 라인을 확인하면 #if defined(STM32F40_41xxx) 매크로를 확인할 수 있다. 템플릿에 있는 다음의 파일리스트를 복사해서 📁STM32F407-DISC_Tutorial 디렉터리에 붙여 넣자.

  • main.h
  • stm32f4xx_conf.h
  • stm32f4xx_it.c
  • stm32f4xx_it.h
  • system_stm32f4xx.c

이제 IAR EWARM의 STM32F407-DISC_Tutorial Workspace는 다음과 같이 이루어진다. 각 박스 색깔별로 PATH를 지정하자면 다음과 같다.

  • Red: SDK_PATH\Libraries\STM32F4xx_StdPeriph_Driver\src
  • Blue: SDK_PATH\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\iar
  • Green: 프로젝트 디렉토리

2.2 Project Option Setting

이제 헤더파일을 인클루드해야 한다. 그 전 StdPeriph Driver의 Path를 환경변수로 지정해서 편하게 사용하자. 상단 툴바에 Tools > Configure Custom Argument Variables를 클릭한다. New Group...을 클릭해 SDK 그룹을 생성한뒤, STD_PERIPH = {SDK_SAVE_PATH}\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0 를 지정한다. 필자의 경우에는 C:\SDK\에 StdPeriph Driver를 저장했다.

STD_PERIPH 환경변수를 다른 Workspace에서 사용하고 싶다면 Global에 지정해도 되지만 다른 Workspace에서 진행하는 프로젝트가 STM32F4XX 계열이 아닌 다른 계열일 경우를 대비해 현재 Workspace의 환경변수로 지정했다. 이제 좌측 Workspace 패널에서 프로젝트를 우클릭해 option... 을 클릭하자.

옵션에는 카테고리중 General Option 선택후 Target 란을 선택해 Processor variant 에서 Core 가 아닌 Device 를 선택하자. Device 옆 리스트 🧾 버튼을 누르면 사용 가능한 리스트들을 보여준다. 당연히 STM32F407VG 를 선택해야 한다. 같은 카테고리안 Library Configuration > CMSIS 란에서 Use CMSIS 체크박스를 클릭한다.

이제 C/C++ Compiler 카테고리에서 Preprocessor 탭으로 들어간다. 탭으로 들어가면 Additional include directoriesDefine symbols에 다음과 같은 내용을 추가하자.

Additional include directories:

$PROJ_DIR$\
$STD_PERIPH$\Libraries\CMSIS\Include
$STD_PERIPH$\Libraries\CMSIS\Device\ST\STM32F4xx\Include
$STD_PERIPH$\Libraries\STM32F4xx_StdPeriph_Driver\inc

Define symbols:

USE_STDPERIPH_DRIVER
STM32F40_41xxx

다음은 ST-LINK에 대한 셋팅이다 우선 Debugger 를 클릭하면 좌측에 Driver를 셋팅하는 드롭다운 메뉴를 클릭해 ST-LINK로 설정해 준다. 그 후 아래 ST-LINK 카테고리에서 Emulator를 ST-LINK/V2, Interface 에서는 SWO를 선택하면 된다.

이제 상단 툴 바에서 Download and Debug 혹은 Ctrl + D 를 눌러 보드에 플래싱을 시도해보자. 당연히? 에러가 난다. 🐛🐛

stm32f4xxit.c 의 144번 라인에 있는 TimingDelay_Decrement(); 함수를 지우고 다시 보드에 플래싱을하면 아무것도 없는 빈 코드가 STM32F407G-DISC1에 올라갔다.

3. LED ON

본격적인 StdPeriph Driver 사용에 앞서서 레지스터의 주소에 직접 접근해 STM32F407G-DISC1에 내장되어 있는 LED를 점등 시켜보자.

레지스터에 직접 접근하는 코드는 아래와 같다.

#define u32_t unsigned int

int main()
{
	*(u32_t*)0x40023830 = *(u32_t*)0x40023830 | 0x00000009;
	*(u32_t*)0x40020C00 = *(u32_t*)0x40020C00 | 0x55000000;
	*(u32_t*)0x40020C08 = *(u32_t*)0x40020C08 | 0xff000000;
	*(u32_t*)0x40020C0C = *(u32_t*)0x40020C0C | 0xAA000000;
	*(u32_t*)0x40020C14 = *(u32_t*)0x40020C14 | 0x0000F000;

		
	while(1)
		;
	
  return 0;
}

다음 개발일지부터는 StdPeriph Driver를 사용해서 코드를 작성한다. 참고로 위의 코드를 StdPeriph Driver를 사용하면 아래와 같다.

int main()
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_Init(GPIOD, &GPIO_InitStructure);
	
	GPIO_Write(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)
}

🔗 Cheesam31 GitHub STM32F407VG_Basic Repository(Toutorial)

1개의 댓글

comment-user-thumbnail
2022년 1월 26일

도움 많이 됐습니다. 포스팅 자주 부탁드려요!!!

답글 달기