中级会员
 
- 积分
- 408
- 金钱
- 408
- 注册时间
- 2014-3-9
- 在线时间
- 103 小时
|

楼主 |
发表于 2017-11-2 14:30:58
|
显示全部楼层
本帖最后由 huang_liquan 于 2017-11-6 18:18 编辑
搞清楚了,gnu对printf的底层实现跟keil是不同的,所以不能直接用原子的那套方式来重定向接口,
gnu99可以在编译参数里面加入
--specs=nano.specs
--specs=nosys.specs
两个选项
重定向部分需要改写一下
gnu下是_write函数实现的,需要改写这个函数 而fputc函数就不用管了
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 0
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定向fputc函数
//printf的输出,指向fputc,由fputc输出到串口
//这里使用串口1(USART1)输出printf信息
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//等待上一次串口数据发送完成
USART1->DR = (u8) ch; //写DR,串口1将发送数据
return ch;
}
#endif //重定向代码如下
int _write (int fd, char *pBuffer, int size)
{
for (int i = 0; i < size; i++)
{
while((USART1->SR&0X40)==0);//等待上一次串口数据发送完成
USART1->DR = (u8) pBuffer; //写DR,串口1将发送数据
}
return size;
}
更新一下源码
用linux或mac OS开发的小伙伴们可以浪起来了
stm32_lcd.zip
(1.02 MB, 下载次数: 478)
|
|