Embedded System의 GUI Platform

Qt를 상용 제품 개발에 추천하는 이유는 다음과 같다.

  • 안정성과 신뢰성 : 상업적 지원을 통해 품질 보장과 지속적인 업데이트를 받을 수 있음
  • 강력한 기능과 유연성 : 다양한 플랫폼 지원, 복잡한 UI 구현, 성능 최적화
  • 장기적인 유지 보수 용이 : 버그 수정과 기술 지원이 체계적으로 제공됨

하지만 Qt 라이센스 비용은 상상 초월이다. 비용 산정 기준도 복잡해서 Qt 상용 라이센스를 사용할 기업은 사용전에 반드시 비용을 검토해야 한다.

 

예를 들어 개발자 1명이 연 양산수량 5,000개의 임베디드 시스템 제품을 개발 및 생산한다고 하면

($10,000 * 1명) + ($2 * 5000개) = $20,000, $20,000 / 5,000개 = $4

→ 제품당 약 4$의 로열티

 

그런데 연 5,000개 만드는 회사에서 개발자가 1명만 있지는 않을테고, 5명이라고 가정시

($10,000 * 5명) + ($2 * 5000개) = $60,000, $60,000 / 5,000개 = $12

→ 제품당 약 12$의 로열티

 

문제는 연 양산수량이 500개 라고 해도 양산 최소 수량 만큼의 로열티를 지불해야 한다는 것이다.

($10,000 * 1명) + ($2 * 5000개) = $20,000, $20,000 / 500개 = $40

→ 제품당 약 40$의 로열티, 환율 1300원 적용하면 약 52,000원 + 알파(GUI 디자인 툴)

 
라이선스 종류
대상
개발자 라이선스
비용 (대략)
양산 최소 수량
제품당
로열티
비용
특징
Qt for Application Development
데스크탑/모바일 애플리케이션 개발용
$4,500~$5,500
/ 1년 / 개발자 1명
없음
없음
데스크탑 및 모바일 애플리케이션 개발용. 상업적 배포 가능.
Qt for
Device Creation
임베디드 시스템 및 디바이스용
$10,000~$15,000
/ 1년 / 개발자 1명
5,000~10,000개 양산 수량 이상
$2~$5
/ 제품
임베디드 디바이스용 GUI 개발에 적합. 제품당 로열티 발생.
Qt for
MCU
자원이 제한된 마이크로컨트롤러 기반 시스템용
$15,000 이상
/ 프로젝트 기준
5,000개
양산 수량 이상
$1~$3
/ 제품
저사양 마이크로컨트롤러에 최적화된 GUI. 제품당 로열티 발생.
Qt Design Studio
UI/UX 디자이너를 위한 GUI 디자인 툴
$550~$1,000
/ 1년 / 사용자 1명
없음
없음
GUI 디자인 및 프로토타입 제작 도구.
Extended Support
장기적 지원 및 이전 버전의 Qt에 대한 연장 지원
별도 협의
(수천~수만 달러 이상)
없음
없음
장기적 제품 유지 보수 및 보안

 

비용이 걱정된다면 아래 표를 참조하여 오픈 소스 GUI 라이브러리를 고려할 수 있다.

(오픈 소스 ≠ 무료)

 
플랫폼
장점
단점
사용
언어
비용
사용되는 시스템
LVGL (LittlevGL)
- 오픈 소스이며 크로스 플랫폼 지원
- 리소스 효율적이며 낮은 메모리 요구
- 다양한 위젯과 디자인 가능
- 상업적 프로젝트에서 널리 사용됨
- 특정 고급 기능은 별도의 라이브러리 필요
- 커뮤니티 지원에 의존적일 수 있음
C
C++
무료
- 임베디드 시스템
- IoT 장치
- 저전력 디스플레이 장치
Qt for Embedded
- 크로스 플랫폼 지원 (임베디드 및 데스크탑)
- 강력한 위젯과 툴 제공
- 복잡한 애플리케이션 개발에 적합
- 상대적으로 높은 자원 요구
- 상대적으로 높은 자원 요구
- 라이센스 비용이 비쌈
C++
QML
유료 (상용
라이
센스
필요)
- 임베디드 시스템
- 산업용 장비
- 디지털 표지판
- 자동차 인포테인먼트 시스템
TouchGFX
- STM32 마이크로컨트롤러에 최적화
- 리소스 제한 환경에서도 고성능 그래픽 제공
- 하드웨어 가속 지원
- 낮은 전력 소비와 메모리 사용
- STM32 전용
- 다른 플랫폼에 비해 제한적
C++
무료
- STM32 기반 임베디드 시스템
- 모바일 장치
- 산업 장비
GTK+ for Embedded
- 주로 Linux 기반 임베디드 시스템에서 사용
- 다양한 언어 지원 (C, Python 등)
- GNOME 데스크탑과의 통합성
- 상대적으로 복잡한 설정
- 설정과 유지 관리가 복잡할 수 있음
- 비교적 무거울 수 있음
C Python
Rust (gtk-rs)
무료
- Linux 기반 임베디드 시스템
- 산업용 디스플레이
- IoT 장치
EmWin
- STMicroelectronics의 임베디드 시스템에 최적화
- 효율적인 메모리 사용
- 간단한 설정과 사용법
- 다양한 위젯과 지원 기능
- STMicroelectronics의 하드웨어에만 최적화
- 상대적으로 비쌈
C
유료
- STM32 MCU
- NXP, Renesas, Silicon Labs MCU
- 산업용 장비
- 소비자 전자제품
Flutter
- 크로스 플랫폼 지원 (모바일, 웹, 데스크탑)
- 빠른 UI 개발과 핫 리로드 기능
- 위젯 기반 UI 설계
- 임베디드 시스템에서의 사용은 아직 초기 단계
- 임베디드 시스템에서의 지원이 아직 초기 단계
- 대형 애플리케이션에서 성능 문제 발생 가능
Dart
무료
- 모바일 애플리케이션
- 웹 애플리케이션
- 데스크탑 애플리케이션

 

 

 

 

