遇到问题
今天用STM32CubeMX生成了代码,使用printf函数后单片机程序运行异常,查出是STM32CubeMX生成的代码没有printf的重定向,百度查了两个方法后两个都行不通,最后参考正点原子例程解决。
参考
正确参考:正点原子例程SYSTEM文件夹下的usart.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23//加入以下代码,支持printf函数,而不需要选择use MicroLIB
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
注意事项
- 要注意重定向的函数名是
int __io_putchar(int ch)
还是int fputc(int ch, FILE *f)
1 |
|
CubeMX生成的代码没有勾选Use MicroLib,可能需要勾选,可以看Keil中的USE MicroLib说明,MicroLib不支持操作系统函数。
Unix系统里,每行结尾只有“<换行>”,即”\n”;
Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”;
Mac系统里,每行结尾是“<回车>”,即”\r”;