S3c2410裸板程序入门---串口

流水灯跑起来了,是不是有点小兴奋,一鼓作气再来玩玩其他的,用PC机写程序,出了问题可以用perror等打印出信息,给调试带来了很大方便,可是板子上没有显示屏,没法打印怎么办?这次就写一个通过串口向PC机串口调试终端打印信息的小程序,方便以后的调试。串口通信的基本知识就不说了哈,网上很多的,直接上代码:

uart.c

 1 #include "s3c2410.h"
 2 
 3 void uart_sendchar(char a)
 4 {
 5     if(a == '\n'){
 6         while( !(UTRSTAT0 & (0x1<<2)) );
 7         UTXH0 = '\r';
 8     }
 9     while( !(UTRSTAT0 & (0x1<<2)) );
10     UTXH0 = a;
11 }
12 
13 void sendstring(const char *str)
14 {
15     while(*str){
16         uart_sendchar(*str);
17         str++;
18     }
19 }
20 
21 void uart_init()
22 {
23     GPHCON = (GPHCON & ~(0xf<<4)) | (0xa<<4);
24 
25     ULCON0 = 0x3;
26     UCON0 = 0x5;
27 
28     UBRDIV0 = (int)(PCLK/(115200*16)) - 1;
29 
30 }

GPHCON配置使用串口0, ULCON0 = 0X3配置串口使用8位数据位,一位停止位,无校验,UCON0 = 0X5设置传输模式,默认时钟使用PCLK。UTXH0为发送buffer, 往其中写数据后发送,UTRSTAT0检测数据线上有无数据,从而控制在一个字符发送完成后再发下一个。

还有注意\n的处理,因为windows的回车是\r\n,所以有单独的判断。

哦,你可能会问这个s3c2410.h在哪里,哦,这个其实是板子带的,就是定义了一堆寄存器地址,完全也可以自己定义。向这种格式:

s3c2410.h

 1 /* WOTCH DOG register */

 

 2 #define     WTCON       (*(volatile unsigned long *)0x53000000)

 

 3 #define     WTDAT       (*(volatile unsigned long *)0x53000004)

 

 4 #define     WTCNT       (*(volatile unsigned long *)0x53000008)

 

 5 

39 /*UART registers*/

 

40 #define ULCON0      (*(volatile unsigned long *)0x50000000)

 

41 #define UCON0       (*(volatile unsigned long *)0x50000004)

 

42 #define UFCON0      (*(volatile unsigned long *)0x50000008)

 

43 #define UMCON0      (*(volatile unsigned long *)0x5000000c)

 

44 #define UTRSTAT0    (*(volatile unsigned long *)0x50000010)

 

45 #define UTXH0       (*(volatile unsigned char *)0x50000020)

 

46 #define URXH0       (*(volatile unsigned char *)0x50000024)

 

47 #define UBRDIV0     (*(volatile unsigned long *)0x50000028)

 

48 

 

49 

 

50 /*interrupt registes*/

 

51 #define SRCPND      (*(volatile unsigned long *)0x4A000000)

 

52 #define INTMOD      (*(volatile unsigned long *)0x4A000004)

 

53 #define INTMSK      (*(volatile unsigned long *)0x4A000008)

 

54 #define PRIORITY        (*(volatile unsigned long *)0x4A00000c)

 

55 #define INTPND      (*(volatile unsigned long *)0x4A000010)

 

56 #define INTOFFSET       (*(volatile unsigned long *)0x4A000014)

 

57 #define SUBSRCPND       (*(volatile unsigned long *)0x4A000018)

 

58 #define INTSUBMSK       (*(volatile unsigned long *)0x4A00001c)

 

59 

 

60 /*external interrupt registers*/

 

61 #define EINTMASK        (*(volatile unsigned long *)0x560000a4)

 

62 #define EINTPEND        (*(volatile unsigned long *)0x560000a8)

 

63 

 

64 #define EXTINT2     (*(volatile unsigned long *)0x56000090)

 

65 

 

66 /*clock registers*/

 

67 #define LOCKTIME        (*(volatile unsigned long *)0x4c000000)

 

68 #define MPLLCON     (*(volatile unsigned long *)0x4c000004)

 

69 #define UPLLCON     (*(volatile unsigned long *)0x4c000008)

 

70 #define CLKCON      (*(volatile unsigned long *)0x4c00000c)

 

71 #define CLKSLOW     (*(volatile unsigned long *)0x4c000010)

 

72 #define CLKDIVN     (*(volatile unsigned long *)0x4c000014)

 

73 

 

74 

 

75 /*PWM & Timer registers*/

 

76 #define TCFG0       (*(volatile unsigned long *)0x51000000)

 

77 #define TCFG1       (*(volatile unsigned long *)0x51000004)

 

78 #define TCON        (*(volatile unsigned long *)0x51000008)

 

79 #define TCNTB0      (*(volatile unsigned long *)0x5100000c)

 

80 #define TCMPB0      (*(volatile unsigned long *)0x51000010)

 

