'stm32'에 해당되는 글 6건

  1. 2009.12.26 STM32 보드에 펌웨어 퓨징
  2. 2009.12.26 STM32 개발 환경
  3. 2009.12.24 STM32 Memory Map 1
  4. 2009.10.06 Cortex-M3(STM32) System Architecture
  5. 2009.10.05 STM32F103C6T6
  6. 2009.09.29 Cortex M3 - Bit Banding
2009. 12. 26. 14:19

STM32 보드에 펌웨어 퓨징



ST 홈페이지에서 다운로드 한 Flash Loader를 이용해 펌웨어 바이너리 파일을 실제 STM32 개발 보드에 퓨징하는 방법이다.

먼저 STM32 보드를 개발용 PC에 연결을 해야 한다.
  • RS232 시리얼 케이블을 연결한다.
  • 전원을 인가하기 위해 USB 케이블을 연결한다.(USB로 전원을 받아옴..)

차후에 봐야 할 부분이지만, STM32 Cortex M3에서 System boot에 대한 mode가 두 가지가 있다.
  • FLASH mode - 올려진 펌웨어를 실행하는 모드 정도로 보면 될듯 하다.
  • SYSTEM mode - 보드에 펌웨어를 올리기 위한 모드..

mode 스위치를 SYSTEM mode로 위치시킨 후 Flash Loader 프로그램을 실행한다.

Next 버튼을 클릭한다.
Flash Loader에서 타겟보드를 인식하게 되면 위와 같이 신호등 아이콘에 녹색 불이 들어온다.
위와 같이 나오지 않는다면, System Boot Mode를 한 번 더 확인하고 리셋 후에 Flash Loader 프로그램을 재실행 시켜보면 될 것이다.
Flash에 32Kb 가 잡혀있다. 현재 사용하는 타겟보드가 Cortex M3 Low-Density임을 알 수 있다.

Next 버튼을 클릭해 다음으로 넘어가자.
Target에 자동으로 STM32_Low-density_32K 로 잡힌다.
Flash 란에 내부의 Flash 메모리에 대한 Page 내용을 알 수 있다. 시작 위치는 아무래도 Page0번의 0x08000000인 듯 하다. 이 위치에 퓨징하고자 하는 펌웨어가 올라가는 듯 하다.

Next 버튼을 클릭해 다음으로 넘어간다.
실제 타겟보드로 다운로드 할 펌웨어의 경로를 찾아서 올려야 한다.
Download to device 란의 ... 버튼을 클릭해 다운로드 할 펌웨어 바이너리 파일을 선택한다.
필요에 따라 기존의 데이터를 지워고 퓨징하기 위해 Erase necessary pages를 선택한다.
퓨징하려는 address가 8000000인지 확인을 한다.

Next 버튼을 클릭해 다음으로 넘어간다.
정상적으로 퓨징이 이루어진 화면이다.

Finish를 클릭해 Flash Loader를 종료한다.

정상적을 퓨징이 되었는지 확인을 하려면, 타겟보드의 System Boot Mode를 FLASH의 위치에 스위치를 옮기고, 리셋버튼을 살 짝 눌려주면 된다.


'혼자서 놀기... > STM32' 카테고리의 다른 글

STM32 개발 환경  (0) 2009.12.26
STM32 Memory Map  (1) 2009.12.24
Cortex-M3(STM32) System Architecture  (0) 2009.10.06
STM32F103C6T6  (0) 2009.10.05
Cortex M3 - Bit Banding  (0) 2009.09.29
2009. 12. 26. 11:00

STM32 개발 환경



STM32 개발 환경을 위해선 크게 펌웨어 소스코드를 컴파일 할 수 있는  컴파일러와 STM32  보드에 컴파일된 바이너리 코드를 퓨징하기 위한 퓨징 프로그램이 필요하다.


컴파일러

STM32 를 위한 컴파일러로는 Keil, Ride7, IAR 등이 있다.
본인이 가진 STM32F103C6T6 보드의 회사에서 추천하는 IAR 이라는 컴파일러를 사용하려 한다.
IAR 컴파일러는 IAR Systems(www.iar.com) 에서 다운로드 받을 수 있고, 현재 무료로 사용할 수 있는 버전은 최대 32KByte의 Binary를 만들어낼 수 있다. 그 이상은 유료 버전을 사용해야 하는 듯..