PM0056 : STM32F10xxx/20xxx/21xxx/L1xxxx Cortex®-M3 programming manual p.14
 

1. General-purpose registers

R0-R12은 32-bit general-purpose registers for data operations.

 

2. SP(Stack pointer)

The SP is register R13. In Thread mode, bit[1] of the CONTROL register

indicates the stack pointer to use:

• 0 = Main Stack Pointer (MSP). This is the reset value.

• 1 = Process Stack Pointer (PSP).

On reset, the processor loads the MSP with the value from address 0x00000000.

 

3. LR(Link register)

The LR is register R14. It stores the return information for subroutines,

function calls, and exceptions. On reset, the processor loads the LR value 0xFFFFFFFF.

 

4. PC(Program counter)

The PC is register R15. It contains the current program address. Bit[0] is

always 0 because instruction fetches must be halfword aligned. On reset, the processor

loads the PC with the value of the reset vector, which is at address 0x00000004.

 

5. PSR(Program status register)

The PSR combines:

• Application Program Status Register (APSR)

• Interrupt Program Status Register (IPSR)

• Execution Program Status Register (EPSR)

 

6. APSR(Application program status register)

The APSR contains the current state of the condition flags from previous instruction

executions. See the register summary in Table 2 on page 15 for its attributes. The bit

assignments are:

 

7. IPSR(Interrupt program status register)

The IPSR contains the exception type number of the current Interrupt Service Routine

(ISR).

 

8. EPSR(Execution program status register)

The EPSR contains the Thumb state bit, and the execution state bits for either the:

• If-Then (IT) instruction

• Interruptible-Continuable Instruction (ICI) field for an interrupted load multiple or store

multiple instruction.

 

9. Interruptible-continuable instructions

When an interrupt occurs during the execution of an LDM or STM instruction, the processor:

• Stops the load multiple or store multiple instruction operation temporarily

• Stores the next register operand in the multiple operation to EPSR bits[15:12].

After servicing the interrupt, the processor:

• Returns to the register pointed to by bits[15:12]

• Resumes execution of the multiple load or store instruction.

When the EPSR holds ICI execution state, bits[26:25,11:10] are zero.

 

10. If-Then block

The If-Then block contains up to four instructions following a 16-bit IT instruction. Each

instruction in the block is conditional. The conditions for the instructions are either all the

same, or some can be the inverse of others. See IT on page 94 for more information.

 

11. Exception mask registers

The exception mask registers disable the handling of exceptions by the processor. Disable

exceptions where they might impact on timing critical tasks.

 

12. Priority mask register

The PRIMASK register prevents activation of all exceptions with configurable priority.

 

13. Fault mask register

The FAULTMASK register prevents activation of all exceptions except for Non-Maskable Interrupt (NMI).

 

14. BASEPRI(Base priority mask register)

The BASEPRI register defines the minimum priority for exception processing. When BASEPRI is set to a nonzero value, it prevents the activation of all exceptions with same or lower priority level as the BASEPRI value.

 

15. CONTROL register

The CONTROL register controls the stack used and the privilege level for software execution when the processor is in Thread mode.


그러면 도대체 이걸 왜 알아야 할까?

 

1. 시스템 초기화 및 설정

- RESET 및 초기화 과정

시스템이 리셋되었을 때 코어 레지스터를 통해 프로세서 상태를 파악하거나 기본 설정을 진행

 

- 시작 코드 작성

코어 레지스터를 활용해 초기 스택 포인터, 인터럽트 벡터 위치 등을 설정

 

2. 인터럽트 및 예외 처리

- 인터럽트 우선순위 관리

Nested Vectored Interrupt Controller(NVIC) 관련 코어 레지스터를 사용해 우선순위를 설정하거나 특정 인터럽트를 활성화/비활성화

 

- 예외 처리 분석

Fault 상태 레지스터(CFSR, HFSR 등)를 통해 오류의 원인을 분석하고 적절히 대처

 

3. 디버깅 및 시스템 동작 확인

- 실행 상태 확인

Program Counter(PC), Link Register(LR), Stack Pointer(SP)를 통해 현재 실행 중인 명령어 위치, 함수 복귀 주소, 스택 상태를 확인

 

- 오류 원인 추적

Hard Fault나 Usage Fault 발생 시 Fault 관련 레지스터를 읽어 문제 발생 위치와 원인을 파악

 

4. 시스템 동작 최적화

- 전력 관리

Sleep 모드 설정(SCR) 또는 저전력 대기 상태 진입 시 사용

예: SLEEPONEXIT 비트를 설정하여 특정 조건에서 자동으로 Sleep 상태로 전환

 

- RTOS와의 연동

Process Stack Pointer(PSP)와 Main Stack Pointer(MSP)를 스위칭하여 태스크 간 전환을 효율적으로 관리

 

5. 주기적 동작 관리

- SysTick Timer 활용

SysTick 레지스터를 통해 주기적인 인터럽트를 생성하여 OS Tick 또는 타이머 이벤트를 구현

 

6. 사용자 코드 보호

- FAULTMASK, PRIMASK

