'Cortex M3'에 해당되는 글 4건

  1. 2009.12.26 STM32 보드에 펌웨어 퓨징
  2. 2009.10.06 Cortex-M3(STM32) System Architecture
  3. 2009.10.05 STM32F103C6T6
  4. 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. 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