keil写代码太难受了,换万能的Visual Stdio吧!
因为之前一直是照着正点原子的案例来重写printf函数来实现串口输出,一直没有找到原因,最近终于成功了。
**原因:**正点原子给的案例都是在keil中编译的,使用的编译器是armcc编译器,printf函数底层是由fputc实现的。而VSGDB中的编译器是gcc,printf函数是由_write函数实现的,这时候再重定向是毫无卵用的。
**修改方法:**我之前再fputc函数中加入改变led的代码毫无变化,当时就认为我写的fputc函数并没有被调用,但一直没有找到原因。今日找到了一位老哥在论坛的评论(改写_write函数),修改代码如下:
#if 0
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);
USART1->DR = (u8) ch;
return ch;
}
#else
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while ((USART1->SR & 0X40) == 0);
USART1->DR = (u8)ch;
return ch;
}
int _write(int fd, char *pBuffer, int size)
{
for (int i = 0; i < size; ++i)
{
while ((USART1->SR & 0X40) == 0);
USART1->DR = (u8)*(pBuffer + i);
}
return size;
}
#endif
注意USART1->DR = (u8)*(pBuffer + i)这一句,这样写才是正确的,链接中的打印出来会乱码!!! 结果: 喜大普奔,成了!!!
|