查看UART在硬件上的信息,阅读JZ2440原理图可以看到:


  JZ2440开发板的UART0是可以跟USB相接的,用于打印调试,UART1,UART2两个串口用来外接模块。所以本文仅对UART0进行操作。

从上图可以看到,UART0的TXD0和RXD0对应GPH2和GPH3,硬件上获取的信息大概就就是这些,接下来对芯片手册的UART部分进行分析:


首先需要设置UART0的TXD0和RXD0引脚,对应的GPHCON,GPHDAT,GPHUP寄存器见下图:

    GPHCON: 将GPH2和GPH3分别设置为TXD0和RXD0

    GPHUP:  由于JZ2440的串口采用TTL标准,所以一开始应该是高电位,需要将相应引脚的电位上拉

         这里往GPHUP寄存的的bit3和bit2里写入1,即可完成设置。

    

下图是串口的结构图:

    1、发送过程:数据由内存传递到发送缓冲寄存器,再由发送移位器通过发送引脚TXD0将数据传递出去

    2、接收过程:外部数据通过接收引脚RXD0传至接收移位器,再由接收缓冲寄存器传递至内存中。

另外:这里选用非FIFO模式,所以移位寄存器一次只能传递1个字节


想要传输数据,波特率和数据格式肯定需要约定好,下面对波特率和数据格式的设置进行分析:

a、波特率

  阅读下方图片中波特率的说明,可以知道:波特率发生器的设定与UBRDIV0和UART clock有关,UART clock这里选用PCLK=50MHz

波特率选用115200,根据公式UBRDIVn = (int)( UART clock / ( buad rate x 16) ) -1可以计算出:       

        UBRDIV0  = (int)(50000000 / (115200 x 16) ) -1
               = (int)(27.1) -1 (四舍五入到最接近的整数)
               = 27 -1 =


UART clock选择:选用PCLK


b、数据格式

这里采用8位数据位,无校验位,1位停止位,即 8n1


阅读芯片手册发现,UTRSATA0寄存器用来判断UART0是否发送/接收完成:  

   当bit [2]为1时表明发送完成了

   当bit [0]为0时表明接收完成了   


传输模式寄存器:这里采用中断/查询模式


根据发送/接收缓冲寄存器的描述,可以发现:JZ2440采用小字节序,UTXH0和URXH0都是按1个字节发送或者接收。


对UART0的分析大概就是这些了,要实现以上的描述,离不开程序:

uart.c

 /* UART0的初始化,以及UART0打印调试函数 */
#include "s3c2440_soc.h"
void uart0_init(void) //串口0初始化函数
{
/* 设置UART0串口的引脚
** GPHCON寄存器的bit[7:6]为10(GPH3为RXD[0]),bit[5:4]为10(GPH2为TXD[0])
** 因为开发板串口采用TTL标准,GPHUP寄存器对应的bit[2]和bit[3]需要设置为电位上拉
*/
GPHCON &=~((<<)|(<<)); //先清零
GPHCON |= ((<<)|(<<));
GPHUP &=~((<<)|(<<)); //对应bit使能上拉 /* 设置波特率
** UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
** UART的时钟默认采用PCLK=50MHz
** UBRDIV0 = (int)( 50000000 / ( 115200 x 16) ) –1 = 26
*/ UBRDIV0 = ; /* 设置数据发送格式:数据位为8位,无校验位,停止位1位,即8n1
** 设置ULCON0寄存器,bit[5:3]为000,bit2为0,bit[1:0]为11
** 即ULCON0=0x00000003
*/ ULCON0 = 0x00000003; /* 设置发送和接收模式为中断/查询模式:
** UCON0寄存器的bit[3:2]为01,bit[1:0]为01,UCON0=0x00000005;
*/ UCON0 = 0x00000005;
} /* 串口的输入和输出 */ /* 根据UART的发送和接收状态位寄存器 UTRSTAT0 的状态,判断发送/接收完成与否
** 发送:看bit[2]的状态,当bit[2]为1时表明发送完成了
** 接收:看bit[0]的状态,当bit[0]为0时表明接收完成了
** 发送缓冲寄存器UTXH0,接收缓冲寄存器URXH0
*/
int putchar(int c)
{
while(!(UTRSTAT0 & (<<))); //当发送缓冲寄存器和发送移位器不是空的时候,循环等待
UTXH0 = (unsigned char)c; //反之,当上一个发送完了,再向发送缓冲寄存器写入字符(这里是按单个字节发送)
}
int getchar(void)
{
while(!(UTRSTAT0 & (<<))); //当接收缓冲寄存器是空的时候,循环等待
return URXH0; //当接收缓冲寄存器非空的时候,返回接收缓冲寄存器得到的值
}
int puts(const char *s)
{
while (*s) //当*s有内容时
{
putchar(*s); //调用putchar函数
s++; //让s指针加1
} }

自定义头文件 uart.h :

 #ifndef     _UART_H                // 如果某个文件第一次包含这个头文件,_UART_H这个宏没有定义时
#define _UART_H // 定义_UART_H这个宏 void uart0_init(void);
int putchar(int c);
int getchar(void);
int puts(const char *s); #endif

主程序 main.c

 #include "s3c2440_soc.h"
#include "uart.h"
int main(void)
{ unsigned char c;
uart0_init();
puts("Hello,world!\n\r");
while()
{
c=getchar(); // 从PC键盘上得到输入字符(串 )
if (c == '\r') // 换行处理 ,不论输入\n或者\r,都会换行并使光标到行首
{
putchar('\n');
}
if (c == '\n')
{
putchar('\r');
}
putchar(c); // 输出得到的字符(串 )到PC,PC屏幕会显示串口传过来的字符(串 )
}
return ;
}