먼저 www.iar.com에 접속을 한 뒤 Downloads를 클릭한다.

Downloads 항목 중 ARM의 Kickstart edition을 클릭한다.

Continue... 를 클릭한다.

Product Registration and Download 의 항목들을 적절히 채워 넣고, submit registration 을 클릭한다.

입력한 E-mail을 통해 다운 받을 수 있는 링크와 시리얼 넘버를 얻을 수 있다.
다른 프로그램과 같이 설치하면 STM32 용 IAR 컴파일러를 설치할 수 있다.


퓨징 프로그램

펌웨어 바이너리 파일을 STM32 보드에 퓨징하기 위한 프로그램은 CPU 제조회사인 ST에서 제공을 한다.
ST의 STM32 다운로드 사이트(http://www.st.com/mcu/familiesdocs-110.html#Software for Tools) 에 접속을 해서 Software - PC 항목의 Flash loader demonstrator 를 다운로드 받는다.
압축을 풀고 Setup 프로그램을 실행하여 설치한다.

이상으로 STM32 펌웨어를 개발하기 위한 환경 설정은 끝났다.

뭐든 처음은 생각보다 초 간단해서 좋긴 한데..


'혼자서 놀기... > STM32' 카테고리의 다른 글

STM32 보드에 펌웨어 퓨징  (0) 2009.12.26
STM32 Memory Map  (1) 2009.12.24
Cortex-M3(STM32) System Architecture  (0) 2009.10.06
STM32F103C6T6  (0) 2009.10.05
Cortex M3 - Bit Banding  (0) 2009.09.29
2009. 12. 24. 14:16

STM32 Memory Map



STM32는 총 4G의 메모리 공간을 갖고, 각각은 512 MB로 된 8개의 블록으로 이루어져 있다.

다음은 4G의 메모리 영역이 각각 어떻게 사용되고 있는지를 보여준다.

코드 영역(0x00000000 ~ 0x1FFFFFFF)은 I-Code bus와 D-Code bus를 사용해 명령어 패치와 데이터 접근을 수행한다.
코드 영역은 프로그램 코드를 실행할 수 있고, 데이터를 저장 할 수 도 있는 영역으로 사용된다. 이 영역에서 캐시 속성은 WT(Write Through)인 쓰기 버퍼 영역이다. 이 곳은 on-chip Flahs memory 가 사용되고 있으며, 현재 본인이 사용하고 있는 보드에는 32KBytes 크기의 Flash memory가 장착되어 있다.
일반적으로 프로그램 코드는  이 코드 영역, SRAM 영역, 또는 외부 RAM(External RAM)영역에 위치할 수 있는데, 일반적으로 코드 영역에 위치시키면 두 개의 분리된 버스 인터페이스(I-Code, D-Code)를 통해 명령어 페치와 데이터 접근을 동시에 수행할 수 있어 좋다고 한다.

SRAM 메모리 영역(0x20000000 ~ 0x3FFFFFFF) 내부 SRAM과 연결하기 위해 존재한다.
이 영역은 쓰기 버퍼 영역이고, 캐시 속성은 WB-WA(Write Back, Write Allocated)이다. 프로그램 코드는 코드 영역과 마찬가지로 SRAM 영역에서도 실행 될 수 있다. 하지만, 코드 영역에서 실행하는 것보다는 느리다고 한다. 그래서, 프로그램 실행코드는 코드 영역에 위치시키고 실행시키기를 권고(?)한다.
이 영역은 on-chip RAM을 사용하기 위한 공간이고 현재 사용하고 있는 보드에는 10 KBytes SRAM이 장착되어 있다. 이 영역은 System bus(시스템 버스)를 통해 접근을 하게 된다. 이 영역에는 32 MB의 Bit Band Alias 영역이 존재한다. Bit Banding에 관한 내용은 여기를 참고하면 될 듯 하다.

주변장치(Peripheral) 영역(0x40000000 ~ 0x5FFFFFFF)은 시스템에 장착되어 있는 주변장치(RTC, I2C, ADC, GPIO, USART 등) 에 대해 접근을 하는 용도로 사용된다. ARM의 경우, 이 영역에 데이터를 쓰고 읽는 방법을 통해 장치를 제어할 수 있다. 예를 들어 LED를 켤 때에는 LED 장치가 물려 있는 GPIO의 핀에 1 혹은 0의 값을 쓰는 것을 통해 LDE를 끄고 켤 수 있다. 이 영역 또한 SRAM 메모리 영역과 마찬가지로 32 MB 의 Bit Band Alias 영역이 존재한다. 주변정치 영역은 System bus(시스템 버스)를 통해 접근을 하게 된다.
이 영역은 캐시 불가능 영역이고, 명령어 코드를 실행할 수 없다(Excute Never).

외부 RAM(External RAM) 영역(0x60000000 ~0x9FFFFFFF)은 외부 RAM을 위해 할당된 1G의 메모리 영역이다.
이 영역 중(0x60000000 ~ 0x7FFFFFFF)은 이 영역은 on-chip 또는 off-chip 메모리를 위한 공간이다. 캐시가능 영역(WB-WA)이고, 코드를 실행할 수 있다.
나머지 영역(0x80000000 ~ 0x9FFFFFFF)은 on-chip 또는 off-chip 메모리를 위한 공간이다. 캐시가능 영역(WT) 이고, 이 영역에서는 코드를 실행할 수 있다.

외부 장치(External Device) 영역(0xA0000000 ~ 0xDFFFFFFF)은 외부 장치를 위해 할당된 1G의 메모리 공간이다. 이 영역은 순차적이면서 버퍼 기능이 없는 접근을 요구하는 외부 장치들과 공유 메모리를 위해 만들어졌다. 코드 실행 불가한 메모리 영역이다.

마지막 0.5 GB의 메모리 공간(0xE0000000 ~ 0xFFFFFFFF)은 시스템 레벨 컴포넌트들과 내부의 주변장치 버스들, 외부의 주변장치 버스, 그리고 벤더의 특화된 시스템 주변장치들을 위한 메모리 공간이다.
이 영역은 캐시/버퍼 불가능한 영역이고, 전용 주변장치 버스 메모리 범위하에서 순차적으로 접근이 이루어 진다.





'혼자서 놀기... > STM32' 카테고리의 다른 글

STM32 보드에 펌웨어 퓨징  (0) 2009.12.26
STM32 개발 환경  (0) 2009.12.26
Cortex-M3(STM32) System Architecture  (0) 2009.10.06
STM32F103C6T6  (0) 2009.10.05
Cortex M3 - Bit Banding  (0) 2009.09.29
2009. 10. 6. 17:21

Cortex-M3(STM32) System Architecture



Cortex-M3(STM32) System Architecture

'Low-, Medium-, High-density devices'
는 4 개의 Master, 4 개의 Slaves로 이루어져 있다.
  • 4 개의 Masters
    • Cortex-M3 core DCode bus(D-bus), System bus(S-bus)
    • GP-DMA1 , 2 (General-Purpose DMA)
  • 4 개의 Slaves
    • Internal SRAM
    • Internal Flash Memory
    • FSMC
    • AHB to APB bridges(AHB2APBx)

Low-, Medium-, High-density System Architecture

ICode bus
Cortex-M3 core와 메인 메모리(Flash Memory)간의 Instruction Interface 정도로 생각하면 될듯 하다.

DCode bus
Cortex-M3 core와 메인 메모리(Flash Memory)간의 Data Interface 정도로 생각하면 될듯 하다.

System bus
Cortex-M3 core에서 peripherals bus와 관련있는 system bus와 Bus Matrix 사이의 Interface 이다.

DMA bus
DMA의 AHB master interface와 Bus Matrix 간의 Interface 이다.

Bus Matrix
BusMatrix는 Cortex-M3의 core system bus와  DMA master bus 사이의 접근 중재에 관한 관리를 한다.
이는 위의 그림에서 보는 것 처럼 CPU DCode bus, DMA, SRAM, Flash memory 그리고 Peripherals 등의 접근에 관한 중재 관리를 의미한다.
Low-, Medium-, High-density device의 경우 BusMatrix는 4개의 masters와 4개의 slaves로 구성되어 있고, 이에대한 접근을 관리한다.

AHB to APB bridges (APB)
하나의 AHB 와 두 개의 APB 에 대한 Full Synchronous connections를 제공하는 인터페이스 이다.
APB1은 36 MHz로 동작을 하고, APB2는 full speed인 72 MHz로 동작을 한다.

'혼자서 놀기... > STM32' 카테고리의 다른 글

STM32 개발 환경  (0) 2009.12.26
STM32 Memory Map  (1) 2009.12.24
STM32F103C6T6  (0) 2009.10.05
Cortex M3 - Bit Banding  (0) 2009.09.29
STM32F103C6  (0) 2009.09.23
2009. 10. 5. 11:37

STM32F103C6T6



현재 가지고 있는 STM32 보드에 대해서 알아보았다.
푸우님의 블로그를 참고하여 이것 저것을 하다 보니깐.. 흐름이 그 비슷하게 가고 있는 것 같다.

현재 사용하고 있는 STM32 칩의 ID는 STM32F103C6T6 이다.
이 ID가 무엇을 의미하는지 살펴보자.
From Datasheet STM32F103x6(15060)

현재 살펴볼 부분은 위 그림 중 붉은색 박스로 된 부분일 것이다. STM32F103은 동일하게 적용되는 부분이고, 나머지 부분들은 칩의 기능/성능에 따라 변경 되는 부분이다.

C는 48 핀을 의미하고,
6는 내부 Flash Memory 가 32 Kbyte라는 것을 의미하고,
T는 칩의 Package type이 LQFP라는 것을 의미하고,
6은 온도 범위의 정도를 나타낸다. 산업용으로 사용되는 칩이고, 6의 경우 -40 ~ 85 도 에서 정확한 동작유무 보장이 된다는 것을 의미하는 듯 하다.

다른 형식으로 표현된 그림이다.
Flash, SRAM, 가용한 각 device의 개수, CPU frequency ... 등에 대해 알 수 있다.
From Datasheet STM32F103x6(15060)

마지막 그림..
현재 사용하고자 하는 칩이 Low-density devices에 속하는 칩임을 알 수 있다.
From Datasheet STM32F103x6(15060)

이 문서는 일단 사용하는 칩이 어떤 녀석인지 알고자 하는 목적으로 작성했다.

'혼자서 놀기... > STM32' 카테고리의 다른 글

STM32 개발 환경  (0) 2009.12.26
STM32 Memory Map  (1) 2009.12.24
Cortex-M3(STM32) System Architecture  (0) 2009.10.06
Cortex M3 - Bit Banding  (0) 2009.09.29
STM32F103C6  (0) 2009.09.23
2009. 9. 29. 11:47

Cortex M3 - Bit Banding



Bit BandingCortex M3 에서 제공하는 Bit 연산을 쉽게(간단하게) 할 수 있도록 제공하는 하나의 방법이다.
Writing to a word in the alias region has the same effect as a read-modify-write operation on the targeted bit in the bit-band region. (하나의 워드를 bit band에 alias된 영역에 프로그래밍 하는 것으로 원하는 bit band 영역의 bit 를 프로그래밍 할 수 있다.)
말이 참 어렵다... -_-;;

Cortex M3의 메모리 맵을 보면 다음과 같이 되어있다. (from Cortex M3 Technical Reference Manual)

위 그림에서 붉은 박스로 된 부분, 즉 SRAM과 Peripheral의 하위 0x03FFFFFF 영역을 보면 1MB의 Bit Band region32MB의 Bit Band alias로 되어있다.

Cortex M3 이전의 ARM7, ARM9 등의 CPU에서 SRAM이나 Peripheral Memory 영역에 bit 연산을 하기 위해서는 AND 나 OR 연산을 사용해서 프로그래밍을 했다. 이러한 방법은 읽기, 수정, 쓰기 작업을 하는데 있어서 set, clear 등의 작업을 통한 많은 작업이 필요했다.
하지만, Cortex M3에서는 bit banding를 사용함으로 alias된 영역의 한 바이트에 값을 넣어주는 방식으로 원하는 bit에 접근을 할 수 있다.

왼쪽은 기존의 ARM7, ARM9에서 사용하던 bit 연산이고, 오른쪽이 Cortex M3에서 사용하는 Bit Banding 방식이다.

기존의 bit 연산을 보면 01001011 이라는 값에서 하위 세번 째 비트를 1로 세팅하기 위해 11111111 과 or 연산을 한다. 이렇듯 bit 연산을 하기 위새 AND 혹은 OR 연산을 통해 Mask를 하거나 다른 작업을 하게 된다. 이는 생각보다 많은 CPU 타임을 잡아먹는다고 한다.

Cortex M3에서의 bit banding를 보면..
실제 수정을 가할 32bit의 메모리 공간(0x20000000 ~ 0x200FFFFF)이 있고, 이 영역에 alias 된 가상의 메모리 공간(0x22000000 ~ 0x23FFFFFF)가 존재한다. 오른쪽 그림을 보면 왠지 감이 올듯도 한데.. alias 된 메모리 공간의 각 바이트들은 실제 bit banding 영역의 한 비트와 매칭된다. alias 된 가상의 메모리 공간의 한 바이트에 값을 넣게 되면 이와 매칭되는 실제 bit banding 메모리 공간(한 비트)에 프로그래밍 한 것과 동일한 효과를 갖는 것이다.
AND 나 OR 연산을 하지 않고 SRAM이나 Peripheral의 특정 메모리 영역에 별다른 instruction 없이 원하는 값을 쓰거나 읽기만 하면 되는 것이다. 이를 Cortex M3에서는 H/W 적으로 구현이 되어있다.

아래의 그림을 보면서 생각을 해보면 이해가 잘 된다. ^^; (from Cortex M3 Technical Reference Manual)


예를 들어 설명을 해보자.
실제 bit banding 영역의 0x20000000 번지의 0번 비트는 alias 된 가상의 영역 0x22000000 번지(한 바이트)와 매칭된다. 0x22000000 번지에 1을 넣게 되면, 0x20000000 번지의 0번 비트가 1이 된다는 말이다. 또 0x22000004 번지에 1을 넣게 되면, 0x20000000 번지의 1번 비트가 1이 되는 것이다.


데이터 시트를 보면 이를 수식화 해놓은 것이 있다.
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number x 4)
bit_word_addr = bit_band_base + bit_word_offset

