学得越快越好

1、UART串口简介

在单片机应用开发中,串口可以说是最常用的外设之一。

串口最重要的功能是允许单片机和外部设备之间的数据交互。例如,在学习Microsoft Microelectronics的cortex m0时,您可以将开发板连接到计算机上,通过串行调试助手调试程序,并观察程序运行结果。还有许多其他串行端口模块,如蓝牙、NBIOT、GPRS、4G等。使用串行端口驱动,因此熟悉串行端口是嵌入式工程师必备的技术。

接下来,我们将了解如何在ME32F030上驱动串行端口。

在正式学习之前,我们先了解一下UART串口的通信格式。UART的全称是通用异步收发器(UNIVERSAL ASYNCHONOUS RECEIVER/TRANSMITTER)。串行传输数据以字节为单位传输,因此通信速度较慢。但是有线路简单、通信距离远的优点,因此可以使用两条线进行双向通信。一个用于传输,另一个用于接收。因此被广泛应用于工业应用。通信形式也非常简单,如下图所示。

图1 UART数据格式

空闲位:数据线空闲时保持高电平,表示没有数据传输。

开始位:传输数据时,数据线向下拉,表示数据传输开始。

数据位:数据位是实际传输的数据,通常以字节为单位传输数据。也就是说,一次传输8位数据。一般来说,低的在前面,高的在后面。当然也有相反的传输协议,但平时很少见面。

奇偶位:数据的“1”位数的奇偶校验,可以根据需要进行选择。

停止位:数据传输完成标志位。停止位位数可以选择1位、1.5位或2位高级别,通常选择1位停止位。

传输速率:传输速率选择UART数据传输速率,即每秒传输的数据比特数,通常为9600、19200、115200等。

随着计算机的日益升级,现有的没有COM端口的计算机很多,USB接口被广泛使用。所以通过USB-串行芯片解决了这个问题。常用的U串行芯片有CH340、PL2303等。通过该芯片,可以实现串口TTL-USB。

ME32F030开发主板使用PL2303芯片完成串行端口与计算机之间的连接。只需要一根USB电缆。使用前要注意两件事。首先,请先下载并安装PL2303的驱动程序。第二,确保开发主板上的USB跳线帽连接到COM、USB端。正确的连接方法如下:

图2跳线连接

2、UART驱动寄存器

ME32F030提供了两种UART外围设备:UART 0、UART 1。串行接口全部支持红外传输(IrDA)协议功能。时钟全部由SYSAHBCLKCTRL寄存器控制。同时,每个UART都有单独的时钟分割器,产生传输速率,不受系统时钟和PCLK的影响。对应于UART的针脚映射如下:

图3 UART引脚映射

读取引脚的映射后,列出与UART相关的寄存器组,然后逐一说明。

图4 UART寄存器

2-1 UART接收/发送缓冲寄存器

发送UART接收/发送缓冲区

存器包含着 UART 接收到/将发送的字节,接收到的数据和待发送的串口数据都在该寄存器中。

2-2 UART状态寄存器

该寄存器用于提供 UART 接收发送缓存器的状态。大致可以归类为以下几种状态:

发送状态:发送FIFO空、发送FIFO半满、发送FIFO满。

接收状态:接收FIFO空、接收FIFO半满、接收FIFO满。

奇偶校验状态:没有奇偶校验错误,或检测到奇偶错误,写1来清除错误标志。

接收缓存器溢出状态 :用来表明缓存器是否溢出。

2-3 UART控制寄存器

接下来就要着重讲解下UART控制寄存器了。0-5位属于基本的接收、发送中断使位,这里不再累述。

BIT6:奇偶校验中断使能,使能该中断后,当接收到的数据发生奇偶校验错误后,会产生中断通知串口接收发生错误。

BIT7:接收溢出中断使能,使能该中断后,当接收到的数据超出FIFO容量就会产生中断。通知及时取出数据或者清空FIFO。

BIT8:奇偶校验方式选择位,0为偶校验,1为奇校验。这里注意,这只是选择了奇偶校验的方式,但是并不会生效,是否启动校验还需要下面介绍的寄存器。

BIT9:奇偶校验使能位,只有当该位置1才会使能奇偶校验,具体的校验方式由刚才介绍的奇偶校验方式选择位来决定。

BIT10:IRDA传输协议使能位,置1使能。

BIT22:RX接收使能,置1使能。

BIT23:TX发送使能,置1使能。


图5 UART控制寄存器


2-4 UART中断状态寄存器

