owned this note
owned this note
Published
Linked with GitHub
---
title: ARM Cortex-M4
description:
tags: ARM, 底層
lang: zh_tw
---
# ARM Cortex-M4
[TOC]
## 前言
本篇為學習 ARM Cortex-M4 的筆記
在 reverse arm 架構的程式的過程中
若我遇到不懂的,就會去查並記錄在此
## On reset
在重置時, Cortex M3、M4 會
- 從位址 0x00000000 取出 MSP (Main Stack Point) 的初始值
- 從位址 0x00000004 取出 PC (Program Counter) 的初始值
- LSB 會 load 進 EPSR T-bit, reset 時需為 1
* Ref:
* 註 [1] 章節 2.1.3, 第 2-4 頁
* 註 [2] 第 1 頁
## Processor mode and privilege levels for software execution
在[註1](https://static.docs.arm.com/dui0553/a/DUI0553A_cortex_m4_dgug.pdf)的章節 2.1.1
- **Processor modes**
- **Thread mode**
程式執行會在此 mode
- **Handler mode**
handle exceptions 時會在此 mode
- **Privilege levels**
- **Unprivileged**
- 指令 **MSR**, **MRS** 用法有限制
- 指令 **CPS** 不能使用
- 不能存取 **system timer**, **NVIC**, **system control block**
- 存取 Memory, 周邊設備時可能會被限制
- **Privileged**
所有指令, 設備皆能使用
在 Thread mode 時, Register **CONTROL** 決定了 Privilege level
在 Handler mode 時, Privilege level 都是 Privileged
Privileged 程式能在 Thread mode 時修改 Register CONTROL
Unprivileged 程式需要透過指令 **SVC** 才能修改 Register CONTROL
## Stack
每 push 一次, stack pointer 就**扣**一次
有兩種 stack, 各有不同的 register 記錄著, 分別為
- main stack
- process stack
在 Thread mode 時, Register CONTROL 決定使用哪個 stack
在 Handler mode 時, 使用 main stack
## Core registers

| Register | APCS name | APCS role |
|---|---|---|
r0 | a1 | argument 1/scratch register/result
r1 | a2 | argument 2/scratch register/result
r2 | a3 | argument 3/scratch register/result
r3 | a4 | argument 4/scratch register/result
r4 | v1 | register variable
r5 | v2 | register variable
r6 | v3 | register variable
r7 | v4 | register variable
r8 | v5 | register variable
r9 | sb/v6 | static base/register variable
r10 | sl/v7 | stack limit/stack chunk handle/register variable
r11 | fp/v8 | frame pointer/register variable
r12 | ip | scratch register/new -sb in inter-link-unit calls
r13 | sp | lower end of the current stack frame
r14 | lr | link register/scratch register
r15 | pc | program counter
- **R0 ~ R12**
一般暫存器
- **Stack Pointer**
在 Thread mode, CONTROL bit[1]
- 為 0: SP 為 Main Stack Pointer (MSP)
- 為 1: SP 為 Process Stack Pointer (PSP)
**reset 時, 處理器會 load address 0x00000000 的值進 MSP**
- **Link Register**
call function 時存放 return address
**reset 時, 處理器會將 0xFFFFFFFF 放進 MSP**
- **Program Counter**
記錄下一次 CPU 要執行哪邊的指令
**reset 時, 處理器會 load address 0x00000004 的值進 MSP**
bit[0] 會被 load 到 EPSR T-bit, **一定要是 1**
- **Program Status Register**
PSR 為 32 bits 的 Register
其中的某些 bits 又被分成是
- Application PSR (APSR)
- Interrupt PSR (IPSR)
- Execution PSR (EPSR)

若要存取以上暫存器, 需用指令 **MSR**, **MRS**, 並將暫存器名稱作為參數
- e.g.
- MRS, PSR // 讀取 PSR
- MSR, APSR_nzcvq // 寫入 APSR N, Z, C, V, Q
若要一次存取 APSR, IPSR, EPSR 中任兩個 Register
有其他的代名詞

- **APSR**
儲存 condition flags

- **IPSR**
> The IPSR contains the exception type number of the current Interrupt Service Routine (ISR)
>

- **EPSR**
Cortex-M4 執行指令時, T-bit 需要為 1, 否則導致 fault 或 lockup
- **Exception mask registers**
TBD
- **CONTROL regiser**
TBD
## Parameter Passing

## Reference
1. [Cortex-M4 規格書](https://static.docs.arm.com/dui0553/a/DUI0553A_cortex_m4_dgug.pdf)
2. [stm32-prog.pdf](http://wiki.csie.ncku.edu.tw/embedded/Lab19/stm32-prog.pdf)