K60-UART 串口通信讲解_第1页
K60-UART 串口通信讲解_第2页
K60-UART 串口通信讲解_第3页
K60-UART 串口通信讲解_第4页
K60-UART 串口通信讲解_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章 异步串行通信2012.01主要知识点主要知识点异步串行通信的通用基础知识异步串行通信的通用基础知识4.1UARTUART模块功能概述模块功能概述4.2K60的UART模块的编程结构4.3K60的UART构件设计概述4.4以查询方式接收的UART模块测试实例4.54.6以中断方式接收的UART模块测试实例4.1 异步串行通信的通用基础知识4.1.1 串行通信的基本概念 异步串行通信的格式 通用异步收发器(通用异步收发器(Universal Asynchronous Universal Asynchronous Receiver/TransmittersReceiver/Transmitt

2、ers,UARTUART)通常采用)通常采用NRZNRZ数据格式数据格式, , 其英文译为其英文译为“标准不归零传号标准不归零传号/ /空号数据格式空号数据格式”, ,“不归零不归零”的最初含义是:用正、负电平表示二进制值,不使用零电的最初含义是:用正、负电平表示二进制值,不使用零电平。平。“mark/space”mark/space”即即“传号传号/ /空号空号”分别是表示两种状分别是表示两种状态的物理名称,逻辑名称记为态的物理名称,逻辑名称记为“1/0”1/0”。下图给出了。下图给出了8 8位数位数据、无校验情况的传送格式据、无校验情况的传送格式 串行通信数据格式串行通信数据格式 串行通信

3、的波特率l 串行通信的波特率单位是位串行通信的波特率单位是位/ /秒,记为秒,记为bpsbps。通常情况下,波特。通常情况下,波特率的单位可以省略。通常使用的波特率有率的单位可以省略。通常使用的波特率有300300、600600、900900、12001200、18001800、24002400、48004800、96009600、1920019200、3840038400、5760057600、115200115200等等 奇偶校验l 字符奇偶校验检查(字符奇偶校验检查(character parity checkingcharacter parity checking)称为垂直冗)称为垂直

4、冗余检查(余检查( vertical redundancy checkingvertical redundancy checking,VRCVRC),它是每个字符),它是每个字符增加一个额外位使字符中增加一个额外位使字符中“1”1”的个数为奇数或偶数。的个数为奇数或偶数。l 奇校验:如果字符数据位中奇校验:如果字符数据位中“1”1”的数目是偶数,校验位应为的数目是偶数,校验位应为“1”1”,如果,如果“1”1”的数目是奇数,校验位应为的数目是奇数,校验位应为“0”0”。l 偶校验:如果字符数据位中偶校验:如果字符数据位中“1”1”的数目是偶数,则校验位应为的数目是偶数,则校验位应为“0”0”,

5、如果是奇数则为,如果是奇数则为“1”1”4.1 异步串行通信的通用基础知识 串行通信的传输方式l 单工(单工(SimplexSimplex):数据传送是单向的,一端为发送):数据传送是单向的,一端为发送端,另一端为接收端。这种传输方式中,除了地线之外,端,另一端为接收端。这种传输方式中,除了地线之外,只要一根数据线就可以了。有线广播就是单工的。只要一根数据线就可以了。有线广播就是单工的。l 全双工(全双工(Full-duplexFull-duplex):数据传送是双向的,且可):数据传送是双向的,且可以同时接收与发送数据。这种传输方式中,除了地线之以同时接收与发送数据。这种传输方式中,除了地线

6、之外,需要两根数据线,站在任何一端的角度看,一根为外,需要两根数据线,站在任何一端的角度看,一根为发送线,另一根为接收线。一般情况下,发送线,另一根为接收线。一般情况下,MCUMCU的异步串行的异步串行通信接口均是全双工的。通信接口均是全双工的。l 半双工(半双工(Half-duplexHalf-duplex):数据传送也是双向的,但):数据传送也是双向的,但是在这种传输方式中,除了地线之外,一般只有一根数是在这种传输方式中,除了地线之外,一般只有一根数据线。任何一个时刻,只能由一方发送数据,另一方接据线。任何一个时刻,只能由一方发送数据,另一方接收数据,不能同时收发。收数据,不能同时收发。4