既然刚才在介绍UART控制寄存器的时候,介绍了不少中断使能控制。肯定就会有相应的中断状态的管理。UART中断状态寄存器从低位开始依次管理着:①、发送结束中断状态,②、接收完成中断状态,③、发送FIFO满中断,④、接收FIFO满中断,⑤、发送FIFO半满中断,⑥、接收FIFO半满中断,⑦、奇偶校验错误中断,⑧、接收溢出中断。


2-5 UART 波特率分频器寄存器

UART 波特率分频器寄存器 (BAUDDIV) 用于时钟分频从而产生相应的波特率。该寄存器可读写。该分频器的时钟源是由UARTnCLKDIV 控制 UART 的波特率源时钟(SCLK)。


图6 UART 波特率分频器寄存器


波特率分频值计算公式:

BAUDDIV = SCLK / UART BAUDRATE

2-6 UART TX/RX FIFO 数据清除寄存器

操作该寄存器可以快速对TX/RX FIFO进行数据清空。


图7 UART TX/RX FIFO 数据清除寄存器


3、UART驱动函数

在例程LIB->common->Drivers->Source文件夹内有uart.c文件,这个就是提供的UART驱动文件,里面包含了一些基本的驱动函数,使用起来十分方便。下面会对每个函数进行讲解。

3-1 UART初始化

在每段源代码的后面,笔者对其进行一下注释,方便大家快速掌握和使用这个函数。这个函数的4个参数的意义如下:

uart:要使能的UART模块,可选UART0、UART1。

baudrate:要设置的串口的波特率。

parityoption:奇偶校验位,可选UART_EVEN_PARITY(奇校验)、 UART_ODD_PARITY(偶校验)、 UART_RX_NO_INT(无校验)。

rxinttriggerlevel:接收中断触发条件。

