如题,我现在头很大,用户手册跟天书一样,根本看不懂,看不懂,看不懂,看不懂(纯属我不想看)😭
根据日志,目前来说,固件还没执行出启动文件和system_apm32f00x.c的范围,这个外设应该怎么回应固件的操作?(现在没回应导致固件100%起飞✈️)
(启动文件我没改,system_apm32f00x具体看图片)
外设现在只实现了RCM和Flash的寄存器,其它都没写具体见压缩包
实话实说,我不是搞不懂,只是人写的有点崩溃,就是想找活人唠两句话🥺
成功读取固件,大小:7096 字节。
初始 SP 设置为: 0x20001000
初始 PC 设置为: 0x80015b9
--- 注册外设驱动 ---
- 注册成功: GPIO @ 0x40000000
- 注册成功: CMU (RCM) @ 0x40010000
- 注册成功: FMC (Flash Memory Controller) @ 0x40011000
--- Hook 设置成功: 正在监视内存读写和代码执行 ---
--- ✅ HardFault 向量重定向成功: 0x0C -> 0x20000401 (SRAM Handler) ---
--- 启动模拟执行 ---
模拟结束地址设置为: 0x8008000
>>> 🚨 外设读写监视:
PC地址: 0x080011ee
操作地址: 0x40010000
值: 0x00000001
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_ICC (内部时钟控制) (Offset: 0x00) ---
新值: 0x00000001
> **位域 0: HIRCEN (内部高速时钟使能)** (写入值: 1) -> 1: 打开内部高速时钟
> **位域 1: HIRCRF (HIRC 准备就绪标志)** (写入值: 0) -> 0: HIRC 未准备就绪
> **位域 2: FWFLHEN (快速唤醒使能)** (写入值: 0) -> 0: 禁止快速唤醒
> **位域 3: LIRCEN (内部低速振荡器使能)** (写入值: 0) -> 0: 关闭 LIRC
> **位域 4: LIRCRF (LIRC 准备就绪标志)** (写入值: 0) -> 0: LIRC 未准备就绪
> **位域 5: RPOEN (电压调节器电源关闭使能)** (写入值: 0) -> 0: 在 Active-halt 模式下打开电压调节器
[CMU W: 0x00] 写入 RCM_ICC (内部时钟控制) 寄存器: 0x00000001
>>> 🚨 外设读写监视:
PC地址: 0x080011f2
操作地址: 0x40010004
值: 0x00000000
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_ECC (外部时钟控制) (Offset: 0x04) ---
新值: 0x00000000
> **位域 0: HXTEN (外部高速振荡器使能)** (写入值: 0) -> 0: 关闭 HXT
> **位域 1: HXTRF (HXT 准备就绪标志)** (写入值: 0) -> 0: HXT 未准备就绪
[CMU W: 0x04] 写入 RCM_ECC (外部时钟控制) 寄存器: 0x00000000
>>> 🚨 外设读写监视:
PC地址: 0x080011f6
操作地址: 0x40010010
值: 0x000000e1
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_MCC (主时钟配置) (Offset: 0x10) ---
新值: 0x000000e1
> **位域 0-7: MCC (主时钟配置)** (写入值: 225) -> 0XE1: 配置 HIRC 是主时钟源
[CMU W: 0x10] 写入 RCM_MCC (主时钟配置) 寄存器: 0x000000e1
>>> 🚨 外设读写监视:
PC地址: 0x080011f8
操作地址: 0x40010014
值: 0x00000000
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_CSC (时钟切换控制) (Offset: 0x14) ---
新值: 0x00000000
> **位域 0: CSBF (时钟切换忙标志)** (写入值: 0) -> 0: 未进行时钟切换
> **位域 1: CSEN (Clock Switch Enable)** (写入值: 0) -> 0: 禁止时钟切换
> **位域 2: CSIE (Clock Switch Interrupt Enable)** (写入值: 0) -> 0: 禁止时钟切换中断
> **位域 3: CSIF (Clock Switch Interrupt Flag)** (写入值: 0) -> 0: (手动CSEN=0) 目标时钟还未稳定 / (自动CSEN=1) 没有发生时钟切换事件
[CMU W: 0x14] 写入 RCM_CSC (时钟切换控制) 寄存器: 0x00000000
>>> 🚨 外设读写监视:
PC地址: 0x080011fc
操作地址: 0x40010018
值: 0x00000018
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_CLKDIV (时钟预分频) (Offset: 0x18) ---
新值: 0x00000018
> **位域 0-2: CPUDIV (CPU Clock Divider Factor)** (写入值: 0) -> 000: / 2
> **位域 3-4: HIRCDIV (HIRC Clock Divider Factor)** (写入值: 3) -> 11: / 8
> **位域 5: HDS (HIRC Divider Set)** (写入值: 0) -> 0: HIRC/3
[CMU W: 0x18] 写入 RCM_CLKDIV (时钟预分频) 寄存器: 0x00000018
>>> 🚨 外设读写监视:
PC地址: 0x08001200
操作地址: 0x4001001c
值: 0x000000ff
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_APBEN1 (APB 时钟使能 1) (Offset: 0x1c) ---
新值: 0x000000ff
> **位域 0: I2CCEN (I2C Clock Enable)** (写入值: 1) -> 1: 使能 I2C 时钟
> **位域 1: SPICEN (SPI Clock Enable)** (写入值: 1) -> 1: 使能 SPI 时钟
> **位域 3: USART1CEN (USART1 Clock Enable)** (写入值: 1) -> 1: 使能 USART1 时钟
> **位域 4: TMR4CEN (TMR4 Clock Enable)** (写入值: 1) -> 1: 使能 TMR4 时钟
> **位域 5: TMR2CEN (TMR2 Clock Enable)** (写入值: 1) -> 1: 使能 TMR2 时钟
> **位域 7: TMR1CEN (TMR1 Clock Enable)** (写入值: 1) -> 1: 使能 TMR1 时钟
[CMU W: 0x1c] 写入 RCM_APBEN1 (APB时钟使能1) 寄存器: 0x000000ff
>>> 🚨 外设读写监视:
PC地址: 0x08001202
操作地址: 0x40010028
值: 0x000000ff
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_APBEN2 (APB 时钟使能 2) (Offset: 0x28) ---
新值: 0x000000ff
> **位域 2: WUPTCEN (Wakeup TMR Clock Enable)** (写入值: 1) -> 1: 使能唤醒定时器时钟
> **位域 3: ADCCEN (ADC Clock Enable)** (写入值: 1) -> 1: 使能 ADC 时钟
[CMU W: 0x28] 写入 RCM_APBEN2 (APB时钟使能2) 寄存器: 0x000000ff
>>> 🚨 外设读写监视:
PC地址: 0x08001204
操作地址: 0x4001003c
值: 0x000000ff
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_APBEN3 (APB 时钟使能 3) (Offset: 0x3c) ---
新值: 0x000000ff
> **位域 0: TMR1ACEN (TMR1A Clock Enable)** (写入值: 1) -> 1: 使能 TMR1A 时钟
> **位域 1: USART2CEN (USART2 Clock Enable)** (写入值: 1) -> 1: 使能 USART2 时钟
> **位域 2: USART3CEN (USART3 Clock Enable)** (写入值: 1) -> 1: 使能 USART3 时钟
[CMU W: 0x3c] 写入 RCM_APBEN3 (APB时钟使能3) 寄存器: 0x000000ff
>>> 🚨 外设读写监视:
PC地址: 0x08001206
操作地址: 0x40010020
值: 0x00000000
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_CSS (时钟保护系统) (Offset: 0x20) ---
新值: 0x00000000
> **位域 0: CSSEN (Clock Security System Enable)** (写入值: 0) -> 0: 禁止 CSS
> **位域 1: BCEN (Backup Clock Enable)** (写入值: 0) -> 0: 禁止备用时钟
> **位域 2: CSSFDIE (CSS Fault Detect Interrupt Enable)** (写入值: 0) -> 0: 禁止 CSS 故障检测中断
> **位域 3: CSSFDIF (CSS Fault Detect Interrupt Flag)** (写入值: 0) -> 0: 未检测到 HXT 时钟故障
[CMU W: 0x20] 写入 RCM_CSS (时钟保护系统) 寄存器: 0x00000000
>>> 🚨 外设读写监视:
PC地址: 0x08001208
操作地址: 0x40010024
值: 0x00000000
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_COC (时钟输出控制) (Offset: 0x24) ---
新值: 0x00000000
> **位域 0: COEN (Clock Output Enable)** (写入值: 0) -> 0: 禁止
> **位域 1-4: COS (Clock Output Select)** (写入值: 0) -> 0000: fHIRCDIV
> **位域 5: CORF (Clock Output Ready Flag)** (写入值: 0) -> 0: 时钟输出已经准备就绪
> **位域 6: COBF (Clock Output Busy Flag)** (写入值: 0) -> 0: 时钟输出所选时钟源空闲
[CMU W: 0x24] 写入 RCM_COC (时钟输出控制) 寄存器: 0x00000000
>>> 🚨 外设读写监视:
PC地址: 0x0800120c
操作地址: 0x40010024
值: 0x00000000
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
[CMU R: 0x24] 读取 RCM_COC (时钟输出控制) 寄存器: 0x00000000
>>> 🚨 外设读写监视:
PC地址: 0x08001216
操作地址: 0x40010024
值: 0x00000000
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_COC (时钟输出控制) (Offset: 0x24) ---
新值: 0x00000000
> **位域 0: COEN (Clock Output Enable)** (写入值: 0) -> 0: 禁止
> **位域 1-4: COS (Clock Output Select)** (写入值: 0) -> 0000: fHIRCDIV
> **位域 5: CORF (Clock Output Ready Flag)** (写入值: 0) -> 0: 时钟输出已经准备就绪
> **位域 6: COBF (Clock Output Busy Flag)** (写入值: 0) -> 0: 时钟输出所选时钟源空闲
[CMU W: 0x24] 写入 RCM_COC (时钟输出控制) 寄存器: 0x00000000
>>> 🚨 外设读写监视:
PC地址: 0x08001218
操作地址: 0x40010030
值: 0x00000000
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_HIRCTRIM (HIRC 调整) (Offset: 0x30) ---
新值: 0x00000000
> **位域 0-3: TRIM (HIRC 调整值)** (写入值: 0)
[CMU W: 0x30] 写入 RCM_HIRCTRIM (内部高速时钟调整) 寄存器: 0x00000000
>>> 🚨 外设读写监视:
PC地址: 0x080011a6
操作地址: 0x40011000
值: 0x00000000
数据大小: 4 字节
✅ 交由设备驱动处理: **FMC (Flash Memory Controller)** (Base: 0x40011000)
[Flash R: 0x00] 读取 FLASH_CTRL1 (控制寄存器1): 0x00000030
>>> 🚨 外设读写监视:
PC地址: 0x080011ac
操作地址: 0x40011000
值: 0x00000010
数据大小: 4 字节
✅ 交由设备驱动处理: **FMC (Flash Memory Controller)** (Base: 0x40011000)
--- 写入寄存器: FLASH_CTRL1 (控制寄存器1) (Offset: 0x00) ---
新值: 0x00000010
> **位域 0-2: LATENCY (等待状态配置)** (写入值: 0) -> 000:0个等待周期,系统时钟 ≤ 24MHz
> **位域 3: HCAEN (使能半周期访问)** (写入值: 0) -> 0:禁止
> **位域 4: PBEN (使能预取缓存区)** (写入值: 1) -> 1:使能
> **位域 5: PBSF (预取缓存区状态标志)** (写入值: 0) -> 0:处于关闭状态
[Flash W: 0x00] 写入 FLASH_CTRL1 (控制寄存器1): 0x00000010
>>> 🚨 外设读写监视:
PC地址: 0x080011ae
操作地址: 0x40011000
值: 0x00000000
数据大小: 4 字节
✅ 交由设备驱动处理: **FMC (Flash Memory Controller)** (Base: 0x40011000)
[Flash R: 0x00] 读取 FLASH_CTRL1 (控制寄存器1): 0x00000010
>>> 🚨 外设读写监视:
PC地址: 0x080011b8
操作地址: 0x40011000
值: 0x00000011
数据大小: 4 字节
✅ 交由设备驱动处理: **FMC (Flash Memory Controller)** (Base: 0x40011000)
--- 写入寄存器: FLASH_CTRL1 (控制寄存器1) (Offset: 0x00) ---
新值: 0x00000011
> **位域 0-2: LATENCY (等待状态配置)** (写入值: 1) -> 001:1个等待周期,24MHz < 系统时钟 ≤ 48MHz
> **位域 3: HCAEN (使能半周期访问)** (写入值: 0) -> 0:禁止
> **位域 4: PBEN (使能预取缓存区)** (写入值: 1) -> 1:使能
> **位域 5: PBSF (预取缓存区状态标志)** (写入值: 0) -> 0:处于关闭状态
[Flash W: 0x00] 写入 FLASH_CTRL1 (控制寄存器1): 0x00000011
>>> 🚨 外设读写监视:
PC地址: 0x080011bc
操作地址: 0x40010018
值: 0x00000000
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
[CMU R: 0x18] 读取 RCM_CLKDIV (时钟预分频) 寄存器: 0x00000018
>>> 🚨 外设读写监视:
PC地址: 0x080011c2
操作地址: 0x40010018
值: 0x00000018
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_CLKDIV (时钟预分频) (Offset: 0x18) ---
新值: 0x00000018
> **位域 0-2: CPUDIV (CPU Clock Divider Factor)** (写入值: 0) -> 000: / 2
> **位域 3-4: HIRCDIV (HIRC Clock Divider Factor)** (写入值: 3) -> 11: / 8
> **位域 5: HDS (HIRC Divider Set)** (写入值: 0) -> 0: HIRC/3
[CMU W: 0x18] 写入 RCM_CLKDIV (时钟预分频) 寄存器: 0x00000018
>>> 🚨 外设读写监视:
PC地址: 0x080011c4
操作地址: 0x40010018
值: 0x00000000
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
[CMU R: 0x18] 读取 RCM_CLKDIV (时钟预分频) 寄存器: 0x00000018
>>> 🚨 外设读写监视:
PC地址: 0x080011ca
操作地址: 0x40010018
值: 0x00000038
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_CLKDIV (时钟预分频) (Offset: 0x18) ---
新值: 0x00000038
> **位域 0-2: CPUDIV (CPU Clock Divider Factor)** (写入值: 0) -> 000: / 2
> **位域 3-4: HIRCDIV (HIRC Clock Divider Factor)** (写入值: 3) -> 11: / 8
> **位域 5: HDS (HIRC Divider Set)** (写入值: 1) -> 1: HIRC
[CMU W: 0x18] 写入 RCM_CLKDIV (时钟预分频) 寄存器: 0x00000038
>>> 🚨 外设读写监视:
PC地址: 0x080011cc
操作地址: 0x40010018
值: 0x00000000
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
[CMU R: 0x18] 读取 RCM_CLKDIV (时钟预分频) 寄存器: 0x00000038
>>> 🚨 外设读写监视:
PC地址: 0x080011d2
操作地址: 0x40010018
值: 0x00000020
数据大小: 4 字节
✅ 交由设备驱动处理: **CMU (RCM)** (Base: 0x40010000)
--- 写入寄存器: RCM_CLKDIV (时钟预分频) (Offset: 0x18) ---
新值: 0x00000020
> **位域 0-2: CPUDIV (CPU Clock Divider Factor)** (写入值: 0) -> 000: / 2
> **位域 3-4: HIRCDIV (HIRC Clock Divider Factor)** (写入值: 0) -> 00: / 1
> **位域 5: HDS (HIRC Divider Set)** (写入值: 1) -> 1: HIRC
[CMU W: 0x18] 写入 RCM_CLKDIV (时钟预分频) 寄存器: 0x00000020
>>> ❌ 致命错误: 尝试访问未映射内存!
PC地址: 0x24000
>>> ❌ 模拟执行失败!
PC地址: 0x00024000 (终止点)
LR地址: 0x08001833 (返回地址)
SP地址: 0x20000ff0
错误码: 8 (Invalid memory fetch (UC_ERR_FETCH_UNMAPPED))
