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

Posted

技术标签:

【中文标题】STM32 CubeMX/GNU/Eclipse-Toolchain Retargeting(newlib 和 libgloss)【英文标题】:STM32 CubeMX/GNU/Eclipse-Toolchain Retargeting (newlib and libgloss) 【发布时间】:2016-03-07 17:56:36 【问题描述】:

我使用 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 会闪烁,但只有 main 函数本身中的切换命令显示效果。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

那是缺失的部分!谢谢。

以上是关于STM32 CubeMX/GNU/Eclipse-Toolchain Retargeting(newlib 和 libgloss)的主要内容,如果未能解决你的问题,请参考以下文章

stm32系列单片机都有哪些外设接口模块

stm32f407H库和stm32f103H库有区别吗

让STM32CubeMX带你飞,菜鸟秒变STM32高手

stm32+lwip:使用STM32CubeMX生成项目

stm32开发板有啥用

Stm32启动文件选择