수식에 맞추어 위의 예제를 풀어보자.
bit banding 영역의 0x20000000 번지의 비트 1번을 처리할 수 있는 alias 주소값은??
bit_word_addr : X
bit_band_base : 0x22000000
byte_offset : 0 byte
bit_number : 1 bit
0x22000000 + (0x00 x 32) + (0x01 x 4) = 0x22000004

데이터 시트에 있는 예제를 가지고 실제 어떠한 방식으로 사용을 할 수 있는지 살펴보자.
(from Insider's Guide STM32)
bit banding을 사용하여 GPIO의 PortB의 output register(0x40010C0C)를 다루는 예제이다.

Word address(GPIOB_ODR) = 0x40010C0C
Peripheral bit band base = 0x40000000
Peripheral bit band Alias base = 0x42000000
Byte offset from bit band base = 0x40010c0c – 0x40000000 = 10c0c
Bit word offset = (0x10c0c x 0x20) +(8x4) = 0x2181A0
Bit Alias address = 0x42000000 + 0x2181A0 = 0x422181A0

bit banding 식에 의해 나온 alias 주소값을 PortBbit8에 매핑한다.
#define PortBbit8 (*((volatile unsigned long *) 0x422181A0 ))

단지 데이터를 쓰는 것만으로도 해당 비트에 접근을 해 LED를 켤 수 있다.
PB8 = 1; //led on

또 다음과 같이 LED를 끌 수도 있다.
PB8 = 0; //led off

우리(프로그래머)는 위와 같이 간단하게 프로그래밍을 하면 된다.
Bit Banding이라는 것 참 좋은 아이디어인 듯 하다.

참고문서 :
푸우님 블로그(http://blog.naver.com/yhoh)
Insider's Guide STM32
Cortex M3 Technical Reference Manual
Reference Manual(RM0008)


'혼자서 놀기... > STM32' 카테고리의 다른 글

STM32 개발 환경  (0) 2009.12.26
STM32 Memory Map  (1) 2009.12.24
Cortex-M3(STM32) System Architecture  (0) 2009.10.06
STM32F103C6T6  (0) 2009.10.05
STM32F103C6  (0) 2009.09.23