第六章 S3C2410的串口UART及编程 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)

Slides:



Advertisements
Similar presentations
全民國防教育宣導 暨國防教育影片欣賞與討論.
Advertisements

现代电子技术实验 ——综合实验之单片机部分
C语言程序设计 主讲教师 :张群燕 电话:
四資二甲 第三週作業 物件導向程式設計.
战争结束了 年11月,听到停战的消息,巴黎街头人们欣喜若狂。法国总理克里孟梭说:“吻我的姑娘有500多个了。”
第一章 C语言概述 计算机公共教学部.
自考英语二.
第 5 章 流程控制 (一): 條件分支.
序列埠通訊.
講師:聯捷聯合會計師事務所 張志勝會計師(所長)
第六节 脑和脊髓的传导通路.
第三章 控制结构.
任务1: 点亮你的LED----初识单片机.
第四章 BootLoader开发 附-s3c2410/s3c2440处理器介绍
程式設計實作.
第7章 中斷系統.
CH2 開發環境介紹 最簡單的互動設計 – Arduino一試就上手 孫駿榮、吳明展、盧聰勇.
主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“真名+学号”
Timer & KEYPAD 11/24.
內容:串列傳輸 實作:Arduino to PC 、 Arduino to Arduino 簡報:廖崇義
第6章 MCS - 51单片机内部定时器/ 计数器 及串行接口 6.1 定时器/计数器的结构及工作原理 6.2 方式和控制寄存器
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
第八章 80C51单片机的串行通信 主要内容:本章主要介绍80C51串行通信相关知识,包括串行通信基本概念,80C51单片机的串行口及其工作方式,以及单片机在双机或多机通信中的应用。
8051's UART mode0 output 通訊二甲 B 洪紹凱.
UART口的第一次接触 MCU起航 QQ:
Arduino单片机基础 周弋
FIFO 与 UPP 本节我们结合UPP接口给大家介绍一下FIFO在实际工程中的使用。 广州创龙电子科技有限公司 01
QQ: 李祥 QQ: 欢迎多种方式的学习交流,祝大家学有所成.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Function.
NO.3.1 SOPC技术 第5章 Nios II 系统的外围设备.
第15章 串行通信及接口电路.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
6 使用者函數 6.1 函數定義 宣告函數 呼叫函數 呼叫多個函數 6-6
Chap 3 分支结构 3.1 简单的猜数游戏 3.2 四则运算 3.3 查询自动售货机中商品的价格.
C语言 程序设计基础与试验 刘新国、2012年秋.
第五讲 内容回顾 1、SCI的特点 1)F2812包含两个SCI接口,记做SCIA和SCIB
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第九章 MCS-51串行接口 9.1 串行数据通信概述 通 信 并行 一、并行通信和串行通信 串行 串行通信 数据是一位一位传送的
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
亚博科技 Arduino视频教程 第8讲 蜂鸣器发声实验.
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
通訊實驗 實驗三 遙控車程式流程圖 姓名:顏得洋 學號:B
程式結構&語法.
5-6 串列埠模式0輸出埠擴充實習.
第 二 章 数据类型、运算符与表达式.
通訊實驗 實驗三 遙控車程式流程圖 姓名:顏得洋 學號:B
Oop8 function函式.
C程序设计.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
单片机原理及应用 实践部分 主讲人:刘 强 四川工商学院单片机教学团队 单片机原理及应用 实践部分 主讲人:刘 强
UART通信实验(二) McBSP软件模拟异步通信
#include <iostream.h>
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
題目: 分散式物品搜尋器 指導教授: 黃慶祥 組員名稱: 黃偉聖 郭惠榮 楊勝凱 報告人: 黃偉聖
第七章  数 组.
K60入门课程 03 首都师范大学物理系 靳熙芃.
单片机应用技术 (C语言版) 第8章 串行通信接口
第五章 序列埠通訊 並列與序列通訊簡介 認識序列埠 認識字元資料類型 字串資料類型 從序列埠監控視窗觀察變數 從Arduino接收序列資料
C/C++基礎程式設計班 字元與字串 講師:林業峻 CSIE, NTU 3/14, 2015.
单片机应用技术 (C语言版) 第4章 C51程序设计入门
Arduino 藍牙通訊模組.
多重條件選擇敘述
通訊實驗 實驗三 遙控車程式流程圖 姓名:顏得洋 學號:B
Chap 10 函数与程序结构 10.1 圆形体积计算器 10.2 汉诺塔问题 10.3 长度单位转换 10.4 大程序构成.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第2章 Arduino编程.
第六章 直接成本法.
Presentation transcript:

