专栏中心

EEPW首页 > 专栏 > Keil MDK环境下使用printf函数的解决方法

Keil MDK环境下使用printf函数的解决方法

发布人:yancey小波 时间:2012-12-01 来源:工程师 发布文章

printf()函数可以直接向窗口格式化输出,给我们调试程序带来很大的方便,然而在Keil MDK环境下直接使用printf()函数就会陷入软件中断,导致死循环的产生;因而不能进入main()函数。

单步调试程序时会发现程序指针一直在 SWI_Handler     B       SWI_Handler 打转;

解决方法:

工程选择NXP的LPC21XX器件。

1.首先在Keil安装目录下面ARM——Startup找到Retarget.c文件将其复制到你的工程文件夹下面;并将其加入到工程中;

2. 在Keil安装目录下面ARM——Examples——Hello找到Serial.c文件将其复制到你的工程文件夹下面;并将其加入到工程中;

3.Serial.c代码如下:

/******************************************************************************/
/* SERIAL.C: Low Level Serial Routines                                        */
/******************************************************************************/
/* This file is part of the uVision/ARM development tools.                    */
/* Copyright (c) 2005-2006 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 <LPC21xx.H>                     /* LPC21xx definitions               */

#define CR     0x0D


void init_serial (void)  {               /* Initialize Serial Interface       */
  PINSEL0 = 0x00050000;                  /* Enable RxD1 and TxD1              */
  U1LCR = 0x83;                          /* 8 bits, no Parity, 1 Stop bit     */
  U1DLL = 97;                            /* 9600 Baud Rate @ 15MHz VPB Clock  */
  U1LCR = 0x03;                          /* DLAB = 0                          */
}


/* implementation of putchar (also used by printf function to output data)    */
int sendchar (int ch)  {                 /* Write character to Serial Port    */

  if (ch == '\n')  {
    while (!(U1LSR & 0x20));
    U1THR = CR;                          /* output CR */
  }
  while (!(U1LSR & 0x20));
  return (U1THR = ch);
}


int getkey (void)  {                     /* Read character from Serial Port   */

  while (!(U1LSR & 0x01));

  return (U1RBR);
}

4.在头文件中加入#include<stdio.h>。

5.在使用printf函数之前对串口进行初始化;可以直接使用Serial.c中的 init_serial ()函数对串口初始化。

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

上海移动携手诺基亚贝尔和高通首次在F1中国大奖赛期间完成基于毫米波的多类型终端直播创新试点

Valve 的下一代 VR 头显工程机规格泄露:高通骁龙 8 Gen 3 芯片

公司将参展“2006秋季全国高教仪器设备展示会”

供车载设备使用的ESD保护二极管

高通骁龙 8s 至尊版芯片曝光:安兔兔跑分逼近 200 万

通快霍廷格电子携前沿等离子体电源解决方案亮相SEMICON China 2025

第四届飞思卡尔智能车北京科技大学激光车(特等奖)

视频 2010-02-01

在SoC设计中采用多核和RISC-V架构

Arm的Cortex-R内核加强了对汽车级芯片控制

汽车电子 2025-03-24

免费卫星短信背后的高昂成本

通过多种方式改进电梯和自动扶梯设计

iPhone 18首发!苹果A20芯片基于台积电2nm制造:良率远超预期

小米 15 Ultra 手机明日在韩上市,实体店上半年登陆首尔

第四届飞思卡尔智能车 北科天津学院视频资料

视频 2010-02-01

第四届飞思卡尔智能车 北科视频资料

视频 2010-02-01

公司将参加2006第七届广州国际安防展览会

第四届飞思卡尔智能车 成都信息工程学院

视频 2010-02-01

第四届飞思卡尔智能车 天津科技大学

视频 2010-02-01
更多 培训课堂
更多 焦点
更多 视频

技术专区