当前上下文中没有符号 'GPIOA'
No symbol 'GPIOA' in current context
我正在尝试使用 OpenOCD 和 GDB(作为可视调试界面通过 VSCode 启动)调试我的 STM32F446RE Nucleo 板,但我无法使用 print
.[=25= 访问变量]
这是我的 main.c
#include "../architecture/CMSIS/inc/stm32f4xx.h"
#include "system_stm32f4xx.h"
#define WAIT(x) for (int i = 0; i < (x); i++)
inline static void init_led2();
int main() {
init_led2(); // setup led3
while (1) {
#define INDEX 5
GPIOA->BSRR = 1 << INDEX; // set led2 output
WAIT(0x1FFFF); // wait for awhile
GPIOA->BSRR = 1 << INDEX << 16; // reset led3 output
WAIT(0x1FFFF);
#undef INDEX
}
return 0;
}
// led3 is connected to GPIO pin PB3
inline void init_led2() {
#define MASK 3 // 2bit mask
#define INDEX 5 // index of the port
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // enable GPIOA clock
// set the mode to general purpose output
GPIOA->MODER &= ~(MASK << (INDEX * 2)); // clear bit field
GPIOA->MODER |= 1 << (INDEX * 2);
// set output mode to push-pull
GPIOA->OTYPER &= ~(1 << (INDEX));
// set low speed
GPIOA->OSPEEDR &= ~(MASK << (INDEX * 2));
// no pull up/down resistors
GPIOA->PUPDR &= ~(MASK << (INDEX * 2));
#undef MASK
#undef INDEX
}
我有两个断点,一个在
GPIOA->BSRR = 1 << INDEX; // set led2 output
另一个位于:
GPIOA->BSRR = 1 << INDEX << 16; // reset led3 output
我的代码运行良好(LED 闪烁正常),我可以成功进入这个主循环并在这些点停止。
我正在尝试使用 print GPIOA->ODR
为我的 LED 打印输出寄存器以查看它,但每当我这样做时,我都会收到错误消息:
No symbol 'GPIOA->ODR' in current context
即使我已经在主循环内部中断,并且每当我点击继续时都可以看到 LED 正在打开和关闭。
无论我输入什么,都会出现同样的错误:
No symbol 'GPIOA' in current context
No symbol 'GPIOA->BSRR' in current context
No symbol 'GPIOA->MODER' in current context
GPIOA->ODR
是 GPIOA
结构指向的字段 ODR
的解引用,它应该是存储在地址 0x40020014
的值。如果我在调试控制台中输入 x 0x40020014
window 来查看注册它实际上 returns 很好,我什至可以看到它在每个断点上切换。
为什么 print
不能工作,为什么它不能识别 GPIOA
或其任何成员 variables/addresses?
像 GPIOA
这样的 STM32 外设是使用预处理器宏链定义的——例如:
#define PERIPH_BASE ((uint32_t)0x40000000)
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000)
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
预处理器宏在调试器中不可见——它只知道为编译器定义的对象(变量、函数、结构、等)。 您可以通过将 -g3
添加到您的编译器标志来解决此问题;或者,您可以展开宏 "manually":
print ((GPIO_TypeDef *) 0x40020000)->ODR
我正在尝试使用 OpenOCD 和 GDB(作为可视调试界面通过 VSCode 启动)调试我的 STM32F446RE Nucleo 板,但我无法使用 print
.[=25= 访问变量]
这是我的 main.c
#include "../architecture/CMSIS/inc/stm32f4xx.h"
#include "system_stm32f4xx.h"
#define WAIT(x) for (int i = 0; i < (x); i++)
inline static void init_led2();
int main() {
init_led2(); // setup led3
while (1) {
#define INDEX 5
GPIOA->BSRR = 1 << INDEX; // set led2 output
WAIT(0x1FFFF); // wait for awhile
GPIOA->BSRR = 1 << INDEX << 16; // reset led3 output
WAIT(0x1FFFF);
#undef INDEX
}
return 0;
}
// led3 is connected to GPIO pin PB3
inline void init_led2() {
#define MASK 3 // 2bit mask
#define INDEX 5 // index of the port
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // enable GPIOA clock
// set the mode to general purpose output
GPIOA->MODER &= ~(MASK << (INDEX * 2)); // clear bit field
GPIOA->MODER |= 1 << (INDEX * 2);
// set output mode to push-pull
GPIOA->OTYPER &= ~(1 << (INDEX));
// set low speed
GPIOA->OSPEEDR &= ~(MASK << (INDEX * 2));
// no pull up/down resistors
GPIOA->PUPDR &= ~(MASK << (INDEX * 2));
#undef MASK
#undef INDEX
}
我有两个断点,一个在
GPIOA->BSRR = 1 << INDEX; // set led2 output
另一个位于:
GPIOA->BSRR = 1 << INDEX << 16; // reset led3 output
我的代码运行良好(LED 闪烁正常),我可以成功进入这个主循环并在这些点停止。
我正在尝试使用 print GPIOA->ODR
为我的 LED 打印输出寄存器以查看它,但每当我这样做时,我都会收到错误消息:
No symbol 'GPIOA->ODR' in current context
即使我已经在主循环内部中断,并且每当我点击继续时都可以看到 LED 正在打开和关闭。
无论我输入什么,都会出现同样的错误:
No symbol 'GPIOA' in current context
No symbol 'GPIOA->BSRR' in current context
No symbol 'GPIOA->MODER' in current context
GPIOA->ODR
是 GPIOA
结构指向的字段 ODR
的解引用,它应该是存储在地址 0x40020014
的值。如果我在调试控制台中输入 x 0x40020014
window 来查看注册它实际上 returns 很好,我什至可以看到它在每个断点上切换。
为什么 print
不能工作,为什么它不能识别 GPIOA
或其任何成员 variables/addresses?
像 GPIOA
这样的 STM32 外设是使用预处理器宏链定义的——例如:
#define PERIPH_BASE ((uint32_t)0x40000000)
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000)
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
预处理器宏在调试器中不可见——它只知道为编译器定义的对象(变量、函数、结构、等)。 您可以通过将 -g3
添加到您的编译器标志来解决此问题;或者,您可以展开宏 "manually":
print ((GPIO_TypeDef *) 0x40020000)->ODR