当前上下文中没有符号'GPIOA'

时间:2017-12-12 17:10:54

标签: arm gdb stm32 openocd

我正在尝试使用OpenOCD和GDB(通过VSCode作为可视化调试接口启动)调试我的STM32F446RE Nucleo板,并且我无法使用print访问变量。

这是我的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->ODRODR结构指向的字段GPIOA的derefence,它应该是存储在地址0x40020014中的值。如果我在调试控制台窗口中键入x 0x40020014来查看该寄存器,它实际上返回正常,我甚至可以看到它在每个断点上切换。

为什么print不会工作?为什么它不能识别GPIOA或其任何成员变量/地址?

1 个答案:

答案 0 :(得分:0)

使用预处理器宏链定义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来解决此问题;或者,您可以手动扩展宏&#34;:

print ((GPIO_TypeDef *) 0x40020000)->ODR