前言

讲解韦东山JZ2440开发板的串口驱动原理,对韦东山在维基教程串口使用内容的一些补充,串口使用点击这里进入。这里主要讲的是串口驱动的编程思路,如何根据s3c2440的芯片手册编写出最简单的串口驱动。

一、串口的初始化

串口初始化包括引脚初始化、串口时钟初始化和中断模式、波特率配置以及参数配置等。

1、引脚初始化

(1)看JZ2440开发板的原理图,可知UART0的引脚是GPH2(TXD0)和GPH3(RXD0)。

(2)到s3c2440芯片手册295页,看GPHCON(GPH控制寄存器),可以需要把GPH2也就是GPHCON[5:4]配置为10,GPH3也就是GPHCON[7:6]配置为10。

(3)配置引脚为内部上拉,然引脚初始时为高电平,看s3c2440芯片手册的295页,可知需要把GPH[10:0]配置为0。

(4)编写程序实现引脚初始化,首先清零GPH2和GPH3引脚,然后在配置为TXD和RXD模式,接着将已经配置为内部上拉。

/* 配置GPH2、GPH3引脚为串口模式,GPH2-->TXD,GPH3-->RXD */
GPHCON &= ~((3<<4) | (3<<6));  /* 先清零GPH2和GPH3 */
GPHCON |=  ((2<<4) | (2<<6));  /* 配置为TXD,RXD模式 */
GPHUP  &= ~((1<<2) | (1<<3));  /* 配置内部上拉,让引脚初始时为1 */

2、串口时钟以及中断模式配置

在s3c2440芯片手册的342页,看到串口控制寄存器(UART CONTROL REGISTER),通过配置寄存器的位来配置时钟源和中断模式,有s3c2440的时钟体系可知串口是在APB总线,因此是用PCLK时钟源。

(1)时钟源选择,因为我们用的是PCLK时钟源,所以配置[15:10]为000000。

(2)中断模式以及回环等配置,不使用中断模式,不用回环模式, Normal transmit、Rx Time Out不使能、这些位配置为0,即[9:4]配置为000000。

(3)发送模式和接收模式配置,配置为轮询方式,[3:0]配置为0101。

(4)编写UCON0寄存器配置程序,二进制0000000000000101,16进制0x00000005。

/* 配置时钟PCLK(50M),查询模式 */
UCON0 = 0x00000005;

3、波特率配置

在s3c2440芯片手册352页,UBRDIV0(UART波特率除数寄存器),看到如下计算公式

根据该计算公式可以得出UBRDIV0的值,因此可编写UBRDIV0配置程序。

/* 配置串口波特率
** UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
** UART clock = 50M,由时钟配置可知FCLK : HCLK : PCLK = 400m : 100m : 50m
** 有datasheet可知,如果波特率为115200,则
** UBRDIVn = (int)(50000000 / (115200 x 16)) - 1 = 26
*/
UBRDIV0 = 26;

4、配置参数

接下来配置串口参数,配置为8个数据位,1个停止位,无校验位,正常模式。在s3c2400的341页,看到UART线路控制寄存器ULCON0,如图所示,可在ULCON0配置为00000011,16进制0x00000003,

因此可编写程序配置ULCON0。

/* 配置参数,8个数据位,1个停止位,无校验位,正常模式 */
ULCON0 = 0x00000003;

5、完成的串口初始化程序

/**************************************************************
函数名称:uart_init
函数功能:S3C2440 UART0初始
输入参数:无
返 回 值:无
备    注:无
**************************************************************/
void uart_init(void)
{/* 配置GPH2、GPH3引脚为串口模式,GPH2-->TXD,GPH3-->RXD */GPHCON &= ~((3<<4) | (3<<6));   /* 先清零GPH2和GPH3 */GPHCON |=  ((2<<4) | (2<<6));    /* 配置为TXD,RXD模式 */GPHUP  &= ~((1<<2) | (1<<3)); /* 配置内部上拉,让引脚初始时为1 *//* 配置时钟PCLK(50M),查询模式 */UCON0 = 0x00000005;/* 配置串口波特率** UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1** UART clock = 50M,由时钟配置可知FCLK : HCLK : PCLK = 400m : 100m : 50m** 有datasheet可知,如果波特率为115200,则** UBRDIVn = (int)(50000000 / (115200 x 16)) - 1 = 26*/UBRDIV0 = 26;/* 配置参数,8个数据位,1个停止位,无校验位,正常模式 */ULCON0 = 0x00000003;}

二、串口发送和函数实现

1、在s3c2440芯片手册347页,看到UART TX/RX状态寄存器,因为没有用到FIFO发送模式,所以这里用到bit2和bit0,分别对应发送和接收。

2、在s3c2440芯片手册351页,UART传输缓冲寄存器和UART接收缓冲寄存器,这里要注意的是发送和接收是有分为小端模式和大端模式的,这里用的是小端模式。

3、编写发送字符和接收字符函数

/**************************************************************
函数名称:send_char
函数功能:发送一个字符
输入参数:要发送的字符
返 回 值:无
备    注:无
**************************************************************/
void send_char(unsigned char c)
{while(!(UTRSTAT0 & (1<<2))); /* 检查状态寄存器,如果不为空说明数据还没发送完则一直等待 */UTXH0 = c;         /* 如果状态寄存器为空,则将下一个数据传入传输缓冲寄存器 */
}/**************************************************************
函数名称:receive_char
函数功能:接收一个字符
输入参数:无
返 回 值:获取到的字符
备     注:无
**************************************************************/
unsigned char receive_char(void)
{while(!(UTRSTAT0 & (1<<0))); /* 检查状态寄存器,如果不为空说明数据还没接收完则一直等待 */return URXH0;           /* 状态寄存器为空,则将数据读取出来 */
}