중요 코드 실행 중 인터럽트를 제한하거나, 특정 크리티컬 섹션 보호를 위해 인터럽트를 마스킹

 

'ST > 개발 환경 및 구조' 카테고리의 다른 글

STM32Cube for VS Code  (0) 2025.10.20
STM32F103x Memory map  (0) 2025.03.18
ST MCU/MPU Security Features  (0) 2025.03.18
CMSIS  (0) 2025.03.18
STM32 CubeMX LL driver  (0) 2025.03.18

 

- STM32F103의 메모리 맵은 Cortex-M3 코어를 기반으로 설계된 마이크로컨트롤러의 주소 공간 구조

- 메모리 맵은 다양한 메모리와 주변 장치의 주소를 정의하며, 다음의 사진과 같음

DS5319 : STM32F103x8 datasheet p.34

 

1. 코드 메모리 영역 (0x0000 0000 ~ 0x1FFF FFFF)

- 부트 메모리: 0x0000 0000 ~ 0x1FFF FFFF

- 초기 부트 로더 코드가 위치. 부팅 모드에 따라 플래시 메모리, SRAM, 또는 시스템 메모리로 매핑

 

2. SRAM (0x2000 0000 ~ 0x3FFF FFFF)

- 내부 SRAM: 0x2000 0000 ~ 0x2000 4FFF (20KB)

- 일반 데이터 저장용. Cortex-M3 코어에서 빠르게 액세스 가능

- 추가로 사용 가능한 SRAM 주소는 비워진 공간에 의해 확장될 수 있음

 

3. 주변 장치 (0x4000 0000 ~ 0x5FFF FFFF)

- APB1/APB2 버스와 AHB 버스 주변 장치에 매핑된 주소

- APB1: 0x4000 0000 ~ 0x4000 FFFF

- APB2: 0x4001 0000 ~ 0x4001 FFFF

- AHB: 0x5000 0000 ~ 0x5006 FFFF

- 타이머, ADC, USART, SPI와 같은 장치의 레지스터가 포함

 

4. 플래시 메모리 (0x0800 0000 ~ 0x080F FFFF)

- 64KB ~ 128KB 플래시 메모리 (모델에 따라 다름)

- 사용자 프로그램과 데이터 저장용

 

5. 시스템 메모리 (0x1FFF F000 ~ 0x1FFF FFFF)

- 제조사 제공 부트로더가 위치

- UART, USB DFU 등으로 펌웨어 업로드 가능

 

6. 외부 메모리 (0x6000 0000 ~ 0x9FFF FFFF)

- FSMC(Flexible Static Memory Controller)를 통해 외부 SRAM, NOR, NAND 플래시 메모리 등을 연결

 

7. 코어 영역 (0xE000 0000 ~ 0xE00F FFFF)

- System Control Space (SCS): 0xE000 E000 ~ 0xE000 EFFF

- NVIC, SysTick, 디버그 관련 레지스터

- Cortex-M3 프로세서 특화 레지스터 포함


그러면 도대체 이걸 왜 알아야 할까?

 

1. 펌웨어 개발

특정 메모리 영역 접근: 예를 들어, 플래시 메모리, SRAM, 또는 주변 장치 레지스터에 접근할 때

Interrupt Vector Table 설정: 인터럽트 핸들러를 설정하려면 메모리 맵을 알아야 함

 

2. 디버깅 및 문제 해결

디버깅 중에 메모리 주소를 참조하여 오류를 찾거나 메모리 상태를 분석할 때

예를 들어, 스택 오버플로우나 메모리 충돌 문제를 추적할 때 도움이 됨

 

3. 부트로더 개발

부트로더는 플래시 메모리의 특정 영역에서 실행되므로 정확한 메모리 맵 정보를 기반으로 코드를 작성

 

4. 주변 장치 제어

UART, SPI, GPIO 등과 같은 주변 장치를 설정하려면 해당 레지스터 주소를 정확히 알아야 하며, 이는 메모리 맵에 정의

 

5. Direct Memory Access (DMA) 설정

DMA를 사용할 때 소스와 목적지 주소를 설정해야 하므로 메모리 맵을 참고

 

6. 커스텀 메모리 섹션 설정

특정 코드나 데이터를 특정 메모리 섹션에 배치해야 할 때, 메모리 맵 정보를 활용하여 링크 스크립트를 작성

 

'ST > 개발 환경 및 구조' 카테고리의 다른 글

STM32Cube for VS Code  (0) 2025.10.20
STM32F103x Core registers  (0) 2025.03.18
ST MCU/MPU Security Features  (0) 2025.03.18
CMSIS  (0) 2025.03.18
STM32 CubeMX LL driver  (0) 2025.03.18

 

- ST의 MCU(마이크로컨트롤러 유닛)에는 다양한 보안 기능이 탑재되어 디바이스와 애플리케이션을 보호

- ST의 보안 기능은 주로 소프트웨어 보호, 메모리 보호, 암호화, 부팅 보호 등을 포함

