K60-UART 串口通信讲解

K60-UART 串口通信讲解

ID:42978754

大小:806.79 KB

页数:26页

时间:2019-09-26

上传者:xinshengwencai
K60-UART 串口通信讲解_第1页
K60-UART 串口通信讲解_第2页
K60-UART 串口通信讲解_第3页
K60-UART 串口通信讲解_第4页
K60-UART 串口通信讲解_第5页
K60-UART 串口通信讲解_第6页
K60-UART 串口通信讲解_第7页
K60-UART 串口通信讲解_第8页
K60-UART 串口通信讲解_第9页
K60-UART 串口通信讲解_第10页
资源描述:

《K60-UART 串口通信讲解》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

第4章异步串行通信2012.01 主要知识点异步串行通信的通用基础知识4.1UART模块功能概述4.2K60的UART模块的编程结构4.3K60的UART构件设计概述4.4以查询方式接收的UART模块测试实例4.54.6以中断方式接收的UART模块测试实例 4.1异步串行通信的通用基础知识4.1.1串行通信的基本概念异步串行通信的格式通用异步收发器(UniversalAsynchronousReceiver/Transmitters,UART)通常采用NRZ数据格式,其英文译为“标准不归零传号/空号数据格式”,“不归零”的最初含义是:用正、负电平表示二进制值,不使用零电平。“mark/space”即“传号/空号”分别是表示两种状态的物理名称,逻辑名称记为“1/0”。下图给出了8位数据、无校验情况的传送格式串行通信数据格式 串行通信的波特率串行通信的波特率单位是位/秒,记为bps。通常情况下,波特率的单位可以省略。通常使用的波特率有300、600、900、1200、1800、2400、4800、9600、19200、38400、57600、115200等奇偶校验字符奇偶校验检查(characterparitychecking)称为垂直冗余检查(verticalredundancychecking,VRC),它是每个字符增加一个额外位使字符中“1”的个数为奇数或偶数。奇校验:如果字符数据位中“1”的数目是偶数,校验位应为“1”,如果“1”的数目是奇数,校验位应为“0”。偶校验:如果字符数据位中“1”的数目是偶数,则校验位应为“0”,如果是奇数则为“1”4.1异步串行通信的通用基础知识 串行通信的传输方式单工(Simplex):数据传送是单向的,一端为发送端,另一端为接收端。这种传输方式中,除了地线之外,只要一根数据线就可以了。有线广播就是单工的。全双工(Full-duplex):数据传送是双向的,且可以同时接收与发送数据。这种传输方式中,除了地线之外,需要两根数据线,站在任何一端的角度看,一根为发送线,另一根为接收线。一般情况下,MCU的异步串行通信接口均是全双工的。半双工(Half-duplex):数据传送也是双向的,但是在这种传输方式中,除了地线之外,一般只有一根数据线。任何一个时刻,只能由一方发送数据,另一方接收数据,不能同时收发。4.1异步串行通信的通用基础知识 4.1.2RS-232总线标准串行传输标准MCU引脚输入/输出一般使用TTL(TransistorTransistorLogic)电平,即晶体管-晶体管逻辑电平,它适用于板内数据传输。为使信号传输得更远,美国电子工业协会EIA(ElectronicIndustryAssociation)制订了串行物理接口标准RS-232C。逻辑“0“逻辑”1”传输距离TTL小于0.4V大于2.4V5mRS-232C+3V~+15V-15V~-3V30m4.1异步串行通信的通用基础知识 上图为9芯串行接口排列引脚号功能引脚号功能1接收线信号检测(载波检测DCD)6数据通信设备准备就绪(DSR)2接收数据线(RXD)7请求发送(RTS)3发送数据线(TXD)8允许发送(CTS)4数据终端准备就绪(DTR)9振铃指示5信号地(SG)9芯串行接口引脚含义表4.1.3RS-232C串行接口4.1异步串行通信的通用基础知识 4.1.4TTL电平到RS-232电平转换电路具有SCI接口的MCU,一般具有发送引脚(TxD)与接收引脚(RxD),不同公司或不同系列的MCU,使用的引脚缩写名可能不一致,但含义相同。SCI的外围硬件电路,主要目的是将MCU的发送引脚TxD与接收引脚RxD的TTL电平,通过RS-232电平转换芯片转换为RS-232电平。下图给出一个基本SCI电平转换电路及芯片MAX232引脚图MAX232引脚串行通信接口电平转换电路4.1异步串行通信的通用基础知识 MAX232芯片进行电平转换基本原理是:发送过程:MCU的TXD(TTL电平)经过MAX232的11脚(T1IN)送到MAX232内部,在内部TTL电平被“提升”为232电平,通过14脚(T1OUT)发送出去接收过程:外部232电平经过MAX232的13脚(R1IN)进入到MAX232的内部,在内部232电平被“降低”为TTL电平,经过12脚(R1OUT)送到MCU的RXD,进入MCU内组别TTL电平引脚方向典型接口232电平引脚方向典型接口111(T1IN)12(R1OUT)输入输出接MCU的TXD接MCU的RXD1314输入输出接到9芯接口的2脚RXD接到9芯接口的3脚TXD210(T2IN)9(R2OUT)输入输出接MCU的TXD接MCU的RXD87输入输出接到9芯接口的2脚RXD接到9芯接口的3脚TXDMAX232芯片输入输出引脚分类与基本接法4.1异步串行通信的通用基础知识 4.2UART模块功能基本原理角度串行通信接口的主要功能是:接收时,把外部的单线输入的数据变成一个字节的并行数据送入MCU内部;发送时,把需要发送的一个字节的并行数据转换为单线输出。接受引脚RxD发送引脚TxD发送移位寄存器接受移位寄存器UART数据寄存器MCU内部总线UART控制寄存器UART状态寄存器UART波特率寄存器 4.2UART模块功能程序员角度看K60包括6个相同且独立的UART模块,每个模块都含有相互独立的发送器和接收器。1.外部引脚UART的外部引脚有:发送数据引脚:UTXDx、接收数据引脚:URXDx。“x”表示模块的编号,取值为0~5。2.波特率发生器UART0和UART1时钟源为内核时钟,UART2~UART5的时钟源为外设时钟(总线时钟)。波特率由一个13位的模数计数器和一个5位的分数微调计数器共同决定。13位的SBR[SBR]范围为1~8191,它决定了模块的时钟分频。微调计数器给波特率时钟增加一个细微的延时,以便匹配系统波特率。UART波特率=UART模块时钟/(16*(SBR[SBR]+BRFA)) 4.2UART模块功能收发器的工作UART发送器和接收器均可容纳8、9或10位数据字符。发送数据流程接收数据流程1数据寄存器将数据写到发送数据缓冲区2发送器进行移位发送3发送缓冲区空标志位S1[TDRE]根据设置决定是否产生中断1一个完整的帧移进接收移位寄存器帧的数据部分发送到UART接收缓冲区中2接收缓冲区数据转移到数据寄存器3接收缓冲区中的数据字数目等于或多于RWFIFO[RXWATER]指定的数目,那么S1[RDRF]标志位会被置1 4.3K60的UART模块编程结构UART模块存储映射寄存器基址寄存器权限复位值UART00x4006_A000波特率高字节寄存器(UARTx_BDH)读/写0x000x4006_A001波特率低字节寄存器(UARTx_BDL)读/写0x040x4006_A002控制寄存器1(UARTx_C1)读/写0x000x4006_A003控制寄存器2(UARTx_C2)读/写0x000x4006_A004状态寄存器1(UARTx_S1)只读0xC00x4006_A005状态寄存器2(UARTx_S2)读/写0x000x4006_A006控制寄存器3(UARTx_C3)读/写0x000x4006_A007数据寄存器((UARTx_D)读/写0x000x4006_A008地址匹配寄存器1(UARTx_MA1)读/写0x000x4006_A009地址匹配寄存器2(UARTx_MA2)读/写0x000x4006_A00A控制寄存器4(UARTx_C4)读/写0x000x4006_A00B控制寄存器5(UARTx_C5)读/写0x000x4006_A00C扩展数据寄存器(UARTx_ED)只读0x000x4006_A00D调制解调器寄存器(UARTx_MODEM)读/写0x000x4006_A00E红外寄存器(UARTx_IR)读/写0x00 4.3K60的UART模块编程结构0x4006_A010FIFO参数寄存器(UARTx_PFIFO)读/写0x000x4006_A011FIFO控制寄存器(UARTx_CFIFO)读/写0x000x4006_A012FIFO状态寄存器(UARTx_SFIFO)读/写0xC00x4006_A013FIFO发送水位寄存器(UARTx_TWFIFO)读/写0x000x4006_A014FIFO发送计数寄存器(UARTx_TCFIFO)只读0x000x4006_A015FIFO接收水位寄存器(UARTx_RWFIFO)读/写0x010x4006_A016FIFO接收计数寄存器(UARTx_RCFIFO)只读0x000x4006_A0187816控制数寄存器(UARTx_C7816)读/写0x000x4006_A0197816中断使能寄存器(UARTx_IE7816)读/写0x000x4006_A01A7816中断状态寄存器(UARTx_IS7816)读/写0x000x4006_A01B7816等待参数寄存器(UARTx_WP7816T0)读/写0x0A0x4006_A01B7816等待参数寄存器(UARTx_WP7816T1)读/写0x0A0x4006_A01C7816等待N寄存器(UARTx_WN7816)读/写0x000x4006_A01D7816等待FD寄存器(UARTx_WF7816)读/写0x010x4006_A01E7816错误阈值寄存器(UARTx_ET7816)读/写0x000x4006_A01F7816发送长度寄存器(UARTx_TL7816)读/写0x00 4.4K60的UART构件设计概述4.4.1UART构件设计概述以UART具有初始化、接收和发送三种基本操作为例,来说明实现构件化的全过程实现构件化编程的UART软件模块应当具有以下几个特点:UART模块是最底层的构件,它主要向上提供三种服务,分别是UART模块的初始化、接收单个字节和发送单个字节,向下则直接访问模块寄存器,实现对硬件的直接操作。另外,从现实使用角度出发,它还需要封装接收N个字节和发送N个字节的功能函数。UART模块在软件上对应1个hw_uart.c程序源代码文件和1个hw_uart.h头文件,当需要使用UART构件时,大多数情况下只需简单拷贝这两个文件即可,无需对源代码文件和头文件进行修改,只有当进行不同芯片之间的移植时,才需要修改头文件中与硬件相关的宏定义。上层构件或软件在使用该构件时,严格禁止通过全局变量来传递参数,所有的数据传递都直接通过函数的形式参数来接收。这样做不但使得接口简洁,更加避免了全局变量可能引发的安全隐患。 4.4.2K60的UART构件的函数通过以上分析,可以设计UART构件的8个基本功能函数。(1)初始化:uint8hw_uart_init(uint8uartNo,uint32baud);(2)接收单个字节:uint8hw_uart_re1(uint8uartNo,uint8*fp);(3)发送单个字节:uint8hw_uart_send1(uint8uartNo,uint8ch);(4)接收N个字节:uint8hw_uart_reN(uint8uartNo,uint16len,uint8*buff);(5)发送N个字节:uint8hw_uart_sendN(uint8uartNo,uint16len,uint8*buff);(6)发送字符串:uint8hw_uart_send_string(uint8uartNo,void*buff);(7)使能串口接收中断:voidhw_uart_enable_re_int(uint8uartNo);(8)禁止串口接收中断:voidhw_uart_disable_re_int(uint8uartNo);4.4K60的UART构件设计概述 4.4.3K60的UART的头文件与UART通信子函数相关的文件有头文件hw_uart.h,以及包含UART初始化和收发子函数的程序文件hw_uart.c。头文件hw_uart.h中的内容可分为两个主要的部分,它们分别是8个函数原型的声明和外设模块寄存器相关信息的定义。前者给出了本UART构件对上层构件或软件所提供的接口函数,而后者则指明了本“元构件”与具体硬件相关的信息。这样设计,应用程序和上层构件在使用(调用)它时,将具有极大的灵活性。4.4K60的UART构件设计概述 4.5以查询方式接收的UART模块测试实例程序查询方式程序查询方式是一种程序直接控制方式,这是主机与外设间进行信息交换的最简单的方式,输入和输出完全是通过MCU执行程序来完成的。一旦某一外设被选中并启动后,主机将查询这个外设的某些状态位,看其是否准备就绪?若外设未准备就绪,主机将再次查询;若外设已准备就绪,则执行一次I/O操作。 4.5以查询方式接收的UART模块测试实例查询方式主循环for(;;)//主循环{//===========主循环(开始)=====================================================//1.主循环计数到一定的值,使小灯的亮、暗状态切换run_counter++;if(run_counter>=500){run_counter=0;light_change(Light_Run_PORT,Light_Run1);light_change(Light_Run_PORT,Light_Run2);hw_uart_send_string(UART_TEST,"HelloWorld!r ");}//2.串口接收到数据后即刻回发ch=hw_uart_re1(UART_TEST,&uart_flag);if(0==uart_flag){hw_uart_send1(UART_TEST,ch);uart_flag=1;}//===========主循环(结束)======================================================} 4.5以查询方式接收的UART模块测试实例UART模块首先向PC机发送字符串,然后等待接收PC机从串口发送来的数据,若成功接收到1个数据,则立即将该数据回发给PC机,随后继续等待接收1个数据并回发,如此循环。下图给出的是串口测试情况。串口调试工具软件界面 4.6以中断方式接收的UART模块测试实例中断方式的基本概念在程序中断方式中.某一外设的数据准备就绪后,它“主动”向CPU发出请求中断的信号,请求CPU暂时中断日前的工作而进行数据交换.当CPU响应这个中断时.便暂停运行主程序,并自动转移到该设备的中断服务程序.当中断服务程序结束以后.CPU又回到原来的主程序.中断与异常的含义中断服务例程ISR中断源与中断向量表中断优先级可屏蔽中断与不可屏蔽中断中断处理的一般过程 4.6以中断方式接收的UART模块测试实例堆栈的使用K60CPU的中断过程的详细说明中断的关闭与开启方法中断的处理过程一般为:关中断、保护现场、执行中断服务程序、恢复现场、开中断等中断过程CPU中寄存器进出栈情况 在CW10.1环境下使用中断的步骤是:在main.c中,依照“关总中断→开模块中断→开总中断”的顺序打开模块中断;在isr.c文件中,编写中断服务程序;在vectors.h文件中,修改中断向量表;为了方便代码移植,在common.h文件中做了如下定义:#defineEnableInterruptsasm("CPSIEi");//开总中断#defineDisableInterruptsasm("CPSIDi");//关总中断AW60的中断编程的可概括为下述3个步骤:新建(或者复制)一个isr.c文件,并加入工程中定义中断向量表(复制isr.c的应修改中断向量表)定义ISR并在中断向量表中填入相应ISR的名称4.6以中断方式接收的UART模块测试实例 UART0接收中断UART0模块首先向PC机发送字符串“HelloWorld!”;同时,串口等待接收从PC机发来的数据,一旦接到数据,马上将该数据回发给PC机。串口接收程序使用中断来实现,中断处理程序执行完毕后,又回到主程序。串口0接收中断服务例程voidisr_uart0_re(void){uint8ch;uint8flag=1;DisableInterrupts;//关总中断ch=hw_uart_re1(UART_0,&flag);if(0==flag){hw_uart_send1(UART_0,ch);}EnableInterrupts;//开总中断}4.6以中断方式接收的UART模块测试实例 第4章习题1.简要阐述异步串行通信涉及的主要基本概念。2.表征串行通信速度的物理量是什么?串行通信的传输速度有限制吗?3.MCU与PC之间进行串行通信,为什么要进行电平转换?如何进行电平转换?4.给出UART编程的通用模型。5.简述中断的作用与处理过程。6.K60系列MCU都有哪些中断源?7.K60系列MCU的中断执行过程分为哪几个步骤?8.给出K60中断编程框架与基本步骤。 9.用一种高级语言实现PC方串行数据收发的通用程序(要求:从PC方发送数据A到MCU,MCU收到后,判断是否是A,若是,回发给PC机,在PC机显示“串行口正常”,若不是,则在PC机显示:“通信有误”。)10.在上一题测试的基础上编写通信程序,实现如下功能:通过PC机发送一个命令以控制接在PTA0~PTA7口的8个小灯亮暗状态,各个小灯初始状态都为暗,首先进行通信测试,PC机发送“A”,若MCU接收到则8个小灯全亮,并回送字符“A”,虽然MCU接收到但有问题,不是“A”,说明有误码,则4个小灯全亮,并回送字符“0”,否则8个小灯全暗无反应,通信测试成功后进入控制状态,PC机发送字符串“11”,PTA0口灯亮;发送“10”,PTA0口灯暗;发送“21”,PTA1口灯亮;发送“20”,PTA1口灯暗;依此类推,当给PTA口发送“01”,8个小灯全亮,发送“00”,全暗。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