7、.1 异步串行通信的通用基础知识4.1.2 RS-232总线标准 串行传输标准l M C UM C U 引 脚 输 入引 脚 输 入 / / 输 出 一 般 使 用输 出 一 般 使 用 T T LT T L ( T r a n s i s t o r T r a n s i s t o r Transistor LogicTransistor Logic)电平,即晶体管)电平,即晶体管- -晶体管逻辑电平,它晶体管逻辑电平,它适用于板内数据传输。为使信号传输得更远,美国电子工业适用于板内数据传输。为使信号传输得更远,美国电子工业协会协会EIAEIA(Electronic Industry A

8、ssociationElectronic Industry Association)制订了串行)制订了串行物理接口标准物理接口标准RS-232CRS-232C。逻辑“0“逻辑”1”传输距离TTL小于0.4V大于2.4V5mRS-232C+3V+15V-15V-3V30m4.1 异步串行通信的通用基础知识上图为上图为9 9芯串行接口排列芯串行接口排列引脚号引脚号功能功能引脚号引脚号功能功能1 1接收线信号检测接收线信号检测( (载波检载波检测测DCD)DCD)6 6数据通信设备准备就绪数据通信设备准备就绪(DSR)(DSR)2 2接收数据线接收数据线(RXD)(RXD)7 7请求发送请求发送(R

9、TS)(RTS)3 3发送数据线发送数据线(TXD)(TXD)8 8允许发送允许发送(CTS)(CTS)4 4数据终端准备就绪数据终端准备就绪(DTR)(DTR)9 9振铃指示振铃指示5 5信号地信号地(SG)(SG)9 9芯串行接口引脚含义表芯串行接口引脚含义表4.1.3 RS-232C串行接口串行接口4.1 异步串行通信的通用基础知识4.1.4 TTL电平到RS-232电平转换电路具有SCI接口的MCU,一般具有发送引脚(TxD)与接收引脚(RxD),不同公司或不同系列的MCU,使用的引脚缩写名可能不一致,但含义相同。SCI的外围硬件电路,主要目的是将MCU的发送引脚TxD与接收引脚RxD

10、的TTL电平,通过RS-232电平转换芯片转换为RS-232电平。下图给出一个基本SCI电平转换电路及芯片MAX232引脚图MAX232MAX232引脚引脚 串行通信接口电平转换电路串行通信接口电平转换电路4.1 异步串行通信的通用基础知识uMAX232芯片进行电平转换基本原理是:l发送过程:发送过程:MCUMCU的的TXDTXD(TTLTTL电平)经过电平)经过MAX232MAX232的的1111脚脚(T1IN)(T1IN)送到送到MAX232MAX232内部,在内部内部,在内部TTLTTL电平被电平被“提升提升”为为232232电平,通过电平,通过1414脚脚(T1OUT)(T1OUT)发

11、送出去发送出去l接收过程:外部接收过程:外部232232电平经过电平经过MAX232MAX232的的1313脚(脚(R1INR1IN)进入)进入到到MAX232MAX232的内部,在内部的内部,在内部232232电平被电平被“降低降低”为为TTLTTL电平,电平,经过经过1212脚(脚(R1OUTR1OUT)送到)送到MCUMCU的的RXDRXD,进入,进入MCUMCU内内组别组别TTLTTL电平引脚电平引脚方向方向典型接口典型接口232232电平引脚电平引脚方向方向典型接口典型接口1 11111(T1INT1IN)1212(R1OUTR1OUT)输入输入输出输出接接MCUMCU的的TXDTX

12、D接接MCUMCU的的RXDRXD13131414输入输入输出输出接到接到9 9芯接口的芯接口的2 2脚脚RXDRXD接到接到9 9芯接口的芯接口的3 3脚脚TXDTXD2 21010(T2INT2IN)9 9(R2OUTR2OUT)输入输入输出输出接接MCUMCU的的TXDTXD接接MCUMCU的的RXDRXD8 87 7输入输入输出输出接到接到9 9芯接口的芯接口的2 2脚脚RXDRXD接到接到9 9芯接口的芯接口的3 3脚脚TXDTXDMAX232MAX232芯片输入输出引脚分类与基本接法芯片输入输出引脚分类与基本接法4.1 异步串行通信的通用基础知识4.2 UART模块功能 基本原理角

13、度l 串行通信接口的主要功能是:接收时,把外部的单线输入的数据变成一个字节的并行数据送入MCU内部;发送时,把需要发送的一个字节的并行数据转换为单线输出。接受引脚接受引脚RxD 发送引脚发送引脚TxD发送移位寄存器发送移位寄存器接受移位寄存器接受移位寄存器UARTUART数据数据寄存器寄存器MCUMCU内部总线内部总线UARTUART控制控制寄存器寄存器UARTUART状态状态寄存器寄存器UARTUART波特波特率率寄存器寄存器4.2 UART模块功能 程序员角度看l K60K60包括包括6 6个相同且独立的个相同且独立的UARTUART模块,每个模块都含有模块,每个模块都含有相互独立的发送器

14、和接收器。相互独立的发送器和接收器。v 1外部引脚l UARTUART的外部引脚有:发送数据引脚:的外部引脚有:发送数据引脚:UTXDxUTXDx、接收数据引脚:、接收数据引脚:URXDxURXDx。“x x”表示模块的编号,取值为表示模块的编号,取值为0 05 5。v 2波特率发生器l UART0UART0和和UART1UART1时钟源为内核时钟,时钟源为内核时钟,UART2UART2UART5UART5的时钟源为外设的时钟源为外设时钟(总线时钟)。波特率由一个时钟(总线时钟)。波特率由一个1313位的模数计数器和一个位的模数计数器和一个5 5位的分位的分数微调计数器共同决定。数微调计数器共

15、同决定。 13 13位的位的SBRSBRSBRSBR范围为范围为1 181918191,它决定了,它决定了模块的时钟分频。微调计数器给波特率时钟增加一个细微的延时,以模块的时钟分频。微调计数器给波特率时钟增加一个细微的延时,以便匹配系统波特率。便匹配系统波特率。l UART UART波特率波特率 = UART = UART模块时钟模块时钟/(16/(16* *(SBRSBR+BRFA)(SBRSBR+BRFA)4.2 UART模块功能v 收发器的工作l UART发送器和接收器均可容纳8、9或10位数据字符。 发送数据流程 接收数据流程 1 数据寄存器将数据写到发送数据缓冲区2 发送器进行移位发

16、送3 发送缓冲区空标志位S1TDRE 根据设置决定是否产生中断1 一个完整的帧移进接收移位寄存器 帧的数据部分发送到UART接收缓冲区中2 接收缓冲区数据转移到数据寄存器3 接收缓冲区中的数据字数目等于或多于RWFIFORXWATER指定的数目,那么S1RDRF标志位会被置14.3 K604.3 K60的的UARTUART模块编程结构模块编程结构UART模块存储映射寄存器基址寄存器权限复位值UART00 x4006_A000波特率高字节寄存器(UARTx_BDH)读/写0 x000 x4006_A001波特率低字节寄存器(UARTx_BDL)读/写0 x040 x4006_A002控制寄存器1

17、(UARTx_C1)读/写0 x000 x4006_A003控制寄存器2(UARTx_C2)读/写0 x000 x4006_A004状态寄存器1(UARTx_S1)只读0 xC00 x4006_A005状态寄存器2(UARTx_S2)读/写0 x000 x4006_A006控制寄存器3(UARTx_C3)读/写0 x000 x4006_A007数据寄存器((UARTx_D)读/写0 x000 x4006_A008地址匹配寄存器1(UARTx_MA1)读/写0 x000 x4006_A009地址匹配寄存器2(UARTx_MA2)读/写0 x000 x4006_A00A控制寄存器4(UARTx_C

18、4)读/写0 x000 x4006_A00B控制寄存器5(UARTx_C5)读/写0 x000 x4006_A00C扩展数据寄存器(UARTx_ED)只读0 x000 x4006_A00D调制解调器寄存器(UARTx_MODEM)读/写0 x000 x4006_A00E红外寄存器(UARTx_IR)读/写0 x004.3 K604.3 K60的的UARTUART模块编程结构模块编程结构0 x4006_A010FIFO参数寄存器(UARTx_PFIFO)读/写0 x000 x4006_A011FIFO控制寄存器(UARTx_CFIFO)读/写0 x000 x4006_A012FIFO状态寄存器(

19、UARTx_SFIFO)读/写0 xC00 x4006_A013FIFO发送水位寄存器(UARTx_TWFIFO)读/写0 x000 x4006_A014FIFO发送计数寄存器(UARTx_TCFIFO)只读0 x000 x4006_A015FIFO接收水位寄存器(UARTx_RWFIFO)读/写0 x010 x4006_A016FIFO接收计数寄存器(UARTx_RCFIFO)只读0 x000 x4006_A0187816控制数寄存器(UARTx_C7816)读/写0 x000 x4006_A0197816中断使能寄存器(UARTx_IE7816)读/写0 x000 x4006_A01A78

20、16中断状态寄存器(UARTx_IS7816)读/写0 x000 x4006_A01B7816等待参数寄存器(UARTx_WP7816T0)读/写0 x0A0 x4006_A01B7816等待参数寄存器(UARTx_WP7816T1)读/写0 x0A0 x4006_A01C7816等待N寄存器(UARTx_WN7816)读/写0 x000 x4006_A01D7816等待FD寄存器(UARTx_WF7816)读/写0 x010 x4006_A01E7816错误阈值寄存器(UARTx_ET7816)读/写0 x000 x4006_A01F7816发送长度寄存器(UARTx_TL7816)读/写0

21、 x004.4 K60的UART构件设计概述4.4.1UART构件设计概述 以以UARTUART具有初始化、接收和发送三种基本操作为例,来具有初始化、接收和发送三种基本操作为例,来说明实现构件化的全过程说明实现构件化的全过程 实现构件化编程的UART软件模块应当具有以下几个特点:l UARTUART模块是最底层的构件,它主要向上提供三种服务,分别是模块是最底层的构件,它主要向上提供三种服务,分别是UARTUART模块的初始化、接收单个字节和发送单个字节,向下则直模块的初始化、接收单个字节和发送单个字节,向下则直接访问模块寄存器,实现对硬件的直接操作。另外,从现实使接访问模块寄存器,实现对硬件的

22、直接操作。另外,从现实使用角用角度出发,它还需要封装接收出发,它还需要封装接收N N个字节和发送个字节和发送N N个字节的功能个字节的功能函数。函数。 l UARTUART模块在软件上对应模块在软件上对应1 1个个hw_uart.chw_uart.c程序源代码文件和程序源代码文件和1 1个个hw_uart.hhw_uart.h头文件,当需要使用头文件,当需要使用UARTUART构件时,大多数情况下只构件时,大多数情况下只需简单拷贝这两个文件即可,无需对源代码文件和头文件进行需简单拷贝这两个文件即可,无需对源代码文件和头文件进行修改,只有当进行不同芯片之间的移植时,才需要修改头文件修改,只有当进

23、行不同芯片之间的移植时,才需要修改头文件中与硬件相关的宏定义。中与硬件相关的宏定义。l 上层构件或软件在使用该构件时,严格禁止通过全局变量来传上层构件或软件在使用该构件时,严格禁止通过全局变量来传递参数,所有的数据传递都直接通过函数的形式参数来接收。递参数,所有的数据传递都直接通过函数的形式参数来接收。这样做不但使得接口简洁,更加避免了全局变量可能引发的安这样做不但使得接口简洁,更加避免了全局变量可能引发的安全隐患。全隐患。4.4.2 K60的UART构件的函数通过以上分析,可以设计通过以上分析,可以设计UART构件的构件的8个基本功能函数。个基本功能函数。(1)初始化:)初始化:uint8

24、hw_uart_init (uint8 uartNo, uint32 baud);(2)接收单个字节:)接收单个字节:uint8 hw_uart_re1 (uint8 uartNo,uint8 *fp);(3)发送单个字节:)发送单个字节:uint8 hw_uart_send1(uint8 uartNo, uint8 ch);(4)接收)接收N个字节:个字节:uint8 hw_uart_reN (uint8 uartNo ,uint16 len ,uint8* buff);(5)发送)发送N个字节:个字节:uint8 hw_uart_sendN (uint8 uartNo ,uint16 le

25、n ,uint8* buff);(6)发送字符串:)发送字符串:uint8 hw_uart_send_string(uint8 uartNo, void *buff);(7)使能串口接收中断:)使能串口接收中断:void hw_uart_enable_re_int(uint8 uartNo);(8)禁止串口接收中断:)禁止串口接收中断:void hw_uart_disable_re_int(uint8 uartNo);4.4 K60的UART构件设计概述4.4.3 K60的UART的头文件l 与与UART通信子函数相关的文件有头文件通信子函数相关的文件有头文件hw_uart.h,以,以及包含及