아래는 이러한 보안 기능을 요약한 표

 
기능
설명
적용 MCU 시리즈
RDP (Readout Protection)
MCU의 플래시 메모리에서 데이터를 읽어오는 것을 방지하는 기능
레벨 0, 1, 2로 구성되며, 레벨 2는 완전한 보안으로 디버깅 및 펌웨어 업그레이드 불가
STM32 전 제품군
PCROP (Proprietary Code Read-Out Protection)
플래시 메모리의 특정 섹터를 보호하여, 외부에서 접근할 수 없도록 하는 기능
메모리 보호와 동시에 코드 실행은 가능
STM32L4, STM32L5, STM32H7
TrustZone
프로세서를 "Secure" 영역과 "Non-secure" 영역으로 분리하여, 보안 애플리케이션이 실행되는 동안 민감한 데이터와 자원을 보호
STM32L5, STM32U5, STM32H7
Secure Boot
안전한 부팅을 보장하는 기능으로, 불법적으로 변경된 펌웨어를 실행하지 않도록 보호
Secure Boot와 TrustZone을 함께 사용하여 보안 강화 가능
STM32L5, STM32U5, STM32H7
AES (Advanced Encryption Standard)
AES 알고리즘을 하드웨어적으로 지원하여, 데이터 암호화 및 복호화 속도를 높이고, 전송되는 데이터의 무결성과 기밀성을 보호
STM32F7, STM32H7, STM32L4, STM32L5
PKA (Public Key Accelerator)
공개 키 암호화 작업을 가속화하여, ECC(Elliptic Curve Cryptography)와 같은 강력한 암호화 알고리즘을 보다 효율적으로 사용 가능
STM32L5, STM32U5, STM32H7
OTFDEC (On-The-Fly Decryption)
외부 메모리에서 직접 실행할 때 데이터를 실시간으로 암호 해독하여, 암호화된 데이터만 메모리에 저장하고, 불법 복제를 방지
STM32H7, STM32L5, STM32U5
Tamper Detection
외부에서 불법적인 조작이 시도될 경우 이를 감지하여, 시스템을 안전하게 보호. 이 기능은 보안 메모리 영역이나 보안 임베디드 기능과 함께 사용 가능
STM32L4, STM32L5, STM32U5
Firewall
지정된 메모리와 주변장치에 접근하는 것을 제한하여, 애플리케이션 레벨에서의 보안 강화. 특히 민감한 데이터나 중요한 기능을 보호하는 데 사용
STM32L4, STM32L5
HDPL (Hardware Development Protection Level)
하드웨어에서 개발 단계별 보호 레벨을 설정하여, 생산과정에서의 보안을 강화. 디버그 인터페이스를 차단하거나, 특정 기능을 잠금 설정
STM32L5, STM32H7, STM32U5
JTAG/SWD Lock
JTAG/SWD 디버그 인터페이스를 비활성화하여, 물리적 공격을 통한 디버깅과 정보 유출을 방지
STM32 전 제품군

 


1. RDP (Readout Protection)

세부 내용:

  • RDP는 STM32의 플래시 메모리의 읽기 접근을 제어합니다.
  • 레벨 1로 설정하면, 플래시 메모리와 디버깅 인터페이스에 대한 접근이 차단되며, 이 설정은 MCU의 펌웨어를 보호하는 데 유용합니다.
  • 레벨 2로 설정하면, 디버깅과 모든 플래시 메모리에 대한 접근이 차단되며, 이 상태는 영구적입니다. 펌웨어를 읽는 것이 불가능하게 됩니다.

사용법:

  • RDP를 설정하려면 STM32의 ST-Link Utility 또는 STM32CubeProgrammer와 같은 소프트웨어를 사용합니다.
  • 소프트웨어에서 RDP 설정을 선택하고 원하는 레벨을 적용합니다.
  • 레벨 1은 개발 중에 필요할 때 다시 변경할 수 있지만, 레벨 2는 변경할 수 없으므로 신중하게 결정해야 합니다.

 

2. PCROP (Proprietary Code Read-Out Protection)

세부 내용:

  • PCROP는 플래시 메모리의 특정 영역에 대해 읽기 보호를 설정할 수 있습니다.
  • 이 기능은 일반적으로 중요한 코드나 데이터를 보호하기 위해 사용되며, 설정된 영역의 데이터는 외부에서 읽을 수 없습니다.

사용법:

  • STM32의 STM32CubeMX 또는 STM32CubeProgrammer를 사용하여 PCROP 영역을 설정합니다.
  • 설정할 영역을 선택하고, 해당 영역에 대해 읽기 보호를 활성화합니다.
  • PCROP 설정 후, 영역의 내용은 외부에서 접근할 수 없으며, 소프트웨어에서 이를 확인할 수 있습니다.

 

3. TrustZone

세부 내용:

  • Arm TrustZone은 시스템을 두 개의 영역, 즉 신뢰 구역과 비신뢰 구역으로 나누어 보안을 강화합니다.
  • 신뢰 구역에서는 중요한 데이터와 코드가 실행되며, 비신뢰 구역에서는 일반 애플리케이션이 실행됩니다.
  • TrustZone 기술은 하드웨어적으로 두 영역을 분리하여, 하나의 영역에서의 코드가 다른 영역에 영향을 미치지 않도록 합니다.

사용법:

  • TrustZone을 활용하려면 Arm Cortex-M 시리즈 프로세서를 사용하고, 관련 소프트웨어 개발 도구에서 TrustZone 지원을 활성화합니다.
  • ARM Development Tools 또는 **MDK (Microcontroller Development Kit)**를 사용하여 TrustZone 기반의 애플리케이션을 개발합니다.
  • TrustZone 설정을 통해, 신뢰 구역에서 실행할 코드와 비신뢰 구역에서 실행할 코드를 나눕니다.

 

4. Secure Boot

세부 내용:

  • Secure Boot은 부팅 과정에서 펌웨어의 디지털 서명을 검증하여, 무결성이 확인된 펌웨어만 부팅됩니다.
  • 디지털 서명은 공개 키와 비밀 키를 사용하여 생성됩니다. 부팅 중에는 서명을 검증하여 펌웨어가 변조되지 않았는지 확인합니다.