第六章 S3C2410的串口UART及编程 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)

主要内容: 6.1 S3C2410的串口UART概述 6.2 UART的控制寄存器 6.3 UART通信程序例子

6.1 S3C2410的串口UART概述 6.1.1 S3C2410串行通信(UART)单元 S3C2410 UART单元提供3个独立的异步串行通信接口,皆可工作于中断和DMA模式。使用系统时钟最高波特率达230. 4 kb/s,如果使用外部设备提供的时钟,可以达到更高的速率。每一个UART单元包含一个16字节的FIFO发送缓冲器和一个16字节的FIFO接收缓冲器,用于数据的接收和发送。 S3C2410X UART支持可编程波特率、红外发送/接收(仅UART2 )、1个或2个停止位、5位/6位/7位/8位数据宽度和奇偶校验。

6.1.2 波特率的产生 波特率由一个专用的UART波特率分频寄存器(UBRDIVn)(n=0~2)控制,计算公式如下 UBRDIVn=(int)[ULK/(波特率× 16)]-1 或者 UBRDIVn=(int) [PLK/(波特率× 16)]-1 波特率表示每秒钟传送的二进制位数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。

6.1.3 UART通信操作 下面简略介绍UART操作,关于数据发送、数据接收、中断产生、波特率产生、查询检测模式、红外模式和自动流控制的详细介绍,请参照相关教材和数据手册。 发送数据帧是可编程的。一个数据帧包含1个起始位、5~8个数据位、1个可选的奇偶校验位和1~2位停止位,停止位位数通过行控制寄存器ULCONn配置。

6.2 UART的控制寄存器 6.2.1 UART线路控制寄存器ULCONn 该寄存器的位6决定是否使用红外模式,位5、位4和位3决定校验方式,位2决定停止位长度,位1和位0决定每帧的数据位数。具体如表6-1所示:

6.2.2 UART控制寄存器UCONn 该寄存器决定UART的各种模式,见表6-2所示:

6.2.3 UART FIFO控制寄存器UFCONn S3C2410 UART每通道有16个字节的先入先出(FIFO)接收缓冲器和16个字节的先入先出(FIFO)发送缓冲器,如果在程序中使用它们,必须要对UART FIFO控制寄存器UFCONn进行定义,UFCONn的配置如表6-3所示:

6.2.4 UART 调制解调器控制寄存器UMCONn(n=0或1)

6.2.5发送寄存器UTXH和接收寄存器URXH 这两个寄存器存放发送和接收的数据,当然只有1字节(8位数据)。需要注意的是,在发生溢出错误时,接收的数据必须被读出来,否则会引发下次溢出错误。

6.2.6 UART TX/RX 状态寄存器UTRSTAT

6.3 UART通信程序例子 UART通信电平可有三种形式,TTL电平,RS232或RS485。嵌入式控制系统大多具有小、巧、轻、灵、薄的特点,许多传感器和S3C2410一体或距离很近,没有干扰,例如多参数监护仪等医疗设备,为简化电路,可采用TTL电平直接与S3C2410相连。 如果通信距离在几十米左右并是点对点通信可采用RS232接口,否则只能采用RS485通信。在工程上UART通信大多采用三线制(发送连对方接收、接收连对方发送,双方共地)。本节在介绍RS232接口电路的同时给出了一个UART通信程序实例。 TTL电平信号规定,+5V等价于逻辑“1”,0V等价于逻辑“0”。RS232采用负逻辑电平,即-15v~-3V代表逻辑”1”,+3v~+15v代表逻辑”0”。RS485电平,两者均采用差分传输,发送端AB间的电压 +2~+6V 代表”1” -2~-6V代表”0” 接收端AB间的电压差 大于+200mv 1 小于-200mv 0

