第11章 USART 串口模块[25页]
- 格式:ppt
- 大小:241.50 KB
- 文档页数:25
USR-TCP232-306说明书文件版本:V1.0.1功能特点⏹10/100Mbps自适应以太网接口,支持AUTO-MDIX网线交叉直连自动切换⏹工作模式可选择TCP Server、TCP Client、UDP Client、UDP Server、HTTPD Client⏹串口波特率从600bps到230.4Kbps可设置,支持None、Odd、Even、Mark、Space五种校验⏹自定义心跳包机制,保证连接真实可靠,杜绝死连接⏹自定义注册包机制,检测连接状态,也可做自定义包头,可选用MAC地址做注册包⏹支持RS232和RS485、RS422三种接口。
⏹TCP Server模式下,连接Client的数量可在1到16个之间任意设置,默认4个,已连接Client的IP可显示,按连接计算发送/接收数据。
⏹TCP Server模式下,当连接数量达到最大值时,新连接是否踢掉旧连接可设置⏹支持网页、AT指令、串口协议、网络协议设置参数,提供设置协议,供客户集成到自己的软件中去⏹支持TCP Client短连接功能,短连接断开时间自定义⏹支持超时重启(无数据重启)功能,重启时间自定义⏹TCP连接建立前,数据缓存是否清理可设置⏹DHCP功能,能够自动获取IP⏹MAC地址可修改,出厂烧写全球唯一MAC,支持自定义MAC功能⏹DNS功能,域名解析⏹DNS服务器地址可自定义⏹通过网络升级固件功能,升级固件更加方便⏹支持虚拟串口,配套有人自主开发的USR-VCOM软件⏹同时支持软件和硬件恢复出厂设置⏹可以跨越网关,交换机,路由器运行⏹可以工作在局域网,也可访问外网目录USR-TCP232-306说明书 (1)功能特点 (2)目录 (3)1.快速入门 (5)1.1.硬件测试环境 (6)1.1.1.硬件准备 (6)1.1.2.硬件连接 (6)1.2.网络测试环境 (7)1.3.默认参数测试 (7)2.产品概述 (9)2.1.产品简介 (9)2.2.基本参数 (9)3.硬件参数介绍 (10)3.1.尺寸图 (10)3.2.引脚定义 (10)3.2.1.DB9引脚定义 (10)3.2.2.RS422引脚线序 (10)4.产品功能 (11)4.1.网络基础功能介绍 (11)4.1.1.IP地址/子网掩码/网关 (11)4.1.2.DNS服务器地址 (12)4.1.3.WebServer (13)4.1.4.恢复出厂设置功能 (13)4.1.5.网络升级固件 (13)4.2.Socket工作模式 (13)4.2.1.TCP Client模式 (14)4.2.2.TCP Server模式 (15)4.2.3.UDP Client模式 (15)4.2.4.UDP Server模式 (16)4.2.5.Httpd Client (16)4.2.6.配套软件VCOM(虚拟串口) (18)4.3.串口功能 (18)4.3.1.串口标准 (18)4.3.2.串口基本参数 (18)4.3.3.串口成帧机制 (19)4.3.4.类RFC2217 (19)4.4.特色功能 (20)4.4.1.心跳包功能 (20)4.4.2.注册包 (21)4.4.3.透传云功能 (22)4.4.4.自定义网页功能 (22)4.4.5.Reset功能 (23)4.4.6.Index功能 (24)4.4.7.自定义Client连接数 (25)4.4.8.状态显示 (25)4.4.9.短连接 (26)4.4.10.清除缓存数据 (26)4.4.11.超时重启 (27)4.4.12.自定义MAC (27)4.4.13.指示灯说明 (27)5.参数设置 (29)5.1.网络协议设置参数 (29)5.1.1.设置软件设置参数 (29)5.1.2.设置协议设置参数 (32)5.2.网页设置参数 (32)5.3.AT指令配置 (36)5.3.1.AT指令概述 (36)5.3.2.错误码如下表: (37)5.3.3.AT指令集 (37)6.联系方式 (39)7.免责声明 (39)8.更新历史 (40)1.快速入门USR-TCP232-306模块用于实现串口到以太网口的数据的双向透明传输,用户无需关心具体细节,模块内部完成协议转换。
USART模块寄存器使用说明USART(Universal Synchronous/AsynchronousReceiver/Transmitter)是通用同步/异步收发器,是一种常用的串行通信接口模块。
在使用USART模块之前,需要配置一些寄存器来完成通信的参数设置。
ART控制寄存器(USART_CRx):用于配置发送和接收的参数。
常用的配置包括:- 使能发送和接收功能:通过设置 TE(Transmitter Enable)和 RE (Receiver Enable)位来使能发送和接收功能。
- 配置数据位数:通过设置 M(Mantissa)位来选择发送和接收的数据位数。
- 配置停止位:通过设置 STOP(Stop Bits)位来选择发送和接收的停止位数。
- 配置奇偶校验位:通过设置 PCE(Parity Control Enable)位和PS(Parity Selection)位来选择发送和接收的奇偶校验方式。
- 配置同步/异步模式:通过设置 SYNC(Synchronous mode enable)位来选择同步(同步模式)或异步(异步模式)通信。
ART数据寄存器(USART_DR):用于发送和接收数据。
写入该寄存器的数据将被发送,读取该寄存器可以获取接收到的数据。
ART状态寄存器(USART_SR):用于获取USART模块的状态信息。
常用的状态位包括:- TXE(Transmit Data Register Empty):发送数据寄存器为空。
- RXNE(Read Data Register Not Empty):接收数据寄存器非空。
- FE(Framing Error):帧错误。
- ORE(Overrun Error):溢出错误。
- NE(Noise Error):噪声错误。
ART波特率寄存器(USART_BRR):用于配置通信的波特率。
波特率=时钟频率/(16*USARTDIV)。
ART控制寄存器2(USART_CR2)和寄存器3(USART_CR3):用于配置流控制、硬件流控制、DMA接口等其他功能。
ART串⼝的⼀般应⽤第四章USART串⼝的⼀般应⽤4.1 USART介绍通⽤同步异步收发器(USART),提供了⼀种灵活的⽅法,与使⽤⼯业标准的异步串⾏外部设备之间进⾏全双⼯数据交换。
USART利⽤分数波特率发⽣器提供宽范围的波特率选择。
它⽀持同步单向通信和半双⼯单线通信,也⽀持LIN(局部互连⽹),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。
它还允许多处理器通信。
使⽤多缓冲器配置的DMA⽅式,可以实现⾼速数据通信。
总之,STM32F10x系列芯⽚所提供的USART串⼝功能时分强⼤,基本上所知的串⼝功能,其都能通过硬件来实现。
4.1.1 USART主要特性1》全双⼯异步通信;2》NRZ标准格式;3》分数波特率发⽣器系统,发送和接收共⽤的可编程波特率,最⾼达4.5Mbits/s4》可编程数据字长度(8位或9位)5》可配置的停⽌位-⽀持1或2个停⽌位6》LIN主发送同步断开符的能⼒以及LIN从检测断开符的能⼒,当USART硬件配置成LIN时,⽣成13位断开符;检测10/11位断开符7》发送⽅为同步传输提供时钟8》IRDA SIR 编码器解码器,在正常模式下⽀持3/16位的持续时间9》智能卡模拟功能,智能卡接⼝⽀持ISO7816-3标准⾥定义的异步智能卡协议,智能卡⽤到的0.5和1.5个停⽌位10》单线半双⼯通信11》可配置的使⽤DMA的多缓冲器通信─在SRAM⾥利⽤集中式DMA缓冲接收/发送字节12》单独的发送器和接收器使能位13》检测标志,接收缓冲器满,发送缓冲器空,传输结束标志14》校验控制,发送校验位,对接收数据进⾏校验15》四个错误检测标志。
溢出错误;噪⾳错误;帧错误;校验错误;16》10个带标志的中断源。
CTS改变、LIN断开符检测、发送数据寄存器空、发送完成、接收数据寄存器满、检测到总线为空闲、溢出错误、帧错误、噪⾳错误和校验错误;17》多处理器通信-- 如果地址不匹配,则进⼊静默模式18》从静默模式中唤醒(通过空闲总线检测或地址标志检测)19》两种唤醒接收器的⽅式:地址位(MSB,第9位),总线空闲4.1.2 USART功能概述接⼝通过三个引脚与其他设备连接在⼀起。
stm32串⼝实验:stm32通过usart1进⾏串⼝收发,PA9(TX)和PA10(RX)这是stm32开发中⽐较简单的实验,原理是通过串⼝助⼿发送信息,stm32接收到信息以后在串⼝助⼿中打印相同的内容。
这⾥直接分享keil5⼯程代码,是在⼯程模板的基础上移植和修改了正点原⼦的串⼝代码(如果失效的话可以在下⽅评论留下邮箱,我看到会给你发⼀份)顺便把usart.c和usart.h还有mian.c中的代码复制到下⾯,⼩伙伴可以直接移植到⾃⼰的⼯程中实现的效果也在下⾯放上串⼝助⼿中显⽰的图⽚usart.c1 #include "sys.h"2 #include "usart.h"345//STM32F103核⼼板例程6//库函数版本例程7/********** 出品 ********/8910//////////////////////////////////////////////////////////////////////////////////11//如果使⽤ucos,则包括下⾯的头⽂件即可.12#if SYSTEM_SUPPORT_UCOS13 #include "includes.h"//ucos 使⽤14#endif15//////////////////////////////////////////////////////////////////////////////////16//STM32开发板17//串⼝1初始化1819//////////////////////////////////////////////////////////////////////////////////202122//////////////////////////////////////////////////////////////////23//加⼊以下代码,⽀持printf函数,⽽不需要选择use MicroLIB24#if 125#pragma import(__use_no_semihosting)26//标准库需要的⽀持函数27struct __FILE28 {29int handle;3031 };3233 FILE __stdout;34//定义_sys_exit()以避免使⽤半主机模式35void _sys_exit(int x)36 {37 x = x;38 }39//重定义fputc函数40int fputc(int ch, FILE *f)41 {42while((USART1->SR&0X40)==0);//循环发送,直到发送完毕43 USART1->DR = (u8) ch;44return ch;45 }46#endif4748/*使⽤microLib的⽅法*/49/*50int fputc(int ch, FILE *f)51{52 USART_SendData(USART1, (uint8_t) ch);5354 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}5556 return ch;57}58int GetKey (void) {5960 while (!(USART1->SR & USART_FLAG_RXNE));6162 return ((int)(USART1->DR & 0x1FF));63}64*/6566#if EN_USART1_RX //如果使能了接收67//串⼝1中断服务程序68//注意,读取USARTx->SR能避免莫名其妙的错误69 u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最⼤USART_REC_LEN个字节.70//接收状态71//bit15,接收完成标志72//bit14,接收到0x0d73//bit13~0,接收到的有效字节数⽬74 u16 USART_RX_STA=0; //接收状态标记7576void uart_init(u32 bound){77//GPIO端⼝设置78 GPIO_InitTypeDef GPIO_InitStructure;79 USART_InitTypeDef USART_InitStructure;80 NVIC_InitTypeDef NVIC_InitStructure;8182 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟 83//USART1_TX PA.984 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.985 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;86 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复⽤推挽输出87 GPIO_Init(GPIOA, &GPIO_InitStructure);8889//USART1_RX PA.1090 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;91 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输⼊92 GPIO_Init(GPIOA, &GPIO_InitStructure);9394//Usart1 NVIC 配置9596 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;97 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级398 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //⼦优先级399 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能100 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器101102//USART 初始化设置103104 USART_ART_BaudRate = bound;//⼀般设置为9600;105 USART_ART_WordLength = USART_WordLength_8b;//字长为8位数据格式106 USART_ART_StopBits = USART_StopBits_1;//⼀个停⽌位107 USART_ART_Parity = USART_Parity_No;//⽆奇偶校验位108 USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;//⽆硬件数据流控制109 USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式110111 USART_Init(USART1, &USART_InitStructure); //初始化串⼝112 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断113 USART_Cmd(USART1, ENABLE); //使能串⼝114115 }116117118119void USART1_IRQHandler(void) //串⼝1中断服务程序120 {121 u8 Res;122 #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使⽤ucosII了.123 OSIntEnter();124#endif125if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)126 {127 Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据128129if((USART_RX_STA&0x8000)==0)//接收未完成130 {131if(USART_RX_STA&0x4000)//接收到了0x0d132 {133if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始134else USART_RX_STA|=0x8000; //接收完成了135 }136else//还没收到0X0D137 {138if(Res==0x0d)USART_RX_STA|=0x4000;139else140 {141 USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;142 USART_RX_STA++;143if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收144 }145 }146 }147 }148 #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使⽤ucosII了.149 OSIntExit();150#endif151 }152#endifusart.h1 #ifndef __USART_H2#define __USART_H3 #include "stdio.h"4 #include "sys.h"56//STM32F103核⼼板例程7//库函数版本例程8/********** 出品 ********/910//////////////////////////////////////////////////////////////////////////////////11//STM32开发板12//串⼝1初始化1314#define USART_REC_LEN 200 //定义最⼤接收字节数 20015#define EN_USART1_RX 1 //使能(1)/禁⽌(0)串⼝1接收1617extern u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最⼤USART_REC_LEN个字节.末字节为换⾏符18extern u16 USART_RX_STA; //接收状态标记19//如果想串⼝中断接收,请不要注释以下宏定义20void uart_init(u32 bound);21#endifmain.c1 #include "sys.h"2 #include "delay.h"3 #include "usart.h"45 uint8_t t;6 uint8_t len;7 uint16_t times=0;89int main(void)10 {11 delay_init(); //延时函数初始化12 uart_init(115200); //串⼝初始化为1152001314while(1)15 {16if(USART_RX_STA&0x8000) //USART_RX_STA第⼗六位为1则括号内为1,表⽰接收完数据17 {18 len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度19 printf("\r\n您发送的消息为:\r\n\r\n");20for(t=0;t<len;t++)21 {22 USART_SendData(USART1, USART_RX_BUF[t]);//向串⼝1发送数据23while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束24 }25 printf("\r\n\r\n");//插⼊换⾏26 USART_RX_STA=0;27 }else28 {29 times++;30if(times%500==0)printf("请输⼊数据,以回车键结束\n");31 delay_ms(10);32 }33 }34 }串⼝实验效果图:未发送时发送数据时:祝⼩伙伴们2020加油!。
UART一、串口的历史首先,串口对每一个做硬件和嵌入式软件的人来说,就是一个必备的工具,调试一个带MCU或者CPU的系统。
我们在调试的过程中,一般第一件事情:GPIO点灯,第二件事就是打通串口。
串口是一种非常通用的设备接口,是仪器仪表设备常用的通信接口,常用于远程采集设备数据或者实现远程控制。
串口的开发也比较简单,是很多工程师最喜欢的接口之一。
在完成GPIO点灯之后,一般我们就希望能够实现串口打印的功能,便于我们将一些寄存器信息打印出来便于调试。
由于我个人的特殊经历,对于我来说,串口这东西,仔细写起来,可以写一本书!应该不少于200页。
2008年我刚进华为工作时,碰到了一个特殊的历史时期,嵌入式领域群雄逐鹿。
1、Intel、AMD高调宣称X86系统进入嵌入式领域,要占领PowerPC的市场。
(后来Intel也做到了,通用服务器占领了几乎所有电信核心侧的设备——刀片服务器、机架服务器)。
2、当时,MIPS、ARM、PowerPC还难分伯仲,不过多核ARM不成熟,无法在电信领域广泛应用。
MIPS由于其优异的性价比和高性能展露头角,慢慢由于其较差的质量表现而偃旗息鼓。
3、PowerPC,随着来着其他处理器的压力,也开始推出多核处理器。
我当时的工作是参与X86处理器作为嵌入式的电路开发。
当时碰到一个问题:传统X86作为PC机已经演进得非常成熟的架构。
PC的硬件结构与嵌入式SoC有很大的区别。
CPU下面是北桥负责高速外设、北桥的南面(下面)是南桥负责低速接口外设、然后还有一个SIO负责更低速的外设。
SIO全称叫Super I/O。
超级输入输出芯片(SIO)一般位于主板左下方或者左上方。
主要使用的芯片有Winbond、ITE,它为主板上的标准I/O接口提供控制处理功能。
这里所说的“超级”是指它集成了PS/2键盘、PS/2鼠标、串口COM、并口LPT接口等处理功能,而这些接口都是计算机中的慢速I/O设备。
它们全部位于主板后部右边。