사용법:

  • Secure Boot을 설정하려면 펌웨어를 서명하고, 이를 시스템의 부팅 프로세스에 통합합니다.
  • STM32CubeProgrammer에서 Secure Boot 설정을 활성화하고, 서명된 펌웨어를 업로드합니다.
  • 시스템이 부팅될 때, 서명 검증을 통해 무결성을 확인합니다.

 

5. AES (Advanced Encryption Standard)

세부 내용:

  • AES는 대칭 키 암호화 알고리즘으로, 데이터를 암호화하고 복호화하는 데 사용됩니다. 키 길이에 따라 AES-128, AES-192, AES-256이 있습니다.
  • 데이터 블록을 128비트 단위로 처리하며, 고속의 암호화 및 복호화를 제공합니다.

사용법:

  • STM32의 하드웨어 AES 모듈을 사용하여 암호화 및 복호화 작업을 수행합니다.
  • STM32CubeMX에서 AES 모듈을 활성화하고, 해당 기능을 코드에서 호출하여 데이터를 암호화하거나 복호화합니다.
  • HAL 라이브러리를 사용하여 AES 암호화 및 복호화 함수를 호출합니다.

 

6. PKA (Public Key Accelerator)

세부 내용:

  • PKA는 공개 키 암호화 알고리즘을 하드웨어적으로 가속화하여 빠른 연산을 지원합니다. RSA, ECC 등의 알고리즘을 지원합니다.
  • 공개 키 암호화는 데이터를 암호화하고 서명 검증을 수행하는 데 사용됩니다.

사용법:

  • PKA 모듈을 STM32CubeMX에서 활성화하고, 관련 API를 사용하여 공개 키 암호화 작업을 수행합니다.
  • HAL 라이브러리에서 PKA 함수들을 호출하여 RSA 또는 ECC 연산을 수행합니다.
  • 공개 키 암호화 연산을 하드웨어 가속을 통해 성능을 향상시킵니다.

 

7. OTFDEC (On-The-Fly Decryption)

세부 내용:

  • OTFDEC는 암호화된 데이터를 메모리에서 읽을 때 실시간으로 복호화하는 기능을 제공합니다.
  • 데이터가 메모리에 로드되기 전에 자동으로 복호화되며, 이로 인해 암호화된 데이터를 직접 사용할 수 있습니다.

사용법:

  • STM32의 OTFDEC 모듈을 활성화하고, 암호화된 데이터를 메모리에 저장한 후, OTFDEC를 사용하여 복호화합니다.
  • STM32CubeMX에서 OTFDEC 설정을 구성하고, 복호화 작업을 위한 API를 호출합니다.

 

8. Tamper Detection

세부 내용:

  • Tamper Detection은 물리적 공격이나 하드웨어 변조를 감지합니다. 침입이 감지되면 시스템을 보호하기 위해 특정 동작을 수행할 수 있습니다.
  • 보통 시스템의 물리적 보안 경계가 변경되거나 파괴된 경우에 경고를 발생시킵니다.

사용법:

  • STM32의 Tamper Detection 기능을 활성화하고, 감지된 변조에 대해 적절한 반응을 설정합니다.
  • Tamper 이벤트 발생 시, 시스템의 상태를 기록하거나 특정 동작(예: 시스템 재부팅, 데이터 삭제 등)을 수행합니다.

 

9. Firewall

세부 내용:

  • Firewall은 네트워크 트래픽을 필터링하고 모니터링하여 불법 접근을 차단합니다.
  • 외부에서의 무단 접근을 방지하고, 네트워크 보안을 강화합니다.

사용법:

  • STM32의 하드웨어 방화벽을 설정하여, 특정 주소나 포트를 통한 접근을 차단합니다.
  • STM32CubeMX에서 방화벽 설정을 구성하고, 필터링 규칙을 정의하여 시스템의 보안을 강화합니다.

 

10. HDPL (Hardware Development Protection Level)

세부 내용:

  • HDPL은 하드웨어 개발 과정에서의 보안을 강화하는 기능입니다. 개발 중에 코드나 데이터의 무단 접근을 방지합니다.
  • 개발 과정에서의 정보 유출을 방지하며, 개발 단계의 보안을 강화합니다.

사용법:

  • 개발 환경에서 HDPL 설정을 활성화하고, 코드와 데이터를 보호하기 위한 보안 정책을 적용합니다.
  • 개발 중에 보안성을 유지하기 위해 적절한 접근 제어와 보호 메커니즘을 설정합니다.

 

11. JTAG/SWD Lock

세부 내용:

  • JTAG/SWD Lock은 JTAG 및 Serial Wire Debug (SWD) 인터페이스를 잠궈 외부 디버거의 접근을 제한합니다.
  • 디버깅 기능을 비활성화하여, 펌웨어의 무단 접근이나 수정 방지.

사용법:

  • STM32의 JTAG/SWD Lock 설정을 활성화하여 디버깅 인터페이스를 잠급니다.
  • STM32CubeProgrammer 또는 ST-Link Utility에서 JTAG/SWD Lock 설정을 적용하여 보안을 강화합니다.

 

'ST > 개발 환경 및 구조' 카테고리의 다른 글

STM32F103x Core registers  (0) 2025.03.18
STM32F103x Memory map  (0) 2025.03.18
CMSIS  (0) 2025.03.18
STM32 CubeMX LL driver  (0) 2025.03.18
STM32 Driver(Library)  (0) 2025.03.18

 

