实验八--uart

一。环境

  系统:ubuntu12.04

  开发板:jz2440

  编译器:gcc

二。说明

有空补上

三。代码

head.S

 1 @******************************************************************************
 2 @ File:head.S
 3 @ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
 4 @******************************************************************************
 5
 6 .extern     main
 7 .text
 8 .global _start
 9 _start:
10 Reset:
11     ldr sp, =4096           @ 设置栈指针,以下都是C函数,调用前需要设好栈
12     bl  disable_watch_dog   @ 关闭WATCHDOG,否则CPU会不断重启
13     bl  clock_init          @ 设置MPLL,改变FCLK、HCLK、PCLK
14
15     ldr pc, =on_sdram                   @ 跳到SDRAM中继续执行
16 on_sdram:
17     ldr sp, =0x34000000     @ 设置栈指针
18     ldr lr, =halt_loop      @ 设置返回地址
19     ldr pc, =main           @ 调用main函数
20 halt_loop:
21     b   halt_loop

Makefile

 1 objs := head.o init.o serial.o main.o
 2
 3 uart.bin: $(objs)
 4     arm-linux-ld -Ttext 0x00000000 -o uart_elf $^
 5     arm-linux-objcopy -O binary -S uart_elf [email protected]
 6     arm-linux-objdump -D -m arm uart_elf > uart.dis
 7
 8 %.o:%.c
 9     arm-linux-gcc -Wall -O2 -c -o [email protected] $<
10
11 %.o:%.S
12     arm-linux-gcc -Wall -O2 -c -o [email protected] $<
13
14 clean:
15     rm -f uart.bin uart_elf uart.dis *.o
16     

init.c

 1 /*
 2  * init.c: 进行一些初始化
 3  */
 4
 5 #include "s3c24xx.h"
 6
 7 void disable_watch_dog(void);
 8 void clock_init(void);
 9
10
11 /*
12  * 关闭WATCHDOG,否则CPU会不断重启
13  */
14 void disable_watch_dog(void)
15 {
16     WTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可
17 }
18
19 #define S3C2410_MPLL_200MHZ     ((0x5c<<12)|(0x04<<4)|(0x00))
20 #define S3C2440_MPLL_200MHZ     ((0x5c<<12)|(0x01<<4)|(0x02))
21 /*
22  * 对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV
23  * 有如下计算公式:
24  *  S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s)
25  *  S3C2410: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)
26  *  其中: m = MDIV + 8, p = PDIV + 2, s = SDIV
27  * 对于本开发板,Fin = 12MHz
28  * 设置CLKDIVN,令分频比为:FCLK:HCLK:PCLK=1:2:4,
29  * FCLK=200MHz,HCLK=100MHz,PCLK=50MHz
30  */
31 void clock_init(void)
32 {
33     // LOCKTIME = 0x00ffffff;   // 使用默认值即可
34     CLKDIVN  = 0x03;            // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
35
36     /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
37 __asm__(
38     "mrc    p15, 0, r1, c1, c0, 0\n"        /* 读出控制寄存器 */
39     "orr    r1, r1, #0xc0000000\n"          /* 设置为“asynchronous bus mode” */
40     "mcr    p15, 0, r1, c1, c0, 0\n"        /* 写入控制寄存器 */
41     );
42
43     /* 判断是S3C2410还是S3C2440 */
44     if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))
45     {
46         MPLLCON = S3C2410_MPLL_200MHZ;  /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
47     }
48     else
49     {
50         MPLLCON = S3C2440_MPLL_200MHZ;  /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
51     }
52 }

serial.c

 1 #include "s3c24xx.h"
 2 #include "serial.h"
 3
 4 #define TXD0READY   (1<<2)
 5 #define RXD0READY   (1)
 6
 7 #define PCLK            50000000    // init.c中的clock_init函数设置PCLK为50MHz
 8 #define UART_CLK        PCLK        //  UART0的时钟源设为PCLK
 9 #define UART_BAUD_RATE  115200      // 波特率
