1. 项目概述与核心价值
如果你正在捣鼓一款基于MC68EZ328微控制器的嵌入式设备,无论是想驱动一个无刷电机、让LED呼吸灯平滑过渡,还是从这颗老芯片里挤出点音频信号,那么PWM(脉冲宽度调制)、定时器和串行接口这三块硬骨头是绕不过去的。MC68EZ328作为摩托罗拉(后来的飞思卡尔)68K家族中面向便携式设备的一款经典微控制器,其外设设计非常典型,理解它对于掌握许多老式或特定领域的嵌入式系统大有裨益。很多人拿到数据手册,看到满屏的寄存器位定义和零散的代码片段就头疼,感觉知识是割裂的。实际上,PWM、定时器和UART/SPI是协同工作的“铁三角”:定时器提供精准的时间基准,PWM利用这个基准生成可控的模拟信号,而串行接口则负责与外界交换控制命令或数据。本文将彻底拆解MC68EZ328的这三个核心模块,不仅告诉你每个寄存器该怎么填,更会深入解释“为什么”要这么配置,并分享在实际调试中积累的、数据手册上不会写的实战经验和避坑指南。无论你是正在维护一个遗留系统,还是在学习经典的微控制器架构,这篇文章都将为你提供从原理到代码的完整路径。
2. MC68EZ328 PWM模块深度解析与实战
脉冲宽度调制本质是一种用数字信号模拟模拟量的巧妙方法。它通过快速开关一个数字引脚,并调整一个周期内高电平(“开”的时间)所占的比例(即占空比),来等效一个平均电压值。例如,一个5V电源、50%占空比的PWM波,其平均输出电压就是2.5V。MC68EZ328的PWM模块就是为高效生成这类信号而设计的,特别适合音频重构这类需要连续、流畅模拟输出的场景。
2.1 PWM模块的时钟链与频率计算
PWM模块的精度和灵活性首先来自于其可配置的时钟链。理解时钟路径是精准控制PWM输出的第一步。
时钟源与分频器:PWM模块的时钟源是PCLK(外设时钟),通常由系统主频分频而来。模块内部包含一个预分频器(Prescaler)和一个后续的分频链。PWMP(周期寄存器)和CLKSEL(时钟选择)字段共同决定了最终的PWM输出频率。
核心公式:PWM输出频率PWMO (Hz) = PCLK (Hz) / (PERIOD + 2)。这里需要特别注意,公式中的分母是(PERIOD + 2),而不是(PERIOD + 1)。这是因为计数器从0开始计数,当计数值达到(PERIOD + 1)时复位,因此一个完整的周期包含了(PERIOD + 2)个时钟 ticks。这是一个常见的易错点,错误的理解会导致实际频率比预期高一倍。
重构频率选择:CLKSEL字段用于选择对PCLK/(PERIOD+2)后的时钟进行二次分频,以得到适合音频等应用的“重构频率”。手册中给出的近似值(32kHz, 16kHz, 8kHz, 4kHz)是基于PCLK=16MHz且PERIOD为默认值0xFE(254)计算得出的。我们来验算一下:
- 当
CLKSEL=00(除2):PWMO = (16MHz / (254+2)) / 2 = (16MHz / 256) / 2 = 62.5kHz / 2 = 31.25kHz,约等于32kHz。 - 其他频率依此类推。关键点在于:
PERIOD寄存器的值直接影响基频,CLKSEL是在此基础上的进一步分频。如果你想获得一个非标准的PWM频率,就需要联动调整PERIOD和CLKSEL。
实操心得:在计算PWM频率时,务必使用
PCLK的实际值,而不是系统主频。PCLK可能由系统时钟经过分频得到,需查阅芯片的系统时钟配置部分。我曾在一个项目中,系统主频是16MHz,但默认PCLK是8MHz,直接套用手册公式导致音频播放速度慢了一倍,排查了很久。
2.2 采样寄存器与FIFO工作机制
这是MC68EZ328 PWM模块用于音频输出的精髓所在。普通的PWM输出需要CPU不断更新比较值来改变占空比,这会消耗大量CPU资源。而内置的8字节FIFO(先进先出缓冲区)实现了“半自动”播放。
PWMS寄存器与数据格式:PWMS是一个16位寄存器,但它是8位FIFO的输入接口。当你向PWMS写入一个16位数据时,芯片硬件会自动将其拆分为高8位(SAMPLE0)和低8位(SAMPLE1),并按照大端序依次压入FIFO:先高字节,后低字节。这意味着,如果你的音频样本是16位宽的,你需要将两个连续的样本字节组合成一个16位字再写入。如果使用8位单声道音频,则数据必须写入SAMPLE1(低字节)。
FIFO的自动播放:一旦FIFO中有数据,PWM模块就会按照设定的周期和时钟,自动将FIFO中的数据依次取出,转换为对应占空比的PWM波形输出。当FIFO快空时,会触发中断(如果使能),通知CPU填充新的样本数据。这样就解放了CPU,让它只需要在中断服务程序中批量填充数据即可,非常适合播放连续的音频流。
一个关键的边界条件:手册中明确警告:“If the value in this register is higher than the PERIOD + 1, the output will never be reset, which results in a 100% duty-cycle.” 这意味着,如果你写入PWMS的样本值大于(PERIOD + 1),PWM比较器将永远无法翻转,输出恒为高电平。在音频应用中,这会导致严重的失真。因此,必须确保你的音频样本值经过缩放,其最大值不超过PERIOD寄存器的值。通常,对于8位样本(0-255),PERIOD应设置为255;对于12位样本(0-4095),PERIOD应设置为4095,以此类推。
2.3 编程实例与中断驱动设计
手册提供的示例代码展示了如何利用FIFO和中断进行音频播放。我们来逐行分析并补充关键细节:
// 寄存器地址定义(通常放在头文件中) #define PWM_CONTROL_REG (*(volatile unsigned char *)0xFFF501) #define PWM_SAMPLE_REG (*(volatile unsigned short *)0xFFF502) #define IRQ_MASK_REG (*(volatile unsigned long *)0xFFF304) // 控制位定义 #define PWM_IRQ_ENABLE 0x40 #define PWM_ENABLE 0x10 #define PWM_CLK_16KHZ 0x01 // CLKSEL = 01 // 全局变量:指向样本缓冲区和缓冲区大小 unsigned short *pwm_sample_buffer_ptr; unsigned long pwm_samples_remaining; // 注意:以“字”(16位)为单位计数 void PWM_Init(unsigned short *buffer, unsigned long num_words) { // 1. 保存缓冲区信息 pwm_sample_buffer_ptr = buffer; pwm_samples_remaining = num_words; // 2. 配置PWM控制寄存器:使能PWM、使能中断、设置16kHz重构频率 // 注意:这里假设PCLK=16MHz,PERIOD为默认值0xFE,才能得到约16kHz。 PWM_CONTROL_REG = PWM_ENABLE | PWM_IRQ_ENABLE | PWM_CLK_16KHZ; // 3. 在全局中断屏蔽寄存器中,使能PWM中断(清除对应屏蔽位) // PWM中断在IRQ屏蔽寄存器中的位可能是第7位(根据手册片段PWMIRQ 0x00000080) IRQ_MASK_REG &= ~(0x00000080); // 清除第7位的屏蔽,允许中断 // 4. 预填充FIFO的初始样本(FIFO深度为8字节,即4个16位样本) // 手册示例中似乎省略了这一步,但在实际中,为了防止FIFO一开始就下溢,应先填充2-4个样本。 for(int i=0; i<2 && pwm_samples_remaining>0; i++) { PWM_SAMPLE_REG = *pwm_sample_buffer_ptr++; pwm_samples_remaining--; } } // PWM中断服务例程(ISR) void PWM_IRQ_Handler(void) { volatile char status; // 1. 读取控制寄存器以清除中断标志位(重要!) status = PWM_CONTROL_REG; // 2. 向FIFO填充新的样本数据,直到FIFO满或缓冲区空 // 由于FIFO为8字节(4字),中断时通常至少有一半空位。我们连续填充。 // 手册示例代码此处逻辑有些令人困惑,以下为更清晰的版本: int samples_to_load = 4; // 尝试填充最多4个字 while (samples_to_load-- > 0 && pwm_samples_remaining > 0) { PWM_SAMPLE_REG = *pwm_sample_buffer_ptr++; pwm_samples_remaining--; } // 3. 如果所有样本已播放完毕,关闭PWM模块以停止输出和中断 if (pwm_samples_remaining == 0) { PWM_CONTROL_REG = 0x00; // 禁用PWM,也会禁用其中断 } }避坑指南:
- 中断标志清除:在PWM ISR中,必须通过读取
PWMControl寄存器来清除中断标志。这是许多硬件模块的常见设计,读状态寄存器即清除中断标志位。忘记这一步会导致中断持续触发,系统卡死。- 缓冲区指针与计数:确保你的
pwm_samples_remaining计数器单位与操作一致。如果缓冲区是unsigned short数组(16位字),计数器就表示“字数”。每次写入PWMS一个16位数据,计数器减1。8位样本需特殊处理。- FIFO填充策略:中断服务程序应尽可能快地执行。不要在ISR内做复杂计算或函数调用。理想的策略是像上面一样,在ISR中仅进行数据搬运和指针更新,将音频解码或准备等耗时任务放在主循环或更低优先级任务中。
- PERIOD值与音频质量:
PERIOD的值决定了PWM的量化精度。对于8位音频,PERIOD=255(0xFF)能提供256级占空比,匹配8位样本。如果PERIOD设置过小(如63),即使样本是8位的,实际输出也只有64级精度,会导致音频动态范围压缩和量化噪声增加。
3. 通用定时器:从输入捕获到输出比较
MC68EZ328的16位通用定时器是一个极其灵活的外设,远超简单的延时功能。它可以工作在自由运行或重启模式,支持外部时钟输入、输入捕获和输出比较,是测量脉冲宽度、生成精确时间间隔或驱动步进电机的利器。
3.1 定时器模式详解与配置
定时器的核心是一个16位计数器,其时钟来源可通过CLKSOURCE字段灵活选择:可以是系统时钟SYSCLK、SYSCLK/16、外部引脚TIO输入或32kHz低速时钟CLK32。选择CLK32的妙处在于,即使CPU主频因低功耗模式而变化,定时器仍能基于稳定的32kHz时钟工作,适合实时时钟等应用。
预分频器(TPRER):在时钟进入主计数器前,还有一个8位预分频器(1-256分频)。最终驱动计数器的时钟频率F_counter = F_source / (PRESCALER + 1)。这里又是一个“+1”的细节:写入TPRER的值为N,则分频比为N+1。例如,写入0x00(N=0)是1分频,写入0xFF(N=255)是256分频。
自由运行 vs 重启模式:由FRR位控制。
- 重启模式(FRR=0):当计数器值达到比较寄存器
TCMP的值时,计数器复位到0,并重新开始计数。此模式用于生成精确的周期性事件。输出频率F_out = F_counter / (TCMP + 1)。 - 自由运行模式(FRR=1):计数器达到
TCMP值时会产生比较事件(中断或引脚动作),但计数器继续累加,直到溢出回零。此模式适合测量时间间隔或生成非对称波形。
3.2 输入捕获功能实战
输入捕获功能用于精确测量外部事件的时刻,比如测量一个脉冲的宽度或频率。
工作原理:当配置为输入捕获的引脚(TIN)上发生指定的边沿(上升沿、下降沿或双边沿,由CAP字段配置)时,定时器当前的计数值会被瞬间“捕获”并锁存到捕获寄存器TCR中。同时,状态寄存器TSTAT中的CAPT位会被置1,并可触发中断。
测量脉冲宽度示例:假设我们要测量一个正脉冲的高电平时间。
- 初始化:设置定时器为自由运行模式(
FRR=1),预分频器设置一个合适的值以获得足够的测量范围和精度。使能输入捕获功能,并配置为在上升沿捕获(CAP=01)。 - 等待第一个边沿:使能定时器。当上升沿到来时,触发第一次捕获,在中断服务程序(ISR)中读取
TCR的值,存入变量t1,并立即将捕获边沿改为下降沿(CAP=10)。 - 等待第二个边沿:当下降沿到来时,触发第二次捕获,在ISR中读取
TCR的值,存入变量t2。 - 计算:脉冲宽度时间
Δt = (t2 - t1) * T_counter。其中T_counter是计数器每个tick的时间,等于1 / F_counter。这里必须考虑16位计数器的溢出问题。在自由运行模式下,如果t2 < t1,说明发生了溢出,实际差值应为(0xFFFF - t1 + t2 + 1)。
注意事项:手册中提到,产生捕获边沿的脉冲最短可为20ns,但两个脉冲之间的最小间隔是2个
PCLK周期。这意味着对于高速信号,你需要确保PCLK的频率足够高,以分辨连续的边沿事件。
3.3 输出比较功能实战
输出比较功能用于在精确的时间点改变输出引脚的状态,从而生成波形或定时触发事件。
工作原理:定时器计数器TCN不断与比较寄存器TCMP中的值进行比较。当两者相等时,发生“比较事件”。此时,根据OM(输出模式)位的设置,输出引脚TOUT可以:
OM=0:产生一个持续一个SYSCLK周期的低电平脉冲。OM=1:翻转(Toggle)输出电平。
生成PWM波形(软件方式):虽然MC68EZ328有独立的PWM模块,但定时器的输出比较模式也可以用来生成PWM,尤其当需要更多路或更灵活控制时。以生成一个频率为1kHz,占空比为30%的PWM为例:
- 计算参数:假设
F_counter = 1MHz(通过选择时钟源和预分频器得到)。则计数器周期T_counter = 1us。
- 波形周期
T_pwm = 1 / 1kHz = 1000us。 - 需要计数器计数值
N_period = T_pwm / T_counter = 1000。 - 高电平时间
T_high = 30% * 1000us = 300us,对应计数值N_high = 300。
- 配置定时器:设置为重启模式(
FRR=0),TCMP寄存器设置为N_period - 1 = 999(因为计数器从0开始,计到999时匹配,然后复位)。使能比较中断(IRQEN=1)。 - 中断服务程序逻辑:
- 在比较中断中(计数器复位时),将
TOUT引脚输出设为高电平(如果OM=1,则需要在中断中手动控制一个GPIO,因为OM=1是翻转模式,不适合固定占空比PWM。更常见的是用两个比较值)。 - 更优的方案是使用两次比较:设置
TCMP1 = N_high - 1,在第一次比较匹配时(对应高电平结束),将输出拉低;设置TCMP2 = N_period - 1,在第二次比较匹配时(对应周期结束),将输出拉高并重置计数器。这需要更精细的中断管理或使用定时器的其他高级模式(部分定时器支持多通道比较)。MC68EZ328的通用定时器是单比较寄存器,因此通常需要结合GPIO在中断内手动控制电平,这会引入少量软件抖动。
定时器状态寄存器(TSTAT)的清零机制:这是一个需要特别注意的细节。手册明确指出:“These bits are cleared by writing 0x0 and will clear only if they have been read while set.” 这意味着,要清除CAPT或COMP状态位,你必须先读取TSTAT寄存器(此时位为1),然后再向该位写0。如果该位为0时你写0,操作无效。这种“读-修改-写”的机制是为了防止在读取状态和清除中断之间发生新中断事件而导致中断丢失。在编程时,通常这样操作:
unsigned short status = TSTAT_REG; // 读取状态寄存器,捕获当前事件 if (status & CAPT_MASK) { // 处理捕获事件... TSTAT_REG = 0; // 写入0以清除已读出的置位位 }4. 串行外设接口(SPI Master)配置与通信
SPI是一种高速、全双工的同步串行总线,MC68EZ328的SPI主机模块(SPIM)专用于与各类SPI从设备通信,如EEPROM、Flash、ADC、DAC、传感器等。
4.1 SPI时钟相位与极性配置
这是SPI通信中最容易混淆的概念,也是连接不同设备时必须匹配的关键参数。MC68EZ328的PHA(相位)和POL(极性)位提供了四种组合(CPOL, CPHA),分别对应SPI的四种模式。
| 模式 | POL (CPOL) | PHA (CPHA) | 时钟空闲电平 | 数据采样时刻 | 数据变化时刻 |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 低电平 | 第一个时钟边沿(上升沿) | 第一个时钟边沿之后 |
| 1 | 0 | 1 | 低电平 | 第二个时钟边沿(下降沿) | 第一个时钟边沿(上升沿) |
| 2 | 1 | 0 | 高电平 | 第一个时钟边沿(下降沿) | 第一个时钟边沿之后 |
| 3 | 1 | 1 | 高电平 | 第二个时钟边沿(上升沿) | 第一个时钟边沿(下降沿) |
通俗理解:
- CPOL:决定了时钟线
SPMCLK在空闲时的状态。0=低电平,1=高电平。 - CPHA:决定了数据是在第一个时钟边沿采样,还是在第二个时钟边沿采样。同时也决定了主设备数据何时变化。
如何选择?这完全取决于你的从设备数据手册要求。例如,很多EEPROM芯片工作在SPI模式0或模式3。务必保证主从设备模式一致,否则无法正确通信。
4.2 数据交换流程与编程精要
手册中的汇编示例展示了基本的SPI通信流程,我们将其转化为更易理解的C语言步骤,并补充关键细节:
// 假设寄存器地址已定义 #define SPIM_DATA_REG (*(volatile unsigned short *)0xFFFFF800) #define SPIM_CONT_REG (*(volatile unsigned short *)0xFFFFF802) #define PORT_E_SEL_REG (*(volatile unsigned char *)0xFFFFF423) // PESEL寄存器地址示例 void SPIM_Init(void) { // 1. 配置Port E引脚功能为SPIM(PE2:CLK, PE1:RXD, PE0:TXD) // 根据手册,向PESEL相应位写000选择SPIM功能 // 假设PE2-PE0对应PESEL寄存器的低3位 PORT_E_SEL_REG &= ~(0x07); // 清零低3位,设置为000 // 2. 配置SPIM控制寄存器:相位0,极性0,10位传输,时钟16分频(1MHz @ 16MHz SYSCLK) // BIT COUNT = 10-1 = 9 (0b1001) // DATA RATE = 分频16 = 010 (0b010) // 组合:PHA=0, POL=0, BIT_COUNT=9, DATA_RATE=2, IRQEN=0(轮询), ENABLE和XCH先为0 SPIM_CONT_REG = (0 << 8) | (0 << 7) | (9 << 0) | (2 << 13); // 即 0x4009 } unsigned short SPIM_ExchangeWord(unsigned short data_to_send) { // 1. 使能SPIM模块 SPIM_CONT_REG |= (1 << 1); // 设置ENABLE位 // 2. 将要发送的数据写入数据寄存器 SPIM_DATA_REG = data_to_send; // 3. 触发数据交换(设置XCH位) SPIM_CONT_REG |= (1 << 0); // 设置XCH位 // 4. 轮询等待交换完成(IRQ位变高) while ((SPIM_CONT_REG & (1 << 7)) == 0) { ; // 忙等待 } // 5. 清除中断标志位(通过写0) SPIM_CONT_REG &= ~(1 << 7); // 清除IRQ位 // 6. 禁用SPIM模块(可选,如果连续传输可以保持使能) SPIM_CONT_REG &= ~(1 << 1); // 清除ENABLE位 // 7. 读取接收到的数据 return SPIM_DATA_REG; }实战经验与陷阱:
- 使能顺序:手册强调,必须先设置
ENABLE位,才能更改其他控制位或写入数据寄存器。在初始化时,应先写控制寄存器(不含ENABLE位),最后再置位ENABLE。在每次传输前,也应确保ENABLE已置位。- 数据寄存器写入时机:必须在
XCH位为0(空闲)时,才能向SPIMDATA寄存器写入数据。一旦置位XCH启动传输,在传输完成(IRQ位置起)前,写入数据是无效的。- 位传输顺序:SPIM模块总是先发送最高位(MSB first)。对于16位数据,Bit 15先发出。如果你的从设备要求LSB first,就需要在软件层对数据进行位反转。
- 少于16位的传输:通过
BIT COUNT字段可以设置1-16位的任意传输长度。这对于连接那些数据帧不是8位整数倍的设备(如某些12位ADC)非常有用。但要注意,数据在SPIMDATA寄存器中是右对齐还是左对齐?手册指出“outgoing data is automatically MSB-justified”,这意味着对于10位传输,你需要将数据放在SPIMDATA寄存器的[15:6]位(假设高位在前),低6位会被忽略。接收时,数据也会存放在寄存器的高位部分。你需要根据实际情况进行移位操作。- 片选信号管理:MC68EZ328的SPIM模块不提供硬件片选(CS/SS)信号。你必须使用一个普通的GPIO引脚来手动控制从设备的片选。在传输开始前拉低片选,传输完成后拉高。这是与一些集成SPI模块的重要区别。
5. 通用异步收发器(UART)配置与应用
UART是嵌入式系统中最基础的调试和通信接口。MC68EZ328的UART模块功能齐全,支持FIFO、IrDA和硬件流控,大大减轻了CPU负担。
5.1 UART工作模式:NRZ与IrDA
NRZ模式:即常见的RS-232电平标准(在芯片引脚端为TTL电平)。一个字符帧包括起始位(低电平)、5-8个数据位(LSB先发)、可选的奇偶校验位和1-2个停止位(高电平)。这是最常用的模式,需要通过外部电平转换芯片(如MAX232)才能与PC串口连接。
IrDA模式:用于红外通信。它与NRZ帧结构相同,但物理层编码不同。逻辑“0”被编码为一个短脉冲(3/16位时间),逻辑“1”则保持低电平(无脉冲)。这种编码方式降低了红外LED的占空比,节省功耗。模块内置了编解码器,开发者只需关心数据,无需手动生成脉冲。
模式选择与极性:通过UMISC寄存器中的TXPOL和RXPOL位可以控制IrDA模式下脉冲的极性,以适配不同型号的红外收发器。
5.2 波特率生成器配置
UART的通信速率由波特率生成器决定。模块支持两种时钟模式:
- 16x内部时钟模式:最常用。波特率时钟是目标波特率的16倍,用于对接收数据进行过采样以提高抗噪性。波特率计算公式为:
Baud Rate = UCLK / (16 * (UBRG + 1))。其中UCLK可以是系统时钟分频,UBRG是波特率分频寄存器值。 - 1x外部时钟模式:
UCLK引脚作为输入,直接提供位时钟。用于需要非标准波特率或同步通信的场景。
配置标准波特率示例:假设系统时钟SYSCLK=16MHz,目标波特率Baud=115200,使用16x模式。
- 首先确定
UCLK。通常UART时钟由系统时钟分频而来,假设分频后UCLK=16MHz。 - 计算
UBRG值:UBRG = (UCLK / (16 * Baud)) - 1 = (16,000,000 / (16 * 115200)) - 1 ≈ 7.68。 - 取整后
UBRG = 8。代入公式验证实际波特率:Baud_actual = 16,000,000 / (16 * 9) ≈ 111,111 Hz,误差约为3.5%。对于115200的波特率,这个误差在可接受范围内(通常要求<2%)。若误差过大,需调整UCLK源或选择更接近的波特率。
注意:高波特率(如1Mbps)对时钟精度要求极高,通常需要使用1x外部时钟模式,并由一个高精度的时钟源直接驱动
UCLK引脚。
5.3 FIFO与中断驱动收发
UART的12字节接收FIFO和8字节发送FIFO是提升通信效率的关键。
发送流程:
- 检查
UTX寄存器中的TX_AVAIL位(或FIFO_EMPTY、FIFO_HALF中断标志),判断FIFO是否有空位。 - 将数据写入发送数据寄存器。数据会自动进入FIFO并开始发送。
- 使能发送FIFO空中断。当FIFO完全空时触发中断,在中断服务程序中填充新的数据,实现“背靠背”连续发送,最大化利用带宽。
接收流程:
- 使能接收数据可用中断���如
FIFO_NOT_EMPTY或FIFO_HALF_FULL)。 - 在中断服务程序中,从接收数据寄存器连续读取数据,直到FIFO为空。
- 利用“旧数据定时器”功能:如果FIFO中有数据但未满,一段时间(可配置)没有新数据后也会触发中断,确保即使最后一个字符也能被及时读取,避免数据滞留。
硬件流控(RTS/CTS):
- CTS(Clear to Send):输入信号。当
CTS为低电平时,发送器才能发送数据。如果CTS变高,发送器会在完成当前字符后停止。这由远端设备控制,防止本机发送过快导致对方溢出。 - RTS(Request to Send):输出信号。当接收FIFO快满(例如只剩4字节空间)时,UART模块会自动将
RTS引脚拉高(无效),通知对方暂停发送。当FIFO空间恢复,RTS拉低。这是一个自动的流量控制机制。 - 如果不需要硬件流控,需设置
NOCTS位,并可将RTS引脚配置为通用输出。
Break信号的生成与检测:
- 生成Break:设置
SENDBREAK位。发送器会持续输出低电平(Space),直到该位被清除。标准Break信号持续时间应大于一个完整的字符帧时间。操作步骤如手册所述:先确保发送器空闲(BUSY位为低),再设置SENDBREAK,等待所需时间后清除该位。 - 检测Break:接收器会在收到持续的低电平(起始位低电平被拉长)时,置位相应的状态标志(如
BREAK位),并可触发中断。这在多机通信或协议解析中用于帧同步。
调试UART时,最常用的工具是逻辑分析仪或带串口功能的示波器,可以直观地看到起始位、数据位、停止位的波形,以及硬件流控信号的变化,是排查通信问题的最快手段。