void UART_Open(UART0_Type *uart, uint32_t baudrate, uint8_t parityoption, uint8_t rxinttriggerlevel) { uint32_t volatile delays;   if (uart==UART0) { //初始化时关闭UART0 IRQ NVIC_DisableIRQ(UART0_IRQn); //使能 UART0 时钟 SYSCON->SYSAHBCLKCTRL_b.UART0_CLK=1; //enable UART0 PCLK SYSCON->UART0CLKDIV_b.DIV = 0x1;      /* divided by 1 */ //复位 UART0 SYSCON->PRESETCTRL_b.UART0_RST_N=0; SYSCON->PRESETCTRL_b.UART0_RST_N=1; } else if (uart==UART1) { //初始化时关闭UART1 IRQ NVIC_DisableIRQ(UART1_IRQn); //使能 UART1 时钟 SYSCON->SYSAHBCLKCTRL_b.UART1_CLK=1; //enable UART1 PCLK SYSCON->UART1CLKDIV_b.DIV = 0x1;      /* divided by 1 */ //复位 UART1 SYSCON->PRESETCTRL_b.UART1_RST_N=0; SYSCON->PRESETCTRL_b.UART1_RST_N=1; } else return ;   //设置波特率   uart->BAUDDIV_b.BAUDDIV = MainClock/baudrate; //设置奇偶校验 if (parityoption==UART_ODD_PARITY) uart->CTRL_b.PARISEL=1; if (parityoption!=UART_NO_PARITY) uart->CTRL_b.PARIEN=1; //设置中断触发条件 if (rxinttriggerlevel==UART_RX_NOT_EMPTY) uart->CTRL_b.RXNEIE=1; if (rxinttriggerlevel==UART_RX_HALF_FULL) uart->CTRL_b.RXHLFIE=1; if (rxinttriggerlevel==UART_RX_FULL) uart->CTRL_b.RXFIE=1; //使能发送和接收功能   uart->CTRL_b.TXEN=1; uart->CTRL_b.RXEN=1; //插入延时 SYS_DelaymS(1); //清空 FIFO uart->FIFOCLR=0xFF;   return; }  

3-2 UART关闭

这段函数用来关闭UART0或者UART1,只需要传入需要关闭的串口即可。

void UART_Close(UART0_Type *uart) { if (uart==UART0) { //关闭UART0_IRQ NVIC_DisableIRQ(UART0_IRQn); //关闭UART0时钟 SYSCON->SYSAHBCLKCTRL_b.UART0_CLK=0; }else if (uart==UART1) { //关闭UART1_IRQ NVIC_DisableIRQ(UART1_IRQn); //关闭UART1时钟 SYSCON->SYSAHBCLKCTRL_b.UART1_CLK=0; } else return ; //关闭相应UART的中断,并清除中断标志 UART_DisableInt(uart); UART_ClearIntFlag(uart); return; }


学习心得2


3-3 UART读取单个字节

这段函数的作用是UART读取单个字节的数据。

uint8_t UART_ByteRead(UART0_Type *uart, uint8_t *data) { if (uart->STATE_b.RXNE) { *data=uart->DATA; return 0; } else return 1; }

3-4 UART连续读取多个字节

UART连续读取串口数据,直到读取到指定长度的数据。

void UART_Read(UART0_Type *uart, uint8_t * rxbuf, uint8_t *readbytes) { uint8_t temp=0; //get all data while ((uart->STATE_b.RXNE)&&((*readbytes)--)) { *rxbuf++=uart->DATA; temp++; } //return number of read *readbytes=temp; return; }

3-5 UART发送单个字节

这段函数的作用是UART发送单个字节的数据。

 uint8_t UART_ByteWrite(UART0_Type *uart, uint8_t data) { if (uart->STATE_b.TXF) return 1; uart->DATA=data; return 0; }

3-6 UART连续发送多个字节

UART连续发送串口数据,直到发送完指定长度的数据。

void UART_Send(UART0_Type *uart, uint8_t * txbuf, uint32_t sendbytes) { while (sendbytes--) { while (uart->STATE_b.TXF); uart->DATA=*txbuf++; } return; }

3-7 UART发送字符串

UART发送一段字符串数据,只需要将要发送的字符串数据首地址传入即可。

void UART_PutString (UART0_Type *uart, uint8_t * str) { while (!(* str=='\0')) { while (uart->STATE_b.TXF); uart->DATA=*str++; } return; }

3-8 UART使能中断

有两个参数项,第一个是选择需要使能的UART,第二个选择触发中断的条件。

void UART_EnableInt(UART0_Type *uart, uint32_t intcon) { uart->CTRL |= intcon; return; }

3-9 UART关闭中断

调用该函数后,所有的串口的中断触发条件都将关闭。

void UART_DisableInt(UART0_Type *uart) { uart->CTRL &= 0xFFFFFF00; return; }


学习心得3


4、串口中断例程

介绍完UART常用的驱动函数,接下来用个小例程来演示下UART的驱动。测试程序的功能是:通过串口助手发送一个字节的数据到单片机,单片机收到该数据后,将该数据通过单片机的串口发送到串口助手。

程序设计思路

首先是对UART0端口的初始化,将IO口复用为串口UART0的TX、RX功能。

随后将UART0初始化为波特率115200,无奇偶校验,接收非空触发中断。

下一步就是使能UART0的中断,中断触发条件为接收FIFO非空。

最后使能UART0_IRQn中断服务子程序。

测试程序的代码如下:

 int main(void) { //UART0 端口初始化 PA_2_INIT(PA_2_TX0); PA_3_INIT(PA_3_RX0); //UART0 寄存器初始化 UART_Open(UART0,115200,UART_NO_PARITY,UART_RX_NOT_EMPTY); UART_EnableInt(UART0,UART_RX_NOT_EMPTY); NVIC_EnableIRQ(UART0_IRQn); while(1) { } } //UART0 中断服务子程序 void UART0_IRQHandler(void) { uint8_t cdata;  //判断中断状态位 if (UART0->INTSTATUS_b.RXNEINT ) { cdata = UART0->DATA; //将接收到的数据返回 UART0->DATA=cdata; } //清除中断状态 UART0->INTSTATUS = 0x0F; }

程序调试

编写完程序,首先要在编译环境下进行编译、连接。没有错误后(最好连警告也没有)。就可以实际连接到电路板进行程序调试运行了。

在实验前需要先确定U转串所使用的的串口号,通过windows的设备管理器中的端口(COM和LPT)查看我们的串口,比如本例中是COM7。


图8 串口端口号选择


接下来打开串口上位机工具,本例使用的是“大傻串口工具”。按照程序中设置的串口参数配置好串口。端口选择COM7,波特率115200,数据位8位,无奇偶校验,1位停止位。最后点击打开串口即可。打开后如图所示:


图9 串口配置


上位机环境配置好之后,接下里就可以下载并仿真程序了。首先我们在UART0_IRQ中断子程序中位置打上断点。随后全速运行程序。


图10 仿真界面


然后我们在上位机发送一个数据进行测试,例如发送一个字节0x11。这时候单片机便会进入串口中断服务程序,并且停止在断点处。这时候我们听过watch窗口看到接收的数据,就是0x11。


图11 数据发送


继续单步运行并退出中断服务程序,这时候我们再去看上位机,发现收到了单片机返回的数据。


图12 数据接收

1.《【板子串口怎么连接电脑】民硅微电子-m0学习笔记07-串行通信详情》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《【板子串口怎么连接电脑】民硅微电子-m0学习笔记07-串行通信详情》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/why/3024168.html