GCC的startup文件和keil的是完全不一样的,并且GCC需要自己指定链接脚本
这两个文件可以通过STM32CUBEMX获取,选择使用的芯片之后,点到project manager选项卡,文件夹什么的随便设置一下,Toolchain/IDE选择Makefile,可以从生成的起始代码里拿到startup和.ld文件
另一个问题是printf,GCC中使用的stdio,printf的实现和keil的microlib不一样,需要重写的是_write函数
int _write (int fd, char *pBuffer, int size)
{
for (int i = 0; i < size; i++)
{
while((USART1->SR&0X40)==0); //等待上一次串口数据发送完成
USART1->DR = (uint8_t) pBuffer[i]; //写DR,串口1将发送数据
}
return size;
}
// ————————————————
// 版权声明:本文为CSDN博主「tony++」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
// 原文链接:https://blog.csdn.net/weixin_43522787/article/details/121951457
// 虽然CSDN上也都是抄来抄去的,姑且还是给个来源
另外,gcc的printf默认是有带缓冲的,也就是说,默认情况下如果没有输入换行或者flush或者buffer满,printf不会马上打出来,可以在初始化串口的时候配置缓冲区为0
setvbuf(stdout, NULL, _IONBF, 0);
// 作者:科G栈 https://www.bilibili.com/read/cv11118506/ 出处:bilibili
这样在调用printf时就会即时打出去了