makefile :

all:
arm-linux-gcc -c -o led.o led.c
arm-linux-gcc -c -o uart.o uart.c
arm-linux-gcc -c -o main.o main.c
arm-linux-gcc -c -o start.o start.S
arm-linux-ld -Ttext start.o led.o uart.o main.o -o uart.elf
arm-linux-objcopy -O binary -S uart.elf uart.bin
arm-linux-objdump -D uart.elf > uart.dis
clean:
rm *.bin *.o *.elf *.dis

这里只列出了部分文件,上传所有文件到 linux 编译后,得到uart.bin文件,烧写到JZ2440开发板,可以实现简单的打印调试功能,见下图:

JZ2440开发板:UART(串口)使用(学习笔记)的更多相关文章

  1. JZ2440开发板:用按键点亮LED灯(学习笔记)

    本文是对韦东山嵌入式第一期学习的记录之一,如有您需要查找的信息,可以继续往下阅读. 想要用按键点亮LED灯,就需要知道按键和LED灯的相关信息,这样才可以进行之后的操作.阅读JZ2440的原理图,可以 ...

  2. JZ2440开发板:修改ARM芯片时钟(学习笔记)

    想要修改ARM芯片的时钟,需要去查询芯片手册和原理图,获取相关的信息(见下方图片) 首先来看时钟的结构图 根据结构图可以看出,时钟源有两种选择:1. XTIpll和XTOpll所连接的晶振 2. EX ...

  3. Linux学习 :移植U-boot_2016.09到JZ2440开发板

    一.下载源码:ftp://ftp.denx.de/pub/u-boot/ 二.初始化编译: ①新建一个单板: cd board/samsung/ cp smdk2410 smdk2440 -rf   ...

  4. Linux学习 :移植U-boot_2012.04.01到JZ2440开发板

    一.下载U-boot源码:ftp://ftp.denx.de/pub/u-boot/ 二.uboot的启动过程: 部分硬件初始化——>加载完整uboot到RAM——>跳转到第二阶段入口开始 ...

  5. 基于JZ2440开发板编写bootloader总结(一)

    凡走过必留下痕迹,学点什么都会有用的. 本系列博文总结了自己在学习嵌入式Linux编程过程中的收获,若有错误,恳请指正,谢谢! --参考教材韦东山系列教材 bootloader 是一个用于启动linu ...

  6. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  7. Jz2440开发板熟悉

    title: Jz2440开发板熟悉 tags: ARM date: 2018-10-14 15:05:56 --- 概述 外部晶振为12M Nand Flash 256M,Nor Flash 2M, ...

  8. 《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴

    上一节学习了使用Cocos2d-x播放音乐的方法,但是那种方法一般只适合于播放较大的音乐,而一般比较短小的音乐(如游戏中的打斗.按键音效等)则要通过playEffect来播放.本节使用该方法以及之前学 ...

  9. 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音

    <Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...

随机推荐

  1. 错误: 安装必备组件失败: 安装必备组件失败: SqlInstanceRtc 有关详细信息

    错误: 安装必备组件失败: 安装必备组件失败: SqlInstanceRtc 有关详细信息 查看错误得知是安装sqlexpr_x64.exe的时候出现了错误 解决: 通过打开skype镜像,找到sql ...

  2. unity3d中设计模式的学习<一>:泛型单例

    单例是游戏开发中比较常见的设计模式,虽然针对的功能不同,但是有一些功能还是共有的,代码也不少,如果能放在一个基类里面是最好不过了,但是单例里需要有个instance功能来返回当前对象,所以这个功能必须 ...

  3. Python函数(入门6)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6407970.html 本文出自:[Edwin博客园] Python函数 1. Python之调用函数 pri ...

  4. Ubuntu下Apache配置网站根路径

    安装之后apache默认的跟路径是/var/www/   如何修改这个默认路径呢?   直接编辑/etc/apache2/sites-available/default-ssl.conf,将Docum ...

  5. 函数类型(Function Types):函数类型和其他类型一样

    函数类型(Function Types) 每个函数都有种特定的函数类型,由函数的参数类型和返回类型组成. 例如: 这个例子中定义了两个简单的数学函数:addTwoInts 和 multiplyTwoI ...

  6. 体验了Sublime + Emmet,才体会到原来前端开发可以这么痛快!

    从当初用notepad写出第一个web页面,到现在偶尔使用Editplus做一些HTML5的消遣,不知不觉已经15年了  --! 在这中间,和那些老顽固一样,坚决远离FP.DW那些半自动的前端开发工具 ...

  7. 备份&添加无线网络配置

    netsh wlan export profile key=clear folder=c:\ #备份 (ls c:\*.xml).FullName|%{netsh wlan add profile f ...

  8. 调节Ubuntu分辨率

    列出当前支持的分辨率 使用 xrandr 命令新增显示模式 至此分辨率更改完成 重启后会失效 在 ~/.profile 最末尾添加修改分辨率的命令

  9. Google Map中的瓦片

    一.墨卡托投影google map使用的是EPSG:900913标准墨卡托投影(等角圆术地图投影)y = R*ln(tan(pi/4 + a/2))x = R*b当y等于piR时,投影图正好为一个正方 ...

  10. js中array(数组).map

    使用前 使用后 代码: