c
typedef struct
{
__IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */
__IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */
__IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */
__IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */
__IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */
__IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */
__IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */
__IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */
__IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */
__IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */
__IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */
__IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */
__IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */
__IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */
__IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */
__IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */
__IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */
__IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */
__IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */
uint32_t RESERVED0[5U];
__IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */
} SCB_Type;
CPACR
协处理器相关寄存器
关键位域详解
位域 名称 宽度 功能
CP11, CP10 协处理器 11 和 10 控制 各2位 控制浮点单元 (FPU) 访问
CPacr[9:0] 协处理器 0-9 控制 10×2位 控制其他协处理器
访问权限编码(每2位)
值 含义 说明
00 拒绝访问 任何访问都会产生 UsageFault
01 特权访问 只有特权模式可以访问
10 保留 不要使用
11 完全访问 特权和非特权模式都可以访问
m4核支持单精度。
c
// 对于 Cortex-M4/M7/M33 带 FPU 的芯片
#include <stdint.h>
#define SCB_CPACR (*((volatile uint32_t *)0xE000ED88))
// 启用 FPU
void enable_fpu(void) {
// 设置 CP10 和 CP11 为完全访问 (0b11)
SCB_CPACR |= (0xF << 20); // 设置 CP10=11, CP11=11
// 或者更清晰的写法:
// SCB_CPACR |= (3UL << 20) | (3UL << 22);
// 确保指令同步
__DSB();
__ISB();
}
编译器参数
c
# GCC 编译器选项
# Cortex-M4 (单精度 FPU)
CFLAGS = -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard
# Cortex-M7 (双精度 FPU)
CFLAGS = -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard
# Cortex-M7 (仅单精度)
CFLAGS = -mcpu=cortex-m7 -mfpu=fpv5-sp-d16 -mfloat-abi=hard
# 无 FPU (软件浮点)
CFLAGS = -mcpu=cortex-m4 -mfloat-abi=soft