单芯片解决方案,开启全新体验——W55MH32 高性能以太网单片机
W55MH32是WIZnet重磅推出的高性能以太网单片机,它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身,具体来说,一颗W55MH32内置高性能Arm® Cortex-M3核心,其主频最高可达216MHz;配备1024KB FLASH与96KB SRAM,满足存储与数据处理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP协议栈、内置MAC以及PHY,拥有独立的32KB以太网收发缓存,可供8个独立硬件socket使用。如此配置,真正实现了All-in-One解决方案,为开发者提供极大便利。
在封装规格上,W55MH32 提供了两种选择:QFN100和QFN68。
W55MH32L采用QFN100封装版本,尺寸为12x12mm,其资源丰富,专为各种复杂工控场景设计。它拥有66个GPIO、3个ADC、12通道DMA、17个定时器、2个I2C、5个串口、2个SPI接口(其中1个带I2S接口复用)、1个CAN、1个USB2.0以及1个SDIO接口。如此丰富的外设资源,能够轻松应对工业控制中多样化的连接需求,无论是与各类传感器、执行器的通信,还是对复杂工业协议的支持,都能游刃有余,成为复杂工控领域的理想选择。 同系列还有QFN68封装的W55MH32Q版本,该版本体积更小,仅为8x8mm,成本低,适合集成度高的网关模组等场景,软件使用方法一致。更多信息和资料请进入http://www.w5500.com/网站或者私信获取。
此外,本W55MH32支持硬件加密算法单元,WIZnet还推出TOE+SSL应用,涵盖TCP SSL、HTTP SSL以及 MQTT SSL等,为网络通信安全再添保障。
为助力开发者快速上手与深入开发,基于W55MH32L这颗芯片,WIZnet精心打造了配套开发板。开发板集成WIZ-Link芯片,借助一根USB C口数据线,就能轻松实现调试、下载以及串口打印日志等功能。开发板将所有外设全部引出,拓展功能也大幅提升,便于开发者全面评估芯片性能。
若您想获取芯片和开发板的更多详细信息,包括产品特性、技术参数以及价格等,欢迎访问官方网页:http://www.w5500.com/,我们期待与您共同探索W55MH32的无限可能。
第十四章 USART——串口通讯
目录
本章参考资料:《W55MH32-参考手册》USART章节。
学习本章时,配合《W55MH32-参考手册》USART章节一起阅读, 效果会更佳,特别是涉及到寄存器说明的部分。特别说明,本书内容是以W55MH32系列控制器资源讲解。
1 串口通讯协议简介
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式, 电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;W55MH32标准库则是在寄存器与用户代码之间的软件层。 对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性, 确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。 简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。
下面我们分别对串口通讯协议的物理层及协议层进行讲解。
1.1 物理层
串口通讯的物理层有很多标准及变种,我们主要讲解RS-232标准 ,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。
使用RS-232标准的串口设备间常见的通讯结构见下图,串口通讯结构图 :
在上面的通讯方式中,两个通讯设备的“DB9接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。 由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL标准”的电平信号,才能实现通讯。
1.1.1 电平标准
根据通讯使用的电平标准不同,串口通讯可分为TTL标准及RS-232标准,见下表, TTL电平标准与RS232电平标准 :
通讯标准 | 电平标准 (发送端) |
5V TTL | 逻辑 1:2.4V–5V 逻辑 0:0~0.5V |
RS-232 | 逻辑 1:-15V~-3V 逻辑 0:+3V~+15V |
我们知道常见的电子电路中常使用TTL的电平标准,理想状态下,使用5V表示二进制逻辑1,使用0V表示逻辑0; 而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V表示逻辑1,+15V表示逻辑0。 使用RS232与TTL电平校准表示同一个信号时的对比见下图,RS-232与TTL电平标准下表示同一个信号 :
因为控制器一般使用TTL电平标准,所以常常会使用MAX3232芯片对TTL及RS-232电平的信号进行互相转换。
1.1.2 RS-232信号线
在最初的应用中,RS-232串口标准常用于计算机、路由与调制调解器(MODEN,俗称“猫”)之间的通讯 ,在这种通讯系统中, 设备被分为数据终端设备DTE(计算机、路由)和数据通讯设备DCE(调制调解器)。我们以这种通讯模型讲解它们的信号线连接方式及各个信号线的作用。
在旧式的台式计算机中一般会有RS-232标准的COM口(也称DB9接口),见下图,电脑主板上的COM口及串口线 :
其中接线口以针式引出信号线的称为公头,以孔式引出信号线的称为母头。在计算机中一般引出公头接口,而在调制调解器设备中引出的一般为母头,使用上图中的串口线即可把它与计算机连接起来。通讯时,串口线中传输的信号就是使用前面讲解的RS-232标准调制的。
在这种应用场合下,DB9接口中的公头及母头的各个引脚的标准信号线接法见下图,DB9标准的公头及母头接法见下表,DB9信号线说明 :
序号 | 名称 | 符号 | 数据方向 | 说明 |
1 | 载波检测 | DCD | DTE→DCE | Data Carrier Detect,数据载波检测,用于 DTE 告知对方,本机是否收到对方的载波信号 |
2 | 接收数据 | RXD | DTE←DCE | Receive Data,数据接收信号,即输入。 |
3 | 发送数据 | TXD | DTE→DCE | Transmit Data,数据发送信号,即输出。两个设备之间的 TXD 与 RXD 应交叉相连 |
4 | 数据终端 (DTE) 就绪 | DTR | DTE→DCE | Data Terminal Ready,数据终端就绪,用于 DTE 向对方告知本机是否已准备好 |
5 | 信号地 | GND | - | 地线,两个通讯设备之间的地电位可能不一样,这会影响收发双方的电平信号,所以两个串口设备之间必须要使用地线连接,即共地。 |
6 | 数据设备 (DCE) 就绪 | DSR | DTE←DCE | Data Set Ready,数据发送就绪,用于 DCE 告知对方本机是否处于待命状态 |
7 | 请求发送 | RTS | DTE→DCE | Request To Send,请求发送,DTE 请求 DCE 本设备向 DCE 端发送数据 |
8 | 允许发送 | CTS | DTE←DCE | Clear To Send,允许发送,DCE 回应对方的 RTS 发送请求,告知对方是否可以发送数据 |
9 | 响铃指示 | RI | DTE←DCE | Ring Indicator,响铃指示,表示 DCE 端与线路已接通 |
上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连, 所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用“直通型”的串口线连接起来即可, 见下图,计算机与调制调解器的信号线连接 :
串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。 例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。
在目前的其它工业控制使用的串口通讯中,一般只使用RXD、TXD以及GND三条信号线, 直接传输数据信号,而RTS、CTS、DSR、DTR及DCD信号都被裁剪掉了。
1.2 协议层
串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口。在串口通讯的协议层中, 规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据, 其组成见下图,串口数据包的基本组成 :
1.2.1 波特率
本章中主要讲解的是串口异步通讯,异步通讯中由于没有时钟信号(如前面讲解的DB9接口中是没有时钟信号的), 所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码, 图 串口数据包的基本组成 中用虚线分开的每一格就是代表一个码元。常见的波特率为4800、9600、115200等。
1.2.2 通讯的起始和停止信号
串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑0的数据位表示, 而数据包的停止信号可由0.5、1、1.5或2个逻辑1的数据位表示,只要双方约定一致即可。
1.2.3 有效数据
在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为5、6、7或8位长。
1.2.4 数据校验
在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差, 可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)以及无校验(noparity)。
奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个8位长的有效数据为:01101001,此时总共有4个“1”, 为达到奇校验效果,校验位为“1”,最后传输的数据将是8位的有效数据加上1位的校验位总共9位。
偶校验与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数, 比如数据帧:11001010,此时数据帧“1”的个数为4个,所以偶校验位为“0”。
0校验是不管有效数据中的内容是什么,校验位总为“0”,1校验是校验位总为“1”。
2 W55MH32的USART简介
通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备, 可以灵活地与外部设备进行全双工数据交换。 有别于USART还有一个UART(Universal Asynchronous Receiver and Transmitter), 它是在USART基础上裁剪掉了同步通信功能,只有异步通信。 简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。
串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息, 可能还有校验信息。USART就是对这些传输参数有具体规定,当然也不是只有唯一一个参数值,很多参数值都可以自定义设置,只是增强它的兼容性。
USART满足外部设备对工业标准NRZ异步串行数据格式的要求,并且使用了小数波特率发生器, 可以提供多种波特率,使得它的应用更加广泛。USART支持同步单向通信和半双工单线通信;还支持局域互连网络LIN、 智能卡(SmartCard)协议与lrDA(红外线数据协会) SIR ENDEC规范。
USART支持使用DMA,可实现高速数据通信,有关DMA具体应用将在DMA章节作具体讲解。
USART在W55MH32应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个USART通信接口连接电脑, 用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。
3 USART功能框图
USART的功能框图包含了USART最核心内容,掌握了功能框图,对USART就有一个整体的把握, 在编程时就思路就非常清晰。USART功能框图见下图,USART功能框图 :
TX: 发送数据输出引脚。
RX: 接收数据输入引脚。
SW_RX: 数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
nRTS: 请求已发送(Request To Send),n表示低电平有效。如果使能RTS流控制,当USART接收器准备好接收新数据时就会将nRTS变成低电平; 当接收寄存器已满时,nRTS将被设置为高电平。该引脚只适用于硬件流控制。
nCTS: 清除以发送(Clear To Send),n表示低电平有效。如果使能CTS流控制,发送器在发送下一帧数据之前会检测nCTS引脚, 如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
SCLK: 发送器时钟输出引脚。这个引脚仅适用于同步模式。
USART引脚在W55MH32芯片具体分布见下表,W55MH32芯片的USART引脚 :
引脚 | APB2 总线(USART1) | APB1 总线 | |||
USART1 | USART2 | USART3 | UART4 | UART5 | |
TX | PA9 | PA2 | PB10 | PC10 | PC12 |
RX | PA10 | PA3 | PB11 | PC11 | PD2 |
SCLK | PA8 | PA4 | PB12 | ||
nCTS | PA11 | PA0 | PB13 | ||
nRTS | PA12 | PA1 | PB14 |
W55MH32系统控制器有三个USART和两个UART,其中USART1和时钟来源于APB2总线时钟,其最大频率为216MHz, 其他四个的时钟来源于APB1总线时钟,其最大频率为108MHz。UART只是异步传输功能,所以没有SCLK、nCTS和nRTS功能引脚。
数据寄存器
USART数据寄存器(USART_DR)只有低9位有效,并且第9位数据是否有效要取决于USART控制寄存器1(USART_CR1)的M位设置, 当M位为0时表示8位数据字长,当M位为1表示9位数据字长,我们一般使用8位数据字长。
USART_DR包含了已发送的数据或者接收到的数据。USART_DR实际是包含了两个寄存器,一个专门用于发送的可写TDR, 一个专门用于接收的可读RDR。当进行发送操作时,往USART_DR写入数据会自动存储在TDR内;当进行读取操作时,向USART_DR读取数据会自动提取RDR数据。
TDR和RDR都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把TDR内容转移到发送移位寄存器, 然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到RDR。
USART支持DMA传输,可以实现高速数据传输,具体DMA使用将在DMA章节讲解。
控制器
USART有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。 使用USART之前需要向USART_CR1寄存器的UE位置1使能USART,UE位用来开启供给给串口的时钟。
发送或者接收数据字长可选8位或9位,由USART_CR1的M位控制。
发送器
当USART_CR1寄存器的发送使能位TE置1时,启动数据发送,发送移位寄存器的数据会在TX引脚输出, 低位在前,高位在后。如果是同步模式SCLK也输出时钟信号。
一个字符帧发送需要三个部分:起始位+数据帧+停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间; 数据帧就是我们要发送的8位或9位数据,数据是从最低位开始传输的;停止位是一定时间周期的高电平。
停止位时间长短是可以通过USART控制寄存器2(USART_CR2)的STOP[1:0]位控制,可选0.5个、1个、1.5个和2个停止位。 默认使用1个停止位。2个停止位适用于正常USART模式、单线模式和调制解调器模式。0.5个和1.5个停止位用于智能卡模式。
当选择8位字长,使用1个停止位时,具体发送字符时序图见下图,字符发送时序图 :
当发送使能位TE置1之后,发送器开始会先发送一个空闲帧(一个数据帧长度的高电平),接下来就可以往USART_DR寄存器写入要发送的数据。 在写入最后一个数据后,需要等待USART状态寄存器(USART_SR)的TC位为1,表示数据传输完成,如果USART_CR1寄存器的TCIE位置1,将产生中断。
在发送数据时,编程的时候有几个比较重要的标志位我们来总结下:
名称 | 描述 |
TE | 发送使能 |
TXE | 发送寄存器为空,发送单个字节的时候使用 |
TC | 发送完成,发送多个字节数据的时候使用 |
TXIE | 发送完成中断使能 |
接收器
如果将USART_CR1寄存器的RE位置1,使能USART接收,使得接收器在RX线开始搜索起始位。 在确定到起始位后就根据RX线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器数据移到RDR内, 并把USART_SR寄存器的RXNE位置1,同时如果USART_CR2寄存器的RXNEIE置1的话可以产生中断。
在接收数据时,编程的时候有几个比较重要的标志位我们来总结下:
名称 | 描述 |
RE | 接收使能 |
RXNE | 读数据寄存器非空 |
RXNEIE | 接收完成中断使能 |
小数波特率生成
波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特。 比特率指单位时间内传输的比特数,单位bit/s(bps)。对于USART波特率与比特率相等,以后不区分这两个概念。波特率越大,传输速率越快。
USART的发送器和接收器使用相同的波特率。计算公式如下:
其中,fPLCK为USART时钟, USARTDIV是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。 其中DIV_Mantissa[11:0]位定义USARTDIV的整数部分,DIV_Fraction[3:0]位定义USARTDIV的小数部分。
例如:DIV_Mantissa=24(0x18),DIV_Fraction=10(0x0A),此时USART_BRR值为0x18A; 那么USARTDIV的小数位10/16=0.625;整数位24,最终USARTDIV的值为24.625。
如果知道USARTDIV值为27.68,那么DIV_Fraction=16*0.68=10.88,最接近的正整数为11, 所以DIV_Fraction[3:0]为0xB;DIV_Mantissa=整数(27.68)=27,即为0x1B。
波特率的常用值有2400、9600、19200、115200。下面以实例讲解如何设定寄存器值得到波特率的值。
我们知道USART1使用APB2总线时钟,最高可达72MHz,其他USART的最高频率为108MHz。 我们选取USART1作为实例讲解,即fPLCK=216MHz。为得到115200bps的波特率,此时:
115200=21600000016/16∗USARTDIV
解得USARTDIV=117.1875,可算得DIV_Fraction=0.1875*16=3=0x03,DIV_Mantissa=117=0x75,即应该设置USART_BRR的值为0x753。
3.1 校验控制
W55MH32系列控制器USART支持奇偶校验。当使用校验位时,串口传输的长度将是8位的数据帧加上1位的校验位总共9位, 此时USART_CR1寄存器的M位需要设置为1,即9数据位。将USART_CR1寄存器的PCE位置1就可以启动奇偶校验控制, 奇偶校验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收数据时自动验证校验位。 接收数据时如果出现奇偶校验位验证失败,会见USART_SR寄存器的PE位置1,并可以产生奇偶校验中断。
使能了奇偶校验控制后,每个字符帧的格式将变成:起始位+数据帧+校验位+停止位。
3.2 中断控制
USART有多个中断请求事件,具体见下表,USART中断请求 :
中断事件 | 事件标志 | 使能控制位 |
发送数据寄存器为空 | TXE | TXEIE |
CTS 标志 | CTS | CTSIE |
发送完成 | TC | TCIE |
准备好读取接收到的数据 | RXNE | RXNEIE |
检测到上溢错误 | ORE | — |
检测到空闲线路 | IDLE | IDLEIE |
奇偶校验错误 | PE | PEIE |
断路标志 | LBD | LBDIE |
多缓冲通信中的噪声标志、上溢错误和帧错误 | NF/ORE/FE | EIE |
4 USART初始化结构体详解
标准库函数对每个外设都建立了一个初始化结构体,比如USART_InitTypeDef,结构体成员用于设置外设工作参数, 并由外设初始化配置函数,比如USART_Init()调用,这些设定参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。
初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个成员意义基本上就可以对该外设运用自如了。 初始化结构体定义在W55MH32_usart.h文件中,初始化库函数定义在W55MH32_usart.c文件中,编程时我们可以结合这两个文件内注释使用。
USART初始化结构体
typedef struct {
uint32_t USART_BaudRate; // 波特率
uint16_t USART_WordLength; // 字长
uint16_t USART_StopBits; // 停止位
uint16_t USART_Parity; // 校验位
uint16_t USART_Mode; // USART模式
uint16_t USART_HardwareFlowControl; // 硬件流控制
} USART_InitTypeDef;
USART_BaudRate: 波特率设置。一般设置为2400、9600、19200、115200。标准库函数会根据设定值计算得到USARTDIV值,从而设置USART_BRR寄存器值。
USART_WordLength: 数据帧字长,可选8位或9位。它设定USART_CR1寄存器的M位的值。如果没有使能奇偶校验控制,一般使用8数据位;如果使能了奇偶校验则一般设置为9数据位。
USART_StopBits: 停止位设置,可选0.5个、1个、1.5个和2个停止位,它设定USART_CR2寄存器的STOP[1:0]位的值,一般我们选择1个停止位。
USART_Parity: 奇偶校验控制选择,可选USART_Parity_No(无校验)、USART_Parity_Even(偶校验)以及USART_Parity_Odd(奇校验),它设定USART_CR1寄存器的PCE位和PS位的值。
USART_Mode: USART模式选择,有USART_Mode_Rx和USART_Mode_Tx,允许使用逻辑或运算选择两个,它设定USART_CR1寄存器的RE位和TE位。
USART_HardwareFlowControl: 硬件流控制选择,只有在硬件流控制模式才有效,可选有使能RTS、使能CTS、同时使能RTS和CTS、不使能硬件流。
当使用同步模式时需要配置SCLK引脚输出脉冲的属性,标准库使用一个时钟初始化结构体USART_ClockInitTypeDef来设置,该结构体内容也只有在同步模式才需要设置。
USART时钟初始化结构体
typedef struct {
uint16_t USART_Clock; // 时钟使能控制
uint16_t USART_CPOL; // 时钟极性
uint16_t USART_CPHA; // 时钟相位
uint16_t USART_LastBit; // 最尾位时钟脉冲
} USART_ClockInitTypeDef;
USART_Clock: 同步模式下SCLK引脚上时钟输出使能控制,可选禁止时钟输出(USART_Clock_Disable)或开启时钟输出(USART_Clock_Enable);如果使用同步模式发送,一般都需要开启时钟。它设定USART_CR2寄存器的CLKEN位的值。
USART_CPOL: 同步模式下SCLK引脚上输出时钟极性设置,可设置在空闲时SCLK引脚为低电平(USART_CPOL_Low)或高电平(USART_CPOL_High)。它设定USART_CR2寄存器的CPOL位的值。
USART_CPHA: 同步模式下SCLK引脚上输出时钟相位设置,可设置在时钟第一个变化沿捕获数据(USART_CPHA_1Edge)或在时钟第二个变化沿捕获数据。它设定USART_CR2寄存器的CPHA位的值。USART_CPHA与USART_CPOL配合使用可以获得多种模式时钟关系。
USART_LastBit: 选择在发送最后一个数据位的时候时钟脉冲是否在SCLK引脚输出,可以是不输出脉冲(USART_LastBit_Disable)、输出脉冲(USART_LastBit_Enable)。它设定USART_CR2寄存器的LBCL位的值。
5 USART_Rs485
5.1 代码解析
USART1 作为调试终端(接收命令、打印结果),USARTx 作为 RS485 接口(收发数据)。通过轮询方式检测命令和数据,演示了 RS485 总线的基本通信流程。适用于需要 RS485 通信的嵌入式系统开发,可作为工业通信设备(如 Modbus 从机)的原型基础。核心逻辑清晰,依赖自定义的rs485.h驱动实现硬件细节,便于移植和扩展。程序流程如下:
1. 基础配置与依赖
- 头文件:包含标准库、延时驱动(delay.h)、硬件抽象层(W55MH32.h)及自定义 RS485 驱动(rs485.h)。
- 宏定义:DATA_LEN指定通信数据长度(5 字节)。
- 全局变量:USART_TEST指向 USART1(调试串口),rs485buf存储 RS485 收发数据。
2. 主函数流程
- 初始化阶段:系统初始化
- delay_init():初始化延时函数。
- UART_Configuration(115200):配置 USART1(PA9/TX, PA10/RX)为调试串口,波特率 115200。打印系统时钟频率(SYSCLK/HCLK/PCLK1/PCLK2/ADCCLK)。
- RS485 初始化:RS485_Init(9600):配置 RS485 总线(波特率 9600),具体实现(如 GPIO、USART 配置)封装在rs485.h中。
主循环逻辑
int main(void)
{
uint8_t key;
uint8_t rs485buf[5], i;
RCC_ClocksTypeDef clocks;
delay_init();
UART_Configuration(115200);
RCC_GetClocksFreq(&clocks);
printf("\n");
printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n",
(float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,
(float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000);
printf("USART RS485 Test.\n");
RS485_Init(9600); //Initialize RS485
while (1)
{
if (GetCmd() == 's')
{
for (i = 0; i < DATA_LEN; i++)
{
rs485buf[i] = 0x5A + i;
}
RS485_Send_Data(rs485buf, DATA_LEN);
printf("RS485 Send Data Success\n");
}
RS485_Receive_Data(rs485buf, &key);
if (key) //Data received
{
printf("RS485 Recv Data Success\n");
if (key > DATA_LEN) key = DATA_LEN; //The maximum is 5 data.
for (i = 0; i < DATA_LEN; i++)
{
printf("rs485buf[%d] = 0x%x\n", i, rs485buf[i]);
}
}
}
}
命令检测(USART1 输入):通过GetCmd()轮询 USART1 接收缓冲区,检测是否收到字符's'。收到's' 后,生成测试数据(0x5A~0x5E),调用RS485_Send_Data发送。
RS485 数据收发:
- 发送:周期性发送预设数据(如未使用中断,需确保半双工模式下的收发切换)。
- 接收:调用RS485_Receive_Data轮询接收数据,收到后通过 USART1 打印数据内容。
调试输出:通过重定向的printf输出状态信息(如发送成功、接收数据)。
5.2 实验现象
程序初始化成功之后,会打印输出各时钟的频率和串口测试信息,我们发送字符“s”,W55MH32就打印了串口发送成功的消息:
6 补充说明
对于W55M32芯片,各个引脚可以做什么外设功能或者电气特性参数在数据手册 查阅,引脚和外设的功能特性和对应寄存器的使用在 参考手册 查阅。
以下对于W55MH32芯片,当根据数据手册确定要使用某个引脚做某个外设功能时,在参考手册如下查阅外设的GPIO应该如何配置,当对各种配置不了解时以能在手册查阅出的结果为准。
6.1 TIM1/TIM8引脚配置
TIM1/TIM8 引脚 | 配置 | GPIO 配置 |
TIM1/8_CHx | 输入捕获通道 x | 浮空输入 |
TIM1/8_CHx | 输出比较通道 x | 推挽复用输出 |
TIM1/8_CHxN | 互补输出通道 x | 推挽复用输出 |
TIM1/8_BKIN | 刹车输入 | 浮空输入 |
TIM1/8_ETR | 外部触发时钟输入 | 浮空输入 |
6.2 通用定时器TIM2/3/4/5引脚配置
TIM2/3/4/5 引脚 | 配置 | GPIO 配置 |
TIM2/3/4/5_CHx | 输入捕获通道 x | 浮空输入 |
TIM2/3/4/5_CHx | 输出比较通道 x | 推挽复用输出 |
TIM2/3/4/5_ETR | 外部触发时钟输入 | 浮空输入 |
6.3 USART引脚配置
USART 引脚 | 配置 | GPIO 配置 |
USARTx_TX | 全双工模式 | 推挽复用输出 |
USARTx_TX | 半双工同步模式 | 推挽复用输出 |
USARTx_RX | 全双工模式 | 浮空输入或带上拉输入 |
USARTx_RX | 半双工同步模式 | 未用,可作为通用 I/O |
USARTx_CK | 同步模式 | 推挽复用输出 |
USARTx_RTS | 硬件流量控制 | 推挽复用输出 |
USARTx_CTS | 硬件流量控制 | 浮空输入或带上拉输入 |
关于串口中断的使用,以串口1举例,在参考手册、库内定义和启动文件等可以看出 串口1使用 USART1_IRQn 一个中断源,使用 USART1_IRQHandler 一个中断函数,回顾EXIT章节的补充说明有类似意思, 对于串口1这里,如果使能了多个标志位的中断,它们会在各自的时序流程触发中断,因此在中断函数里面用多个GetITStatus函数判断标志并来做此标志的流程操作,查阅手册中的寄存器描述了解各标志位的时序和如何清除标志位等, 某些标志位优先以手册中有描述的软件清除流程而可以不使用ClearFlag函数。
以上补充总结对之后的外设学习也是同样道理,注意对于GPIO配置和外设在不同系列芯片会存在差异,重点在于掌握整体概念,学会在不同芯片的手册中查阅对应内容。