STM32 CubeMX / GNU / Eclipse-Toolchain Retargeting(newlib和libgloss)

时间:2015-12-03 07:58:38

标签: c stm32 newlib gnu-arm

我使用Eclipse CDT 4.5.1(Mars),ARM GCC 4.9 2015q3,Liviu Ionescu的GnuArmEclipse-Plugin,OpenOCD 0.9.0和STM32CubeMX 4.11.0为STM32F401C发现板建立了一个基于Windows的工具链。

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

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

在libgloss中,_write函数有一个弱符号,所以它应该足以重新实现它。我在main.c中做到了这一点:

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会闪烁,但只有主要功能内的切换命令才会显示效果。

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

1 个答案:

答案 0 :(得分:0)

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