CMSIS(Common Microcontroller Software Interface Standard)는 Arm Cortex 프로세서를 기반으로 하는 마이크로 컨트롤러용 벤더 독립 추상화 레이어.CMSIS는 범용 툴인터페이스를 정의하고 일관된 디바이스 지원 가능. CMSIS 소프트웨어 인터페이스는 소프트웨어 재사용을 단순화하고 마이크로컨트롤러 개발자의 학습 곡선을 줄이며 새로운 기기의 시장 출시 기간을 단축.

 

CMSIS는 프로세서 및 주변기기, 실시간 운영체제 및 미들웨어 컴포넌트에 대한 인터페이스를 제공. CMSIS에는 디바이스, 보드 및 소프트웨어의 전송 메커니즘이 포함되어 있어 여러 벤더의 소프트웨어 컴포넌트를 조합 가능.

 

https://www.keil.arm.com/cmsis

 

Arm Keil

Keil MDK, Keil Studio Cloud and Keil Studio for VS Code. As flexible as you are: from cloud to desktop, from CLI to GUI, running on macOS, Linux, and Windows

www.keil.arm.com

 

CMSIS
Target Processors
Description
Core(M)
All Cortex-M, SecurCore
Standardized API for the Cortex-M processor core and peripherals. Includes intrinsic functions for Cortex-M4/M7/M33/M35P SIMD instructions.
Core(A)
Cortex-A5/A7/A9
Standardized API and basic run-time system for the Cortex-A5/A7/A9 processor core and peripherals.
Driver
All Cortex
Generic peripheral driver interfaces for middleware. Connects microcontroller peripherals with middleware that implements for example communication stacks, file systems, or graphic user interfaces.
DSP
All Cortex-M
DSP library collection with over 60 Functions for various data types: fixed-point (fractional q7, q15, q31) and single precision floating-point (32-bit). Implementations optimized for the SIMD instruction set are available for Cortex-M4/M7/M33/M35P.
NN
All Cortex-M
Collection of efficient neural network kernels developed to maximize the performance and minimize the memory footprint on Cortex-M processor cores.
RTOS v1
Cortex-M0/M0+/M3/M4/M7
Common API for real-time operating systems along with a reference implementation based on RTX. It enables software components that can work across multiple RTOS systems.
RTOS v2
All Cortex-M, Cortex-A5/A7/A9
Extends CMSIS-RTOS v1 with Armv8-M support, dynamic object creation, provisions for multi-core systems, binary compatible interface.
Pack
All Cortex-M, SecurCore, Cortex-A5/A7/A9
Describes a delivery mechanism for software components, device parameters, and evaluation board support. It simplifies software reuse and product life-cycle management (PLM).
SVD
All Cortex-M, SecurCore
Peripheral description of a device that can be used to create peripheral awareness in debuggers or CMSIS-Core header files.
DAP
All Cortex
Firmware for a debug unit that interfaces to the CoreSight Debug Access Port.
Zone
All Cortex-M
Defines methods to describe system resources and to partition these resources into multiple projects and execution areas.

 

 

'ST > 개발 환경 및 구조' 카테고리의 다른 글

STM32F103x Memory map  (0) 2025.03.18
ST MCU/MPU Security Features  (0) 2025.03.18
STM32 CubeMX LL driver  (0) 2025.03.18
STM32 Driver(Library)  (0) 2025.03.18
Linker Script(2) - 구조 및 설명  (0) 2025.03.17

 

CubeMX에서 pheriperal인 GPIO, USART, TIMER, PWM를 설정할때 기본이 HAL divrer로 설정된다.

하지만 HAL driver는 이식성을 좋게 하기 위해 용량이 커지고 코드 실행 시간이 길어진다. 그래서 코드 최적화 하여 코드 실행 시간을 줄일 수 있는 LL driver 설정 방법은 다음과 같다.

 

1. CubeMX 실행

 

2. CubeMX - Project Manager

 

3. CubeMX - Project Manager - Advanced Settings

: HAL 또는 LL driver 선택

'ST > 개발 환경 및 구조' 카테고리의 다른 글

ST MCU/MPU Security Features  (0) 2025.03.18
CMSIS  (0) 2025.03.18
STM32 Driver(Library)  (0) 2025.03.18
Linker Script(2) - 구조 및 설명  (0) 2025.03.17
Linker Script(1) - Segment  (0) 2025.03.17

 

보통 STM32를 F/W를 개발할 때 HAL(Hardware Abstraction Layer) driver를 사용하는데, 이 driver 말고도 아래와 같이 다양한 library가 있다.

https://www.st.com/content/ccc/resource/sales_and_marketing/presentation/product_presentation/37/55/ff/bc/a8/71/4f/c5/stm32_embedded_software_offering.pdf/files/stm32_embedded_software_offering.pdf/jcr:content/translations/en.stm32_embedded_software_offering.pdf

 

 

ST에서 제공하는 library는 아래와 같다.

1. STM32Snippets

2. STM32 Cube LL(low layer)

3. Standard Peripheral Library

4. STM32Cube HAL

X. Mbed Core(32비트 ARM Cortex-M 마이크로 컨트롤러 개발을 위한 인터넷 플랫폼 및 온라인 운영 체제)

 

 

1. STM32Snippets

STM32 주변 레지스터를 직접 기반으로 하는 코드 예제 모음

- Highly Optimized : 최적화

- Register Level Access : 이기 때문에

- Small code expressions : 코드 사이즈 최소화

- Lack of abstraction means developers must understand peripheral operation at register level

 

2. STM32 Cube LL(low layer)

- Highly Optimized : 최적화