26、包含UART初始化和收发子函数的程序文件初始化和收发子函数的程序文件hw_uart.c。l 头文件头文件hw_uart.h中的内容可分为两个主要的部分,它们中的内容可分为两个主要的部分,它们分别是分别是8个函数原型的声明和外设模块寄存器相关信息的个函数原型的声明和外设模块寄存器相关信息的定义。前者给出了本定义。前者给出了本UART构件对上层构件或软件所提供构件对上层构件或软件所提供的接口函数,而后者则指明了本的接口函数,而后者则指明了本“元构件元构件”与具体硬件相与具体硬件相关的信息。关的信息。l 这样设计,应用程序和上层构件在使用(调用)它时,将这样设计,应用程序和上层构件在使用(调用)它时

27、,将具有极大的灵活性。具有极大的灵活性。4.4 K60的UART构件设计概述4.5以查询方式接收的UART模块测试实例 程序查询方式l 程序查询方式是一种程序直接控制方式程序查询方式是一种程序直接控制方式,这是主机与外设这是主机与外设间进行信息交换的最简单的方式间进行信息交换的最简单的方式,输入和输出完全是通过输入和输出完全是通过MCU执行程序来完成的。一旦某一外设被选中并启动后,执行程序来完成的。一旦某一外设被选中并启动后,主机将查询这个外设的某些状态位,看其是否准备就绪?主机将查询这个外设的某些状态位,看其是否准备就绪?若外设未准备就绪,主机将再次查询;若外设已准备就绪,若外设未准备就绪,

