SCB_Type CPACR 寄存器解析 ---fpu

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
相关推荐
学嵌入式的小杨同学2 天前
STM32 进阶封神之路(二十二):DMA 实战全攻略 ——ADC 采集 + 串口收发 + 内存复制(库函数 + 代码落地)
c++·stm32·单片机·嵌入式硬件·mcu·硬件架构·pcb
学嵌入式的小杨同学2 天前
STM32 进阶封神之路(二十一):DMA 深度解析 —— 从直接内存访问到无 CPU 干预数据传输(底层原理 + 寄存器配置)
stm32·单片机·嵌入式硬件·mcu·硬件架构·硬件工程·智能硬件
学嵌入式的小杨同学2 天前
STM32 进阶封神之路(十九):ADC 深度解析 —— 从模拟信号到数字转换(底层原理 + 寄存器配置)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
jianqiang.xue3 天前
ESP32-P4 看门狗复位全解析:HP_SYS_HP_WDT_RESET 故障排查实战
单片机·mcu·esp32·idf
woshihonghonga3 天前
解决Eclipse的Copilot终端依赖问题
stm32·mcu·eclipse·copilot·ai编程
嵌入式老菜鸟qq1252427734 天前
关于S2-LP休眠
单片机·嵌入式硬件·mcu·射频工程
学嵌入式的小杨同学4 天前
STM32 进阶封神之路(十八):RTC 实战全攻略 —— 时间设置 + 秒中断 + 串口更新 + 闹钟功能(库函数 + 代码落地)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
学嵌入式的小杨同学4 天前
STM32 进阶封神之路(十七):RTC 实时时钟深度解析 —— 从时钟源到寄存器配置(底层原理 + 面试重点)
c++·stm32·单片机·嵌入式硬件·mcu·硬件架构·pcb
EVERSPIN5 天前
32位MCU副屏方案
mcu·32位mcu
学嵌入式的小杨同学5 天前
STM32 进阶封神之路(十五):DHT11 单总线实战 —— 温湿度检测从时序解析到代码落地(库函数 + 寄存器)
vscode·stm32·单片机·嵌入式硬件·mcu·智能硬件·pcb工艺