6.3.1 RS232接口电路 本实验平台的电路中,UART0与S3C2410连接电路如图6-1所示,UART0只采用两根接线RXD0和TXD0 (RS232只能实现点对点通信,且两点要共地),因此只能进行简单的数据传输及接收。UART0采用美信232电平转换器(MAX232)做电平转换

图6-1 UART0X与S3C2410的连接电路图

6.3.2 UART实验程序 //-------------------------------------------------------------------------------------------------------------- // 头文件uart0.h //------------------------------------------------------------------------------------------------------------- #define TX_INTTYPE 1 //1:发送中断电平触发标志 #define RX_INTTYPE 1 //1:接收中断电平触发标志 extern void Uart_Port_Set(void); //保存本程序使用的端口原状态 extern void Uart_Port_Return(void); //恢复本程序使用的端口原状态 extern void Uart_Uclk_En(int, int); //串行通信使用UCLK extern void Uart_Pclk_En(int, int); // 串行通信使用PCLK void Test_Uart0_Int(void); //UART0初始化 // UART实验程序

//-------------------------------------------------------------------------------------------------------------- #include <string.h> #include <stdlib.h> #include "2410addr.h" #include "2410lib.h" #include "def.h" #include "uart0.h" void Uart_Port_Set(void); void Uart_Port_Return(void); void __irq Uart0_TxInt(void) ; //发送中断服务程序 void __irq Uart0_RxIntOrErr(void); //接收字符和错误代码中断服务程序 void __sub_Uart0_RxInt(void); //接收字符子中断服务程序,从上面程序分出 volatile U32 save_rGPHCON,save_rGPHDAT,save_rGPHUP; volatile U32 save_ULCON0,save_UCON0,save_UFCON0,save_UMCON0;

/* 定义一些变量,做临时保存端口数据和状态的缓冲区,通信结束,端口数据和状态要恢复*/ Volatile U32 isTxint isRxint; //定义二个变量,分别做发送和接收中断结束与否标志 volatile static char *uart0TxStr;// UART0发送字串地址 volatile static char *uart0RxStr;// UART0接收字串地址 //-------------------------------------------------------------------------------------------------------------- // 保存UART实验使用的端口和寄存器 void Uart_Port_Set(void) { //保存H口控制寄存器 save_rGPHCON=rGPHCON; save_rGPHDAT=rGPHDAT; save_rGPHUP=rGPHUP; //配置UART口 rGPHCON&=0x3c0000;

rGPHCON|=0x2faaa; //H口控制寄存器nRTS1,nCTS1功能使能 rGPHUP|=0x1ff; //Uart 口上拉禁止 //rINTSUBMSK=0x7ff; //屏蔽全部子中断 save_ULCON0=rULCON0; //保存UART控制寄存器 save_UCON0=rUCON0; save_UFCON0=rUFCON0; save_UMCON0=rUMCON0; //Initialize UART0, port } //-------------------------------------------------------------------------------------------------------------- // 恢复UART实验使用的端口和寄存器 void Uart_Port_Return(void) {

//Pop UART GPIO port configuration rGPHCON=save_rGPHCON; rGPHDAT=save_rGPHDAT; rGPHUP=save_rGPHUP; //Pop Uart control registers rULCON0=save_ULCON0; rUCON0 =save_UCON0; rUFCON0=save_UFCON0; rUMCON0=save_UMCON0; } //-------------------------------------------------------------------------------------------------------------- // UART通信使用UCLK做波特率发生器