28、主机将再次查询;若外设已准备就绪,则执行一次则执行一次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_stri

29、ng(UART_TEST, Hello World! rn); /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模块测试实例l UART模块首先向PC机发送字符串,然后等待接收PC机从串口发送来的数据,若成功接收到1个数据,则立即将该数据回发给PC机,随后继续等待接收1个数据并回发,如此循环。下图给出的是串口

30、测试情况。串口调试工具软件界面串口调试工具软件界面4.6 以中断方式接收的UART模块测试实例中断方式的基本概念l 在程序中断方式中某一外设的数据准备就绪后,它在程序中断方式中某一外设的数据准备就绪后,它“主主动动”向向CPU发出请求中断的信号,请求发出请求中断的信号,请求CPU暂时中断日前暂时中断日前的工作而进行数据交换当的工作而进行数据交换当CPU响应这个中断时便暂停响应这个中断时便暂停运行主程序,并自动转移到该设备的中断服务程序当中运行主程序,并自动转移到该设备的中断服务程序当中断服务程序结束以后断服务程序结束以后CPU又回到原来的主程序又回到原来的主程序l 中断与异常的含义中断与异常的

31、含义l 中断服务例程中断服务例程ISRISRl 中断源与中断向量表中断源与中断向量表l 中断优先级中断优先级l 可屏蔽中断与不可屏蔽中断可屏蔽中断与不可屏蔽中断l 中断处理的一般过程中断处理的一般过程4.6 以中断方式接收的UART模块测试实例 堆栈的使用 K60CPU的中断过程的详细说明 中断的关闭与开启方法 中断的处理过程一般为: 关中断、保护现场、 执行中断服务程序、 恢复现场、开中断等中断过程中断过程CPUCPU中寄存器进出栈情况中寄存器进出栈情况 在CW10.1环境下使用中断的步骤是:l 在在main.c中,依照中,依照“关总中断关总中断开模块中断开模块中断开总中断开总中断”的顺序的

32、顺序打开模块中断;打开模块中断;l 在在isr.c文件中,编写中断服务程序;文件中,编写中断服务程序;l 在在vectors.h文件中,修改中断向量表;文件中,修改中断向量表; 为了方便代码移植,在common.h文件中做了如下定义:l #define EnableInterrupts asm( CPSIE i); /开总中断开总中断l #define DisableInterrupts asm( CPSID i); /关总中断关总中断 AW60的中断编程的可概括为下述3个步骤:l 新建(或者复制)一个新建(或者复制)一个isr.c文件,并加入工程中文件,并加入工程中l 定义中断向量表(复制定

33、义中断向量表(复制isr.c的应修改中断向量表)的应修改中断向量表)l 定义定义ISR并在中断向量表中填入相应并在中断向量表中填入相应ISR的名称的名称4.6 以中断方式接收的UART模块测试实例 UART0接收中断l UART0模块首先向模块首先向PC机发送字符串机发送字符串“Hello World!”;同时,串口等待接收从同时,串口等待接收从PC机发来的数据,一旦接到数据,机发来的数据,一旦接到数据,马上将该数据回发给马上将该数据回发给PC机。串口接收程序使用中断来实机。串口接收程序使用中断来实现,中断处理程序执行完毕后,又回到主程序。现,中断处理程序执行完毕后,又回到主程序。 串口0接收中断服务例程void isr_uart0_re(void) uint8 ch; uint8 flag = 1; DisableInterrupts;/关总中断关总中断 ch = hw_uart_re1(UART_0, &flag); if (0 = flag) hw_uart_send1(UART_0, ch); EnableInt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论