背景知识:
串口的基本知识已经在上一篇讲过了。这里重点讲解如何在MDK4.22下使用printf函数,这样的话就可以很方便的打印调试信息,追踪。
这个知识来源于MDK自带的帮助手册。有现成的代码提供。
实现方式有2种,使用标准C库下裁剪合适的函数,使用微库C下裁剪合适的函数。
微库下的情况,在魔术棒那里要勾选上使用微库。然后需要定义如下结构和改写如下函数--FILE stdout fputc ferror。
标准库的情况,也是需要关注FILE stdout fputc ferror。注意网上很多文章说,在标准库下,需要关掉半主机模式,我尝试过,关掉后,需要定义_sys_exit函数,可以达到效果,但是如果不关掉半主机模式,和微库一样也只定义该定义的,也可以达到效果。不知道,是不是MDK版本升级后,已经统一了两种模式。
具体代码:
uart.c
#include "S3C2440.h"
#include "uart.h"
void init_uart0(void)
{
rULCON0 = 0x03;
rUCON0 = (0x05);
//15---12 11-10 9 8 7 6 5 4 3-2 1-0
//not pclk/n pclk Tpulse Rpulse timeout disable rx error int disable loop dis break dis int or poll int or poll
rUFCON0 = 0x00;
rUMCON0 = 0x0;
rUBRDIV0 = UART_BRDIV;
}
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
int fputc(int ch, FILE *f)
{
WrUTXH0_L(ch);
/* Loop until the end of transmission */
while(!(rUTRSTAT0 & TXD0READY)) ;
return ch;
}
int ferror(FILE *f) {
/* Your implementation of ferror */
return EOF;
}
main.c
#include "S3C2440.h"
#include "uart.h"
#include
int main(void)
{
init_uart0();
printf("hello world\r\n");
}
最终可以在UART0上打印hello world,这样以后程序就可以拿来复用了!
关键字:S3C2440 MDK4.22 printf 串口打印
引用地址:
S3C2440在MDK4.22下使用printf向串口打印调试
推荐阅读最新更新时间:2024-03-16 14:56
有限状态机的嵌入式Linux按键驱动设计
0 引言 一般的按键驱动程序通常非常简单。在程序中一旦检测到按键输入口为低电平时,就采用软件延时10 ms后再次检测按键输入口。如果仍然是低电平则表示有按键按下,便转入执行按键处理程序;否则,当按键输入口为高电平,就会放弃本次按键的检测,重新开始一次按键检测过程。这种方式不仅由于采用了软件延时而使得MCU的效率降低,同时也不容易同系统中其他功能模块协调工作,且系统的实时性也差。本文把单个按键作为一个简单的系统,根据状态机的原理对其动作的操作和确认的过程进行分析,并用状态图表示出来,然后根据状态图编写出按键接口程序。 1 基于状态机的简单按键驱动设计 在一个嵌入式系统中,按键的操作是随机的。为了提高CPU的工作效
[单片机]
STM32 HAL库 printf输出重定向
STM32 HAL库串口输出函数为 HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xFFFF) #ifdef __GNUC__ /* With GCC, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif
[单片机]
S3C2440 块设备驱动程序的编写驱动之用内存模拟硬盘(二十一)
参考内核自带的块设备驱动程序: drivers/block/xd.c drivers/block/z2ram.c 1、本节需要的结构体如下: 1.1 gendisk磁盘结构体: struct gendisk { int major; //设备主设备号,等于register_blkdev()函数里的major int first_minor; //起始次设备号,等于0,则表示此设备号从0开始 int minors; //分区(次设备)数量,当使用alloc_disk()时,就会自动设备该成员 char disk_name ;//块设备名称,等于register_blkdev()函数里的name st
[单片机]
ARM时钟体系(S3C2440)
先看S3C2440的时钟发生模块的框图 从左上开始看,可以看出时钟源有两种分别为 :晶振(通过OSC进入)、外部时钟。 通过设置OM3、OM2的引脚可以设置OM 的状态,来选择时钟源。具体如何设置如下图。 继续看框图,通过OM的时钟源进入PLL锁相环,通过设置MPLLCON里的P、M、S 的值,可以设置PLL的输出频率(MPLL)。 MPLL直接提供给FCLK, FCLK经过时钟分频控制(CLKDIVN)寄存器,通过HDIVN分频给HCLK,通过PDIVN分频给PCLK。 再看一下启动过程: 以外部时钟源为晶振为例,具体过程为: 1 上电,先复位。 2 FCLK根据OM 的值, FCLK=晶振。 3 等待晶振发
[单片机]
MSP430 CCS printf_suppor
在CCS新建工程后默认是 printf_support=minimal 然后弄一个printf,sprintf就会编译报错 Description Resource Path Location Type #2631 Conversion f not allowed in printf_support=minimal mode hello.c /app line 189 C/C++ Problem 需在要Properties- Build- MSP430 Complier- summary of flags set中修改 printf_support=full 编译就可以了
[单片机]
S3C2440裸机实战 之一 创建初始工程
好几年没玩S3C2440,从单片机玩到嵌入式,就记得这个是我入门嵌入式比较早的一款芯片。 S3C2440是带MMU的,可以上WinCE/Linux这些操作系统,适合做嵌入式开发,做单片机开发的话,总感觉有点浪费,但如果只是玩玩应该没问题。 最近业余时间想把S3C2440拿来当单片机玩玩。 废话少说,直接入主题。 第一步当然是创建初始工程。 既然是裸机实战,想玩点什么特色,看来汇编是不能少的了。ARM9汇编支持的好一点的当然是MDK,IAR的汇编语法和ARM官方的有一些区别,还是算了。 gcc 语法和ARM官方是差不多,不过编译出来的代码质量比不过MDK。这里就选用MDK5.1 单片机的helloworl
[单片机]
uboot-2011.12移植到S3C2440(序三)—— Makefile之参考文献
参考文献: 《韦东山——嵌入式Linux应用开发完全手册》第15章 uboot之start.s分析 DENX的u-boot是一个狠庞大的系统,研究透彻u-boot的Make的运作同样是一个狠庞大的工程,目前我仅参考以上两个参考文档对S3C2440的u-boot的编译的Make相关的文件和命令做一个简单说明。如果深入学习《嵌入式Linux应用开发完全手册》是一个很好的指引。 一般针对S3C2440的移植都是参照smdk2410来的,所以在smdk2410的目录,拷贝一个做为smdk2440; 另外,编译后,可以直接查找*.o文件查看已编译选项; 读Makefile可以发现u-boot.lds的用途。 start.S是整个uboo
[单片机]
ARM9处理器S3C2440的GPS导航终端机的设计
0 引言 随着汽车等各种车辆交通工具的普及,车辆导航设备的需求也变得日益旺盛。作为车载设备.不仅要有可靠的性能,而且需要具有便携、低功耗和低价格等特点。而采用基于ARM微处理器的嵌入式系统与GPS模块相配合的GPS导航终端机的设计方案,可以很好的满足这一系统需求。为此,本文介绍了一种利用ARM9开发板和GPS模块实现GPS导航功能的终端机的软硬件结构和设计方法。 1 GPS导航系统结构 本文所介绍的GPS全球定位导航系统按功能可分为嵌入式主控模块、GPS模块、显示模块、扩展模块及供电模块等五大部分。 嵌入式主控模块基于S3C2440处理器,主要负责对GPS导航模块数据的响应、处理和控制。在硬件上,主控模块就
[汽车电子]