- Register Level Access : 이기 때문에

- Small code expressions : 코드 사이즈 최소화

- Can work with STM32CubeMX to generate initialization code for STM32L0/F0/F3/L4

 

3. Standard Peripheral Library

STM32Cube 출시전의 library

- No need for direct register manipulation : 간접 제어

- 100% coverage of all peripherals

- Doesn’t support forward STM32 series starting with STM32 L0, L4 and F7 : 이제 지원 안함

 

4. STM32Cube HAL(Hardware abstraction layer)

MCU를 제어할 때, 내부 register를 직접 제어(심지어 bit 세팅) 해야 하지만, HAL Driver를 사용할 경우 Register 제어가 library화 되어 있어 쉬우며, CubeMX를 사용할 경우 그래픽으로 시각화 하여 몇가지 설정만으로 기본 소스 코를 자동 생성되므로 쉽게 설정이 가능

- High level and functional abstraction

- Easy port from one series to another

- 100% coverage of all peripherals

- Integrates complex middleware such as USB/TCP-IP/Graphics/Touch Sense/RTOS

- Can work with STM32CubeMX to generate initialization code

- Higher portability creates bigger software footprints or more time spent executing

adaptation code

 

X. Mbed Core

Mbed는 32비트 ARM Cortex-M 마이크로 컨트롤러 개발을 위한 인터넷 플랫폼 및 온라인 운영 체제

ARM Cortex-MX 계열의 코딩및 빌드를 위해 온라인상으로 IDE 및 컴파일을 제공

https://os.mbed.com/

 

Free open source IoT OS and development tools from Arm | Mbed

Mbed OS Mbed OS provides a well-defined API to develop your C++ application, plus free tools and thousands of code examples, libraries and drivers for common components. With a built-in security stack, core components such as storage, and several connectiv

os.mbed.com

 

아래는 ST에서 제공하는 library를 이식성, 최적화, 접근성, 가독성, 하드웨어 적용 범위를 비교한 표이다.

HAL driver는 이식성, 가독성, 하드웨어 적용 범위는 좋으나, 최적화는 좋지 않아, 최적화를 해야 할 경우 LL driver를 사용하기도 한다.

 

'ST > 개발 환경 및 구조' 카테고리의 다른 글

CMSIS  (0) 2025.03.18
STM32 CubeMX LL driver  (0) 2025.03.18
Linker Script(2) - 구조 및 설명  (0) 2025.03.17
Linker Script(1) - Segment  (0) 2025.03.17
ST 개발 보드 소개(2) - 32F746GDISCOVERY  (0) 2025.03.17

 

MCU
STM32F103VCT(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
Linker Script 구조 분석

 

1. MEMORY

아래는 STM32F103VCT의 Linker Script의 일부분이다.

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 48K
FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 256K
}
 

RAM과 FLASH로 구분되어 있다.

RAM(xrw)은 48Kbyte

FLASH(rx)은 256Kbyte

 

2. SECTION

아래는 STM32F103VCT의 Linker Script의 일부분이다.

