训练日志 keil5在线仿真遇到问题,找到博客
[https://blog.csdn.net/he__yuan/article/details]
查找参数值:

没有项目名称
解决办法:魔术棒Debug中,自行添加路径中的ini文件,之后重新编译再进入debug模式。

如何看结构体参数:
跟踪结构体参数

查看PB0对应的寄存器地址
找到GPIOB的输入数据寄存器(GPIOB_IDR)或输出数据寄存器(GPIOB_ODR)的地址。
例如,STM32F1系列中,GPIOB_IDR的地址为 0x40010C08(不同型号地址可能不同)。


最后小知识:不同GPIO端口(如PA0和PB0)的输入/输出数据寄存器地址是不同的
在STM32系列微控制器中,不同GPIO端口(如PA0和PB0)的输入/输出数据寄存器地址是不同的,不会相同。以下是详细解释:
1. 寄存器地址分配规则
STM32的GPIO端口(如GPIOA、GPIOB等)采用基地址+偏移量的方式分配寄存器地址。
- 基地址:每个GPIO端口有一个独立基地址。
- 例如(以STM32F1为例):
- GPIOA基地址:
0x40010800 - GPIOB基地址:
0x40010C00
- GPIOA基地址:
- 例如(以STM32F1为例):
- 偏移量:每个寄存器的偏移量在端口内固定。
- 输入数据寄存器(IDR)偏移量:
0x08 - 输出数据寄存器(ODR)偏移量:
0x0C
- 输入数据寄存器(IDR)偏移量:
因此:
- GPIOA_IDR地址 =
0x40010800 + 0x08=0x40010808 - GPIOB_IDR地址 =
0x40010C00 + 0x08=0x40010C08 - GPIOA_ODR地址 =
0x40010800 + 0x0C=0x4001080C - GPIOB_ODR地址 =
0x40010C00 + 0x0C=0x40010C0C
结论:PA0和PB0对应的寄存器地址完全不同。
2. 可能误解的原因
若观察到地址“相同”,可能是以下情况导致混淆:
- 代码或工具显示简写:
- 某些调试工具可能仅显示偏移量(如
0x08),而非完整地址。需确认是否显示的是完整地址。
- 某些调试工具可能仅显示偏移量(如
- 芯片手册查阅错误:
- 不同芯片型号(如STM32F1/F4/H7)的地址可能差异较大,需核对具体型号的参考手册。
- 寄存器别名或位操作:
- 部分库函数(如HAL库)通过位操作访问寄存器,可能让人误以为地址相同,例如:
虽然代码写法相似,但实际操作的地址不同。GPIOA->ODR |= 0x01; // 操作GPIOA的ODR寄存器 GPIOB->ODR |= 0x01; // 操作GPIOB的ODR寄存器
- 部分库函数(如HAL库)通过位操作访问寄存器,可能让人误以为地址相同,例如:
3. 验证方法
(1) 直接查看芯片手册
- 在芯片参考手册的Memory Map或GPIO章节中,明确列出所有寄存器的基地址和偏移量。
(2) 使用调试工具查看实际地址
- 在Keil的Memory窗口中直接输入地址:
- 输入
0x40010808查看PA0的输入值(GPIOA_IDR)。 - 输入
0x40010C08查看PB0的输入值(GPIOB_IDR)。
- 输入
(3) 编写测试代码
// 打印寄存器地址
printf("GPIOA_IDR地址: 0x%08X\n", &GPIOA->IDR);
printf("GPIOB_IDR地址: 0x%08X\n", &GPIOB->IDR);
4. 注意事项
- 芯片型号差异:不同系列(如STM32F1/F4/H7)的GPIO基地址可能不同,需以实际型号手册为准。
- 外设寄存器独立性:每个GPIO端口的寄存器组完全独立,不会共享地址。
总结
PA0和PB0的输入/输出寄存器地址绝对不同。若发现地址“相同”,需检查是否混淆了偏移量与完整地址,或查阅了错误的芯片手册。




被折叠的 条评论
为什么被折叠?