10 #define UART_BRD        ((UART_CLK  / (UART_BAUD_RATE * 16)) - 1)
11
12 /*
13  * 初始化UART0
14  * 115200,8N1,无流控
15  */
16 void uart0_init(void)
17 {
18     GPHCON  |= 0xa0;    // GPH2,GPH3用作TXD0,RXD0
19     GPHUP   = 0x0c;     // GPH2,GPH3内部上拉
20
21     ULCON0  = 0x03;     // 8N1(8个数据位,无较验,1个停止位)
22     UCON0   = 0x05;     // 查询方式,UART时钟源为PCLK
23     UFCON0  = 0x00;     // 不使用FIFO
24     UMCON0  = 0x00;     // 不使用流控
25     UBRDIV0 = UART_BRD; // 波特率为115200
26 }
27
28 /*
29  * 发送一个字符
30  */
31 void putc(unsigned char c)
32 {
33     /* 等待,直到发送缓冲区中的数据已经全部发送出去 */
34     while (!(UTRSTAT0 & TXD0READY));
35
36     /* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
37     UTXH0 = c;
38 }
39
40 /*
41  * 接收字符
42  */
43 unsigned char getc(void)
44 {
45     /* 等待,直到接收缓冲区中的有数据 */
46     while (!(UTRSTAT0 & RXD0READY));
47
48     /* 直接读取URXH0寄存器,即可获得接收到的数据 */
49     return URXH0;
50 }
51
52 /*
53  * 判断一个字符是否数字
54  */
55 int isDigit(unsigned char c)
56 {
57     if (c >= ‘0‘ && c <= ‘9‘)
58         return 1;
59     else
60         return 0;
61 }
62
63 /*
64  * 判断一个字符是否英文字母
65  */
66 int isLetter(unsigned char c)
67 {
68     if (c >= ‘a‘ && c <= ‘z‘)
69         return 1;
70     else if (c >= ‘A‘ && c <= ‘Z‘)
71         return 1;
72     else
73         return 0;
74 }

main.c

 1 #include "serial.h"
 2
 3 int main()
 4 {
 5     unsigned char c;
 6     uart0_init();   // 波特率115200,8N1(8个数据位,无校验位,1个停止位)
 7
 8     while(1)
 9     {
10         // 从串口接收数据后,判断其是否数字或子母,若是则加1后输出
11         c = getc();
12         if (isDigit(c) || isLetter(c))
13             putc(c+1);
14     }
15
16     return 0;
17 }

注:代码源自韦东山先生,简作修改。

删掉sdram部分内容

时间: 2024-10-19 15:52:22

实验八--uart的相关文章

实验八——函数定义及调用总结

实验八--函数定义及调用总结 1.本次课学习到的知识点: (1)void为不反回结果的函数,且void不能省略,否则默认为int,函数体中没有表达式的return语句,也可省略return. (2)不返回结果的函数在定义.调用.参数传递.函数声明上,思路与以前相同,适用于把一些确定的.相对独立的程序功能封装成函数. (3)局部变量:定义在函数的内部,且有效作用范局部变量一般定义在函数或复合语句的开始处,围局限于所在的函数内部,形参是局部变量. (4)不能定义在中间位置. (5)全局变量:定义在函

实验八:RIPv1

实验八:RIPv1 在GNS3上连接设备 配置路由器 (1)R1 (2)R2 (3)R3 (4)R4

Packet Tracer 5.0实验(八) 路由器静态路由配置

Packet Tracer 5.0实验(八) 路由器静态路由配置 一.实验目标 掌握静态路由的配置方法和技巧: 掌握通过静态路由方式实现网络的连通性: 熟悉广域网线缆的连接方式: 二.实验背景 学校有新旧两个校区,每个校区是一个独立的局域网,为了使新旧校区能够正常相互通讯,共享资源,每个校区出口利用一台路由器进行连接,两台路由器间学校申请了一条2M的DDN专线进行相连,要求你做适当配置实现两个校区间的正常相互访问. 三.技术原理 路由器属于网络层设备,能够根据IP包头的信息,选择一条最佳路径将数

实验八 进程的切换和系统的一般执行过程

实验八 进程的切换和系统的一般执行过程 20135114王朝宪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程切换的关键代码switch_to分析 1.1 进程调度与进程调度的时机分析 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程,选择的过程中运用了不同的策略而已. 对于理解操作系统的工作机制,反而是进程的调度时机与进程的切换机制

Linux基础入门(新版)(实验五至实验八)

实验五 环境变量与文件查找 (环境变量的作用与用法,及几种搜索文件的方法) 一.环境变量 1.变量 (1)常变量与值是一对一的关系 (2)变量的作用域即变量的有效范围(比如一个函数中.一个源文件中或者全局范围),在该范围内只能有一个同名变量.一旦离开则该变量无效,如同不存在这个变量一般. 这里是一个例子: declare命令创建一个变量名为 tmp 的变量: $ declare tmp 使用=号赋值运算符为变量 tmp 赋值为 shiyanlou:$ tmp=shiyanlou 读取变量的值,使

VxWorks实验八 信号

实验八信号1 实验目的1.学习使用信号2 实验内容在实验一建立的 project 中,编写一段信号处理程序,将其与SIGINT 相关连,使用kill()发送SIGINT 信号并调用信号处理程序.观察运行结果.3 实验设备及工具1.硬件:a) PC 机2.软件:a) PC 机操作系统Windows2000 或windowsXPb) Tornado2.24 实验原理 信号可以用来通知任务处理特定的事件.当引起一个信号的事件发生时,信号产生(generated).当处理事件的任务激活时,信号释放(de

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验八:PS/2模块② — 键盘与组合键

实验八:PS/2模块② — 键盘与组合键 实验七之际,我们学习如何读取PS/2键盘发送过来的通码与断码,不过实验内容也是一键按下然后释放,简单按键行为而已.然而,实验八的实验内容却是学习组合键的按键行为. 不知读者是否有类似的经历?当我们使用键盘的时候,如果5~6按键同时按下,电脑随之便会发出“哔哔”的警报声,键盘立即失效.这是键盘限制设计,不同产品也有不同限制的按键数量.默认下,最大按键数量是5~7个.所谓组合键就是两个以上的按键所产生的有效按键.举例而言,按下按键 <A> 输出“字符a”,

实验八--排序算法

实验八 排序算法的实现 一. 实验目的: 熟练掌握常用的直接插入排序.简单选择排序.冒泡排序等算法. 深入理解各种查找排序的结构特点及各算法之间的区别. 二. 实验内容: 采用直接插入排序.简单选择排序.冒泡排序等常用的排序算法实现给数据的排序. 各种排序算法的结构特点及各算法之间的区别. 代码如下: RecordNode.java package sort; import java.util.Scanner; public class RecordNode { public int key ;

实验八 应用层协议Ⅱ-FTP协议分析

实验八 应用层协议Ⅱ-FTP协议分析 一.实验目的 1.掌握FTP协议的实现原理. 2.了解控制通道和数据通道. 二.实验内容 用WareShark追踪ftp连接. 1.三次握手 2.ftp服务器回发"准备就绪". 3.客户端给服务器发送用户名,服务器回发ACK,并向服务器请求密码. 4.客户端给服务器发送密码,密码为"[email protected]",服务器回发ACK并告诉客户端登录       成功. 三.实验总结 这次实验体验了FTP文件传输的过程,从三次