首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Keil MDK 中利用串口及c标准库函数printf为cortex-m3做调试输出(lpc1788)

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功能
继承事业,薪火相传
返回列表