Keil MDK 中利用串口及c标准库函数printf为cortex-m3做调试输出(lpc1788)
- UID
- 1029342
- 性别
- 男
|
Keil MDK 中利用串口及c标准库函数printf为cortex-m3做调试输出(lpc1788)
Reload 重装上阵
Keil MDK 中利用串口及c标准库函数printf为cortex-m3做调试输出(lpc1788) 摘要: c标准库的printf是输出给显示器的,将printf函数进行修改,使其输出重定向至串口,就能实现目的。printf函数调用fputc函数完成实质输出单一字符的工作,因此将fputc函数修改使之完成串口单字符发送工作即可。
注: 本文方法性内容主要来自《Keil MDK环境下使用printf函数的解决方法》与《STM32串口使用Printf()函数问题》。除使用c标准库外,还可以使用keil mdk提供的microLib,在STM32串口使用Printf()函数问题》一文有介绍,另外,该文同时也提到如果使用c标准库函数,则要避免链接使用半主机模式的函数,retarge.c文件中的#pragma import(__use_no_semihosting_swi) 和_sys_exit函数实现就是来确保不链接半主机模式函数的。
实现步骤: 1. keil MDK已经为我们提供了这样的接口文件:
文件位置:C:\Keil\ARM\Startup,(C:\Keil\为我的keil安装根目录)
文件名:Retarget.c
文件内容:
[url=][/url]
/******************************************************************************//* RETARGET.C: 'Retarget' layer for target-dependent low level functions *//******************************************************************************//* This file is part of the uVision/ARM development tools. *//* Copyright (c) 2005 Keil Software. All rights reserved. *//* This software may only be used under the terms of a valid, current, *//* end user licence from KEIL for a compatible version of KEIL software *//* development tools. Nothing else gives you the right to use this software. *//******************************************************************************/#include <stdio.h>#include <time.h>#include <rt_misc.h>#pragma import(__use_no_semihosting_swi)extern int sendchar(int ch); /* in Serial.c */extern int getkey(void); /* in Serial.c */extern long timeval; /* in Time.c */struct __FILE { int handle; /* Add whatever you need here */ };FILE __stdout;FILE __stdin;int fputc(int ch, FILE *f) { return (sendchar(ch));}int fgetc(FILE *f) { return (sendchar(getkey()));}int ferror(FILE *f) { /* Your implementation of ferror */ return EOF;}void _ttywrch(int ch) { sendchar (ch);}void _sys_exit(int return_code) { while (1); /* endless loop */}[url=][/url]
因此我们的工作就是:
(1)将Retarget.c文件加入自己的工程
(2)提供Serial.c文件,在该文件中实现sendchar和getkey()
sendchar即为串口发送单字符函数。
2. Serial.c文件实现(lpc1788芯片)
这里使用lpc1788的uart 0口实现rs232功能 |
|
|
|
|
|