STM32 CubeMX/GNU/Eclipse-Toolchain 重定向(newlib 和 libgloss)
STM32 CubeMX/GNU/Eclipse-Toolchain Retargeting (newlib and libgloss)
我使用 Eclipse CDT 4.5.1 (Mars)、ARM GCC 4.9 2015q3、Liviu Ionescu 的 GnuArmEclipse-Plugin 为 STM32F401C 探索板设置了一个基于 Windows 的工具链, OpenOCD 0.9.0 和 STM32CubeMX 4.11.0.
所以基本上,我使用 STM32CubeMX 生成了一个 SW4STM32 项目,将所有内容导入到一个新的 Cross ARM GCC Eclipse C 项目中并调整了一些参数,即符号、CPU 类型、FPU 和 link 文件.一个简单的 LED blink 示例已成功构建并可由 OpenOCD 执行,断点也有效。
为了提供 newlib 或 newlib nano 所需的系统调用,例如 _sbrk
和 _write
,我从 --specs=nosys.specs
linker 选项开始。这样动态内存分配工作得很好。但是,我想自己实现 _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 灯亮 link,但只有主函数中的切换命令显示了效果。
为什么我的写函数没有被调用?我错过了什么吗?
您必须将缓冲区显式刷新到输出 (fflush(stdout)
) 或发送换行符 ('\n'
)。
我使用 Eclipse CDT 4.5.1 (Mars)、ARM GCC 4.9 2015q3、Liviu Ionescu 的 GnuArmEclipse-Plugin 为 STM32F401C 探索板设置了一个基于 Windows 的工具链, OpenOCD 0.9.0 和 STM32CubeMX 4.11.0.
所以基本上,我使用 STM32CubeMX 生成了一个 SW4STM32 项目,将所有内容导入到一个新的 Cross ARM GCC Eclipse C 项目中并调整了一些参数,即符号、CPU 类型、FPU 和 link 文件.一个简单的 LED blink 示例已成功构建并可由 OpenOCD 执行,断点也有效。
为了提供 newlib 或 newlib nano 所需的系统调用,例如 _sbrk
和 _write
,我从 --specs=nosys.specs
linker 选项开始。这样动态内存分配工作得很好。但是,我想自己实现 _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 灯亮 link,但只有主函数中的切换命令显示了效果。
为什么我的写函数没有被调用?我错过了什么吗?
您必须将缓冲区显式刷新到输出 (fflush(stdout)
) 或发送换行符 ('\n'
)。