韦东山ARM裸机学习笔记——S3C2440的串口驱动编程原理相关推荐

  1. 嵌入式知识-ARM裸机-学习笔记(2):利用GPIO来控制LED(附mkv210_image.c文件解析)

    嵌入式知识-ARM裸机-学习笔记(2):利用GPIO来控制LED(附mkv210_image.c文件解析) 首先声明该博客是针对朱有鹏老师的嵌入式课程进行笔记的总结. 一.通过GPIO控制点亮LED( ...

  2. 嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210)

    嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210) 一.SD卡介绍 1. SD卡背景知识和特点 SD卡.MMC卡.MicroSD.TF卡:这些卡其实内部就是Flash存储颗粒,比 ...

  3. 嵌入式知识-ARM裸机-学习笔记(8):SoC定时器与看门狗(WDT)

    嵌入式知识-ARM裸机-学习笔记(8):SoC定时器与看门狗(WDT) 一.定时器 1. 定时器简介 定时器是SoC中最常见的外设 (1)定时器与计数器.计数器是用来计数的(每隔一个固定时间会计一个数 ...

  4. 嵌入式知识-ARM裸机-学习笔记(12):ADC模数转换器

    嵌入式知识-ARM裸机-学习笔记(12):ADC模数转换器 一.ADC 1. 什么是ADC ADC(analog digital converter):模数转换(也就是模拟量转换为数字量).由于CPU ...

  5. 【学习笔记】韦东山freertos直播学习笔记

    韦东山FreeRTOS学习 如果刚好有大佬看到发现笔记中有什么写错了的,欢迎大佬指点,我十分乐意受到大佬的指点哈哈哈,顺便我还想问一下csdn的编辑器有没有保存的快捷键啊,CTRL+S好像没有用啊. ...

  6. 韦东山第一期学习笔记——重定位

    重定位 说明 必须知道的几个概念 什么是代码重定位? 什么是位置无关码 什么是运行地址 为什么要代码重定位? nand flash启动的情况 nor flash启动的情况 两种方式的重定位 代码重定位 ...

  7. 开发板、Windows、Ubuntu三者互联——韦东山嵌入式Linux学习笔记08

    实验环境: 1. Windows7 2. VMware12.0+Ubuntu 3. JZ2440 按理说,在物理机上安装Ubuntu操作系统是比较推荐的方法.不过,因为windows上有很多好用的工具 ...

  8. win7下不能使用dnw烧写的解决办法——韦东山嵌入式Linux学习笔记05

    本文实验环境: 1. windows 7(64bit) 2. JZ2440 一. 问题的提出--没有驱动 假设板子的 Nor Flash 上已经烧好了 u-boot,那么如何通过 u-boot 的US ...

  9. 朱老师ARM裸机学习笔记(一):计算机基础知识

    RISC和CISC的区别 CISC(complex instruction-set computer)复杂指令集 特点: 指令较多,较丰富,CISC的CPU 较难设计,Intel是典型的CISC体系C ...

  10. ARM裸机学习笔记(一)GPIO_and_LED

    (一)安装交叉编译工具链 1.linux下安装软件的方法 在线安装.譬如ubuntu中使用apt-get install vim来安装vim软件. 自己下载安装包来安装.这种方式的缺陷就是你不知道你下 ...

最新文章

  1. GDI+ 学习记录(27): Bitmap
  2. linux gt txt内容为空,2gt;/dev/null和gt;/dev/null 2gt;amp;1和2gt;amp;1gt;/dev/null的区别...
  3. C#异步编程看这篇就够了
  4. 【itext学习之路】--2.设置pdf的一些常用属性
  5. vim配置Nerdtree
  6. IIS6上传文件尺寸太小解决办法
  7. DynamipsGUI使用注意
  8. X509证书基本概念
  9. 照片识别出错_8款文字识别工具,只要拍个照,文字马上可编辑
  10. windows11 笔记本开启热点就断网
  11. matlab积分e (x 2),e^(x^2)的定积分
  12. 大数据和人工智能到底是什么关系
  13. 魔兽世界az端和TC端有什么区别 Mangos,TC,SW,AZ,AC的关系
  14. 上传到docker hub_在容器上构建持续部署及最佳实践初探
  15. 【瑞萨RA4系列】开发环境搭建和点灯指南
  16. HTTPS/HTTP
  17. 绝佳表现电商各类促销活动插画素材|玩转大促购物节
  18. 总结python之excel write(row,col,data)
  19. 如何进行快速高效的学习
  20. 智慧城市无线充电故障和fitbits总体规划8月以来的热门新闻

热门文章

  1. 解决CentOS小数字键盘失效,按NumLock无效的方法
  2. blockly -- 颜色(Block colour)
  3. 移动终端开发详解总结(二)(kotlin版)| CSDN创作打卡
  4. centos 7 系统安装
  5. Java 中status意思_java web开发中 varStatues=quot;statusquot; 中参数status是啥作用和意思呢?这个参数的设置有啥要求呢?...
  6. JavaScript打飞机小游戏
  7. CSP共空间模式详解
  8. 【2019年04月09日】A股净资产收益率ROE最高排名
  9. 2021莆田六中一高考成绩查询,莆田六中2018年高一新生录取名单完整版
  10. php怎么查看当前地址,php二分法在IP地址查询中的应用