c-STM32 CubeMX/GNU/Eclipse工具链重定目标(newlib和libgloss)



我使用Eclipse CDT 4.5.1(Mars)、ARM GCC 4.9 2015q3、Liviu Ionescu的GnuArmEclipse插件、OpenOCD 0.9.0和STM32CubeMX 4.11.0为STM32F401C探索板建立了一个基于Windows的工具链。

因此,基本上,我使用STM32CubeMX生成了一个SW4STM32项目,将所有内容导入到一个新的跨ARM GCC Eclipse C项目中,并调整了一些参数,即符号、CPU类型、FPU和链接文件。一个简单的LED闪烁示例已经成功构建,并且可以通过OpenOCD执行,断点也可以工作。

为了提供newlib或newlib nano所需的系统调用,例如_sbrk_write,我从--specs=nosys.specs链接器选项开始。这样动态内存分配就可以正常工作。然而,我想自己实现_write功能,以便打印到显示器或通过UART发送数据。

在libgloss中,_write函数有一个弱符号,所以重新实现它就足够了

int _write (int fd, char *ptr, int len)
{
  HAL_GPIO_TogglePin(LD5_GPIO_Port, LD5_Pin);
  HAL_Delay(300);
  return len;
}
int main(void)
{
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* Configure the system clock */
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  HAL_GPIO_TogglePin(LD5_GPIO_Port, LD5_Pin);
  printf("Blink");
  while(1)
  {
    // do nothing
  }
}

我本以为LED会闪烁,但只有主功能中的切换命令本身显示出效果。

为什么没有调用我的写函数?我错过什么了吗?

必须将缓冲区显式刷新到输出(fflush(stdout))或发送换行符('n')。

最新更新