void Uart_Uclk_En(int ch,int baud) { int ch, baud; Uart_Printf("\nSelect UART channel[0:UART0;1:UART1;2:UART2]:\n"); ch=Uart_GetIntNum(); //从键盘读通道号 Uart_Printf("\nSelect baud rate :\n"); baud=Uart_GetIntNum(); //从键盘读波特率 if(ch == 0) {//选UART0 Uart_Select(0); rUCON0|=0x400; //选UCLK rUBRDIV0=( (int)(UCLK/16./baud) -1 ); //波特率因子寄存器 Uart_Printf("UCLK is enabled by UART0.\n"); } for(i=0;i<100;i++

UART实验使用PCLK //-------------------------------------------------------------------------------------------------------------- void Uart_Pclk_En(int ch, int baud) { int ch, baud; Uart_Printf("\nSelect UART channel[0:UART0/1:UART1/2:UART2]:\n"); ch=Uart_GetIntNum(); Uart_Printf("\nSelect baud rate :\n"); baud=Uart_GetIntNum(); if(ch == 0) {选UART0 Uart_Select(0);

rUCON0&=0x3ff; // Select PCLK rUBRDIV0=( (int)(PCLK/16./baud) -1 ); //Baud rate divisior register Uart_Printf("PCLK is enabled by UART0.\n"); } for(i=0;i<100;i++); //短延时,给硬件响应时间 //------------------------------------------------------------------------------------------------------------- // UART0发送中断 void __irq Uart0_TxInt(void) { rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);/*屏蔽接收和发送以及错误子中断*/

WrUTXH0(*uart0TxStr++); //向发送缓冲器送下一字节 if(*uart0TxStr != '\0') //判发送字串结束标志,如果没结束 { WrUTXH0(*uart0TxStr++); //向发送缓冲器送下一字节 ClearPending(BIT_UART0); // 清中断挂起寄存器 rSUBSRCPND=(BIT_SUB_TXD0); //清子中断挂起寄存器 rINTSUBMSK&=~(BIT_SUB_TXD0); // 取销子中断屏蔽 } else isTxInt=0; // 置发送结束标志 ClearPending(BIT_UART0); //清中断挂起寄存器 rSUBSRCPND=(BIT_SUB_TXD0); // 清子中断挂起寄存器 rINTMSK|=(BIT_UART0); // UART0子中断屏蔽

UART0接收字符和错误代码中断服务程序 //-------------------------------------------------------------------------------------------------------------- void __irq Uart0_RxIntOrErr(void) { rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);/*屏蔽接收和发送以及错误子中断*/ if(rSUBSRCPND&BIT_SUB_RXD0) __sub_Uart0_RxInt(); /* 如果子中断源挂起寄存器中的BIT_SUB_RXD0等于1,调__sub_Uart0_RxInt(),正常接收,否则调__sub_Uart0_RxErrInt(),错误处理 */ else __sub_Uart0_RxErrInt(); ClearPending(BIT_UART0); //清UART0子中断挂起寄存器 rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_ERR0); //清UART0子中断源挂起寄存器 rINTSUBMSK&=~(BIT_SUB_RXD0|BIT_SUB_ERR0); //打开屏蔽,接收下一数据 }

UART0正常中断接收子程序 //-------------------------------------------------------------------------------------------------------------- void __sub_Uart0_RxInt(void) { if(RdURXH0()!='\r') //判接收缓冲器字符是否结束标志,不是,正常接收 Uart_Printf("%c",RdURXH0()); //在终端上显示接收到的字符 *uart0RxStr++ =(char)RdURXH0(); //字符放接收缓冲区 } else //如结束 isRxInt=0; //置接收结束标志 *uart0RxStr='\0'; //接收字串后加一个'\0' Uart_Printf("\n");

UART0接收中断错误处理 //-------------------------------------------------------------------------------------------------------------- void __sub_Uart0_RxErrInt(void) {//根据错误号处理 switch(rUERSTAT0)//to clear and check the status of register bits { case '1': Uart_Printf("Overrun error\n");//超时错 break; case '2': Uart_Printf("Parity error\n");//效验错 case '4': Uart_Printf("Frame error\n");//格式错 case '8': Uart_Printf("Breake detect\n");//中断错 default :

break; } //-------------------------------------------------------------------------------------------------------------- // UART0发送和接收中断实验 void Test_Uart0_Int(void) { Uart_Port_Set(); //保存I/O口状态和数据,实验结束恢复 Uart_Select(0); //选UART0 //UART0 发送中断实验 isTxInt=1; //置发送中断标志,中断结束,isTxInt=0

