我使用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'
)。