81 #define TCNTO0      (*(volatile unsigned long *)0x51000014)

 

82 /* frequecy */

^M

83 #define FCLK        (202800000)

 

84 #define HCLK        (FCLK/2)

 

85 #define PCLK        (FCLK/4)

注意要用volatile 和 unsigned 来保证优化和移位不会处差错。

转载于:https://www.cnblogs.com/liujiahi/archive/2011/09/11/2196354.html

linuxdriver_code_tool |-- 03 | `-- 2.6内核升级工具 | |-- device-mapper-1.00.19-2.i386.rpm | |-- lvm2-2.00.25-1.01.i386.rpm | |-- mkinitrd-4.2.0.3.tar.tar | |-- module-init-tools-3.2.2.tar.bz2 | `-- modutils-2.4.5-1.src.rpm |-- 04 | |-- 内核模块参范例 | | `-- book.c | |-- 内核模块导出符号 | | `-- export_symb.c | `-- 最简单的内核模块 | `-- hello.c |-- 05 | `-- udev源代码 | `-- udev-114.tar.gz |-- 06 | |-- globalmem驱动 | | `-- globalmem.c | `-- 包含2个globalmem设备的驱动 | `-- globalmem_two.c |-- 07 | `-- 含并发控制的globalmem驱动 | `-- globalmem_lock.c |-- 08 | |-- globalfifo驱动 | | `-- globalfifo.c | `-- poll应用程序范例 | `-- pollmonitor.c |-- 09 | |-- 异步通知应用程序范例 | | `-- asyncmonitor.c | `-- 支持异步通知的globalfifo | `-- globalfifo_async.c |-- 10 | |-- S3C2410实时钟驱动 | | `-- s3c2410-rtc.c | `-- 秒设备驱动与应用程序 | |-- second.c | `-- second_test.c |-- 11 | |-- DMA范例 | | |-- 3c505.c | | |-- 3c505.h | | `-- dma.h | `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd.c |-- 14 | |-- S3C2410串口驱动 | | |-- regs-gpio.h | | |-- regs-serial.h | | `-- s3c2410.c | `-- 串口核心层 | |-- serial_core.c | `-- serial_core.h |-- 15 | |-- S3C2410 I2C主机驱动 | | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA工具及库 | | |-- alsa-driver-1.0.15.tar.bz2 | | |-- alsa-firmware-1.0.15.tar.bz2 | | |-- alsa-lib-1.0.15.tar.bz2 | | |-- alsa-oss-1.0.15.tar.bz2 | | |-- alsa-tools-1.0.15.tar.bz2 | | |-- alsa-utils-1.0.13.tar.bz2 | | `-- pyalsa-1.0.15.tar.bz2 | |-- ALSA驱动范例 | | |-- sa11xx-uda1341.c | | `-- uda1341.h | |-- ALSA应用程序范例 | | |-- pcm.c | | `-- pcm_min.c | |-- OSS驱动范例 | | `-- s3c2410-uda1341.c | `-- OSS应用程序范例 | |-- mixer.c | `-- sound.c |-- 18 | |-- FRAMEBUFFER应用程序范例 | | `-- fb_display | | |-- fb_display.c | | |-- fb_display.h | | |-- Makefile | | |-- README | | `-- test.c | `-- S3C2410 LCD驱动 | |-- s3c2410fb.c | `-- s3c2410fb.h |-- 19 | |-- busybox源代码 | | `-- busybox-1.2.1.tar.bz2 | |-- MTD工具 | | `-- mtd-utils-1.0.0.tar.gz | |-- nand驱动范例 | | `-- s3c2410.c | |-- nor驱动范例 | | `-- s3c2410nor.c | `-- yaffs&yaffs2源代码 | |-- yaffs.tar.gz | `-- yaffs2.tar.gz |-- 20 | |-- USB串口驱动 | | |-- usb-serial.c | | `-- usb-serial.h | |-- USB工具 | | `-- usbview-1.0.tar.tar | |-- USB骨架程序 | | `-- usb-skeleton.c | |-- USB键盘驱动 | | |-- input.h | | |-- usb_input.h | | `-- usbkbd.c | `-- usb主机控制器驱动范例 | |-- ohci-s3c2410.c | `-- usb-control.h |-- 21 | |-- PCI骨架程序 | | `-- pci-skeleton.c | `-- PCI驱动范例 | `-- i810_audio.c `-- 22 |-- 范例代码 | |-- oops范例 | | |-- oops_example.asm | | `-- oops_example.c | `-- proc范例 | `-- sim_proc.c `-- 内核调试工具 |-- ddd-3.3.11.tar.gz |-- gdbmod-2.4.bz2 |-- kdb-v4.4-2.6.15-rc5-common-1.bz2 |-- kdb-v4.4-2.6.15-rc5-common-2.bz2 |-- kdb-v4.4-2.6.15-rc5-i386-1.bz2 `-- linux-2.6.15.5-kgdb-2.4.tar.tar 73 directories, 91 files
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值