uart0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART0 Tx interrupt test is good!!!!\r\n"; //发送的实验字串 Uart_Printf("[Uart channel 0 Tx Interrupt Test]\n");//在终端上提示 pISR_UART0=(unsigned)Uart0_TxInt; //设中断向量,即发送中断服务程序入口 rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); /* 正常发送,无效验,一个停止位,8个数据位 选 UCLK */ rUCON0&=0x400; rUCON0|=(TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(); //选时钟,发送,接收中断 Uart_TxEmpty(0); //等,直到发送缓冲器空,此时会产生发送中断 rINTMSK=~(BIT_UART0); // 总中断屏蔽(UART0位)打开 rINTSUBMSK=~(BIT_SUB_TXD0); // 子中断屏蔽(UART0发送位)打开 while(isTxInt);/* 从此处进入中断,中断结束又返回这里等下次中断,直到发送结束

isTxInt=0跳出,在超级终端上可看到发给它的字符 */ } // UART0接收中断实验,UART0接收从键盘上输入的字符,按ENTER键接收结束 isRxInt=1;//接收中断标志,接收结束,isRxInt=0 uart0RxStr=(char *)UARTBUFFER;// 接收字串缓冲区首地址设定 Uart_Printf("\n[Uart channel 0 Rx Interrupt Test]:\n");//提示 Uart_Printf("After typing ENTER key, you will see the characters which was typed by you."); Uart_Printf("\nTo quit, press ENTER key.!!!\n"); Uart_TxEmpty(0) ;/*等,直到发送缓冲器空,(等上面发送的最后一个字符被对方取走,才进行接收实验)*/ pISR_UART0 =(unsigned)Uart0_RxIntOrErr;// 设中断向量,即接收中断服务程序入口 rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); //正常接收,无效验,一个停止位,8个数据位 rUCON0 &= 0x400; //选 UCLK rUCON0|= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1); //选时钟,发送,接收中断

ClearPending(BIT_UART0); //清UART0中断挂起 rINTMSK=~(BIT_UART0); //中断打开 rSUBSRCPND=(BIT_SUB_TXD0|BIT_SUB_RXD0|BIT_SUB_ERR0); rINTSUBMSK=~(BIT_SUB_RXD0|BIT_SUB_ERR0);// 子中断打开 while(isRxInt); /* 从此处进入中断,中断结束又返回这里等下次中断,直到接收结束isRxInt=0跳出 */ rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_ERR0);// 中断结束,屏蔽子中断(0通道接收位) rINTMSK|=(BIT_UART0); //中断结束,屏蔽总中断(0通道UART位) Uart_Printf("%s\n",(char *)UARTBUFFER);//打印接收的字符串,实际就是在终端上显示

Uart_Port_Return(); //恢复口状态 } //-------------------------------------------------------------------------------------------------------------- // UART初始化 void Uart_Init(int pclk,int baud) { int i; static int whichUart=0; if(pclk == 0) pclk = PCLK; //UART0 rULCON0 = 0x3; //正常模式,无效验,1个停止位,8个数据位 rUCON0 = 0x245; [10] [9] [8] [7] [6] [5] [4] [3:2] [1:0] //Clock Sel, Tx Int, Rx Int, Rx Time Out, Rx err, Loop-back, Send break, Transmit Mode, Receive Mode

// 0 1 0 0 1 0 0 01 01 // PCLK Level Pulse Disable Generate Normal Normal Interrupt or Polling rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 ); // 波特率因子 } //-------------------------------------------------------------------------------------------------------------- // UART实验主程序 //------------------------------------------------------------------------------------------------------------- void main(void) { Uart_Init(0,115200);// UART初始化 Test_Uart0_Int();/* 该程序同时完成发送中断实验和接收中断实验,发送的字符串由发送程序设定。接收的字符串由键盘发出,按ENTER结束接收。先做发送,后做接收 */