SECTIONS
{
  /* The startup code goes first into FLASH */
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(4);
  } >FLASH

  /* The program code and other data goes into FLASH */
  .text :
  {
    . = ALIGN(4);
    *(.text)           /* .text sections (code) */
    *(.text*)          /* .text* sections (code) */
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .;        /* define a global symbols at end of code */
  } >FLASH

  /* Constant data goes into FLASH */
  .rodata :
  {
    . = ALIGN(4);
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(4);
  } >FLASH

  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
  .ARM : {
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
  } >FLASH

  .preinit_array     :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } >FLASH
  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } >FLASH
  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } >FLASH

  /* used by the startup to initialize data */
  _sidata = LOADADDR(.data);

  /* Initialized data sections goes into RAM, load LMA copy after code */
  .data : 
  {
    . = ALIGN(4);
    _sdata = .;        /* create a global symbol at data start */
    *(.data)           /* .data sections */
    *(.data*)          /* .data* sections */

    . = ALIGN(4);
    _edata = .;        /* define a global symbol at data end */
  } >RAM AT> FLASH

  
  /* Uninitialized data section */
  . = ALIGN(4);
  .bss :
  {
    /* This is used by the startup in order to initialize the .bss secion */
    _sbss = .;         /* define a global symbol at bss start */
    __bss_start__ = _sbss;
    *(.bss)
    *(.bss*)
    *(COMMON)

    . = ALIGN(4);
    _ebss = .;         /* define a global symbol at bss end */
    __bss_end__ = _ebss;
  } >RAM

  /* User_heap_stack section, used to check that there is enough RAM left */
  ._user_heap_stack :
  {
    . = ALIGN(4);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(4);
  } >RAM

  /* Remove information from the standard libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }

  .ARM.attributes 0 : { *(.ARM.attributes) }
}
 

복잡해 보이지만 모두 다 이해할 필요는 없다.

예를 들어 메모리가 부족해 SDRAM을 추가 후, bss나 heap을 SDRAM에 할당 하는 정도만 알면 충분하다.

 

(1) .isr_vector, .text, .rodata

  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(4);
  } >FLASH
 

.isr_vector는 FLASH에 쓰여지며, 0x8000000 부터 할당 된다.

.isr_vector, .text, .rodata(read only) 모두 FLASH에 할당 된다.

 

(2) .data, .bss, .heap, .stack

위 영역은 RAM에 할당 된다. data 영역은 다시 0이 아닌값으로 초기화 되는 .data영역과, 0으로 초기화 되는 .bss 영역으로 나눌 수 있다.

 

컴파일 후에 map 파일을 열어보면 위와 같이 잘 되었는지 확인 할 수 있다. 아래는 map 파일의 일부분이다.

.isr_vector     0x08000000      0x1e4
                0x08000000                . = ALIGN (0x4)
 *(.isr_vector)
 .isr_vector    0x08000000      0x1e4 startup\startup_stm32f103xe.o
                0x08000000                g_pfnVectors
                0x080001e4                . = ALIGN (0x4)

.text           0x080001e8     0x9ae8
                0x080001e8                . = ALIGN (0x4)
 *(.text)
 

실제로 0이외의 값으로 초기화한 변수는 .data 영역으로 할당 되었고

.data           0x20000000     0x2850 load address 0x0800a680
                0x20000000                . = ALIGN (0x4)
                0x20000000                _sdata = .
 *(.data)
 *(.data*)
 .data.uwTickFreq
                0x20000000        0x1 Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.o
                0x20000000                uwTickFreq
 *fill*         0x20000001        0x3 
 .data.uwTickPrio
                0x20000004        0x4 Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.o
                0x20000004                uwTickPrio
 .data.MemPara  0x20000008       0x52 Src\main.o
                0x20000008                MemPara
 *fill*         0x2000005a        0x2 
 .data.adc_read
                0x2000005c       0x10 Src\main.o
                0x2000005c                adc_read
 .data.max_hall_sensor_value
 

0으로 초기화한 변수는 .bss로 할당 되었다.

.bss            0x20002850      0x368 load address 0x0800ced0
                0x20002850                _sbss = .
                0x20002850                __bss_start__ = _sbss
 *(.bss)
 .bss           0x20002850       0x1c c:/program files (x86)/atollic/truestudio for stm32 9.3.0/armtools/bin/../lib/gcc/arm-atollic-eabi/6.3.1/armv7-m/crtbegin.o
 *(.bss*)
 .bss.TM1638_FND
                0x2000286c        0x4 Src\main.o
                0x2000286c                TM1638_FND
 .bss.TM1638_LED
                0x20002870        0x4 Src\main.o
                0x20002870                TM1638_LED
 .bss.adc_flag  0x20002874        0x4 Src\main.o
                0x20002874                adc_flag
 

 

'ST > 개발 환경 및 구조' 카테고리의 다른 글

STM32 CubeMX LL driver  (0) 2025.03.18
STM32 Driver(Library)  (0) 2025.03.18
Linker Script(1) - Segment  (0) 2025.03.17
ST 개발 보드 소개(2) - 32F746GDISCOVERY  (0) 2025.03.17
ST 개발 보드 소개(1) - STM32duino(Blue Pill)  (0) 2025.03.17

 

MCU
STM32F103VCT(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
Linker Script 구조 분석

 

- Compile

C 코드를 기계어로 만드는 작업을 Compile이라고 하고, 이 작업에 Compiler라는 프로그램이 필요

 

- Linker

main.c와 control.c 소스를 컴파일을 하면 오브젝트 파일이 생성되고, 이 오브젝트 파일을 하나의 바이너리로 만듦

 

아래는 Compile 과정을 그림으로 그려 보았다.

source code
main.c
control.c
compiling
object code
main.o
control.o
Linking
excutable
*.hex(*.bin)

 

- 그러면 이걸 꼭 알아야 하나?

MCU에 RAM을 추가로 붙이려면?

제조사 제공 Bootloader를 사용하지 않고 내가 작성하려면?

Linker Script를 건드려야 한다.

 

여기서는 Segment를 먼저 설명하고 Linker Script에 대해서 설명 하도록 하겠다.

 

- 세그먼트

메모리 관리 방식의 하나로, 프로그램이나 데이터를 세그멘트 또는 섹션이라는 가변 크기로 관리하는 방법

data segment

stack ↓
동적 세그먼트
high address
...

heap ↑

bss
정적 세그먼트


data

code segment
text
low address

 

1. text

- 작성한 코드가 들어감

- Read Only

 

2. data

- 초기화 된 데이터(런타임 전에 초기화)

- 전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장

- Read Write

 

3. bss(Block Stated Symbol)

- 초기화 되지 않은 데이터(런타임 이후 초기화)

 

4. heap

- 프로그래머가 동적으로 사용하는 영역

- malloc, free 또는 new, delete 에 의하여 할당, 또는 반환되는 영역

 

5. stack

- 지역변수, 매개변수, 복귀 번지 등이 저장되어 있는 프로그램이 자동으로 사용하는 임시 메모리

- 함수 호출 시 생성되고, 함수 종료시 반환

- Last In First Out

- Stack 세그먼트는 상위 영역부터 할당(다른 세그먼트는 하위부터 할당)

 

 

• STM32F746NGH6 Arm® Cortex® core-based microcontroller with 1 Mbyte of Flash memory and 340 Kbytes of RAM, in BGA216 package

• 4.3” RGB 480×272 color LCD-TFT with capacitive touch screen

• Ethernet compliant with IEEE-802.3-2002

• USB OTG HS

• USB OTG FS

• SAI audio codec

• Two ST-MEMS digital microphones

• 128-Mbit Quad-SPI Flash memory

• 128-Mbit SDRAM (64 Mbits accessible)

• Two user and reset push-buttons

• Board connectors:

– Camera

– microSD™ card

– RF-EEPROM daughterboard connector

– 2×USB with Micro-AB

– Ethernet RJ45

– SPDIF RCA input connector

– Audio line in and line out jack

– Stereo speaker outputs

– ARDUINO® Uno V3 expansion connectors

+ Recent posts