历史上的今天
返回首页

历史上的今天

今天是:2025年06月17日(星期二)

正在发生

2020年06月17日 | MSP430精准配置高速串口波特率的方法

2020-06-17 来源:21ic

引言
    在实际项目大批量生产调试设备时,笔者发现同样版本的程序在不同设备上运行时效果不一致,一部分设备串口通信正常,另外一部分串口通信不正常。通过示波器对多个设备的串口波特率及系统时钟频率测试,发现不同设备之间的系统时钟频率及波特率存在差异,与理论值不一致,用示波器测试出的系统时钟频率及波特率与理论值偏差较大。由于系统时钟频率的偏差导致波特率设置值超过了串口所允许的最大误差值,故而导致串口通信失败。其根本原因是系统的时钟频率会随环境温度、电压或其他因素变化。

1 原因分析
    在异步通信中,波特率是很重要的指标,表示为每秒传送二进制数码的位数,反映了异步串行通信的速度。MSP430的波特率发生器使用一个分频计数器和一个调整器来构成分频因子,此方法能够用较低时钟频率实现高速通信,从而在系统低功耗的情况下,实现高性能的串行通信。MSP430波特率发生器的时钟源可以为通用时钟(Universal Clock,UCLK)、辅助时钟(Auxiliary Clock,ACLK),子系统时钟Subsystem Master Clock,SMCLK)。其中,ACLK通常为32 768 Hz,稳定但无法满足高速串口通信;SMCLK为可配置的系统频率,可满足高速串口通信,但不稳定。SMCLK是由数字控制振荡器(Digitallycontrolled Oscillator,DCO)的调节器模块混合两个频率Fdco和Fdco+,用以产生介于Fdco和Fdco+1之间的频率。从本质上来说,这种调制将时钟能量扩散到一个宽带中,减少了电磁干扰(EMI)。但这样得到的平均频率的调制时钟,其负面影响的表现形式就是频率的抖动。


    DCO频率会随着温度和电压的变化而有所波动,在fDCO=1 MHz时,飘移频率随漂移温度变化的比例为0.1%/℃,飘移频率随漂移电压变化的比例为1.9%/V。因此使用SMCLK作为串口时钟源时,用理论频率计算的分频因子和实际频率分频因子有差异,导致串口无法通信。

2 解决方案
2.1 方案1——自动波特率检测模式
    MSP430串口通信支持自动波特率检测,在这种通信模式下,在数据帧前面会有一个包含打断/同步域的同步序列,如图1所示。为了LIN的一致性,该模式下字符格式应为8个数据位,低位优先,没有奇偶校验位和停止位,且地址位不可用。在接收打断/同步域时,串口是不能发送数据的,如果在帧错误下接收到一个0H字节,那么此时发送的任何数据都会遭到破坏。由此可见其通信过程较复杂,使用不便。

a.JPG


2.2 方案2——外接高频晶振
    MSP430可外接稳定的高速晶振,但该系列芯片设计为超低功耗的单片机,如外接高频晶振,与该系列低功耗设计理念相违背。即MCU进入低功耗模式(Low-Power Mode,LPM)下晶振并不进入低功耗模式,且会一直耗电,因此会增加系统的耗电量,减少续航时间。


2.3 方案3——根据时钟源自动计算波特率
    可使用内部低频晶振,通常为32 768 Hz。经过DCO调节器,产生较高的可供串口高速通信的频率FSMCLK。该频率是由DCO调节器模块在32个DCO时钟周期内混合Fdco和Fdco+1产生的介于Fdco和Fdco+1之间的频率,该调节模式从本质上减小了电磁干扰。并且FSMCLK会在MCU进入LPM模式后自动关闭以节电,直至MCU退出低功耗模式。得到高频时钟后,可通过两个定时器精准计算出FSMCLK,并根据该值设置波特率,此方法可消除器件差异性,以保证单片机串口在不同温度和电压下正常工作。该方案简单、易实现、抗电磁干扰强、省电效果好,并且从一定程度上消除了系统频率随温度、电压变化所带来的影响。该方案优于方案1和方案2;其实现流程如图2所示。

b.JPG

3 系统工作频率计算
    对于定时器A0,其时钟源频率为F0,使定时器A0工作在计数器模式下并设置每计数T0次产生一次中断,即每中断一次的时间t0为:
    c.JPG
    对于定时器A1,其时钟源频率为F1,使定时器A1工作在计数器模式下并设置每计数T1次产生一次中断,即每中断一次的时问t1为:
    d.JPG
e.JPG

4 波特率设置
    对于给定串口时钟源BRCLK,分频因子N满足:
    N=BRCLK/Baudrate
    分频因子N常常不是整数,因此,至少需要一个分频计数器和一个调整器来产生一个近似于分频因子N的数。
    在低频模式下,整数部分分频因子满足:
    UCBRx=INT(N)
    且分数部分满足下列公式:
    UCBRSx=round[(N-INT(N))×8]
    设置波特率程序如下:
    division_factor=f_smclk/(Baudrate*1.0);
    UCA0BR0=(int)division_factor;
    UCA0BR1=((int)division_factor)>>8;
    UCA0MCTL|=(int)((division_factor_(int)division_factor)*8);

5 方案验证
    如方案3所述,先测出串口时钟源的当前频率,再根据该频率设置波特率寄存器及调整器的值。将修改后的程序下载到串口能通信和串口不能通信的多个设备进行验证。通过示波器测试发现,被测设备的时钟频率存在差异,各设备之间的频率不一定相同,同时发现串口的实际波特率与理论波特率一致,其表现形式为串口能正常通信。至此,方案3通过验证,该方案可有效避免因串口时钟源时钟偏移导致不能通信的问题。

结语
    实践证明,计算出内部时钟经过倍频后的高频时钟,再根据该时钟频率设置串口波特率的方法可行。该方法从纯软件的角度有效地解决了单片机内部时钟频率不稳定,单片机因环境温度、气压、电磁等导致系统时钟频率偏差,以及单片机器件之间的差异性等因素导致串口通信失败的问题。

推荐阅读

史海拾趣

顺芯(Everest-semi)公司的发展小趣事

在技术创新的同时,顺芯公司也注重市场拓展和品牌建立。公司积极参加国内外各类展会和论坛,与潜在客户和合作伙伴建立了广泛的联系。同时,顺芯公司还加强了与渠道商的合作,提高了产品的市场覆盖率。通过一系列的市场推广活动,顺芯公司的品牌知名度和美誉度逐渐提升。

国炬(GOOGLL)公司的发展小趣事
可能是由于元器件参数不对称、中点电压偏离或静态工作点设置不当等原因引起。解决方法包括调整元器件参数、调整中点电压或重新设置静态工作点。
APEM公司的发展小趣事

APEM公司的创始人基恩·罗杰罗,在20世纪50年代初,看到了美国产品主导法国市场的商机。为了解决产品维修和备件订购的难题,他决定自己生产开关。罗杰罗的开关产品在尺寸和操作方式上与美国产品相似,但价格更亲民,交货时间更短。这一创新举措使APEM迅速在市场上站稳脚跟,为后续的发展奠定了坚实基础。

Fremont_Micro_Devices_USA公司的发展小趣事

为了进一步丰富产品线,APEM在1984年开设了新厂,专业生产开关面板。这一举措不仅扩充了公司的产品种类,也满足了客户对多样化产品的需求。此后,APEM不断推出新产品,逐步形成了完善的开关和控制面板产品线。

General Instrument Corp公司的发展小趣事
如果使用外部参考电压,请确保参考电压稳定且准确。
Alpha & Omega Semiconductor(万国半导体)公司的发展小趣事
验证输入信号是否在变换器的允许范围内,避免超出其最大或最小输入电压。

问答坊 | AI 解惑

载噪比(C/N)和调制误码率(MER)对BER 的影响

为了更好地保证数字有线电视的传输质量,需要合理地规划载噪比(C/N)和调制误码率(MER)以确保误码率(BER)指标能够保持在良好的范围内。 BER 被定义为发生误码的比特数与传输的总比特之比。BER 测量结果通常使用工程表示法,并常常显示为一个 ...…

查看全部问答>

定时/计数器的方式控制字

定时/计数器的方式控制字 从上一节我们已经得知,单片机中的定时/计数器都可以有多种用途,那么我怎样才能让它们工作于我所需要的用途呢?这就要通过定时/计数器的方式控制字来设置。 在单片机中有两个特殊功能寄存器与定时/计数有关,这就是TMOD ...…

查看全部问答>

Vishay - Power Components for SMPS, Wind Turbines, Electricity Meters

Vishay - Power Components for SMPS, Wind Turbines, Electricity Meters Vishay Intertechnology, Inc. highlighted its latest power capacitors, inductors, and diodes for high-current power converters, wind turbines, electricity meters ...…

查看全部问答>

请问如何正确运行bluelab下的demo程序?

前几天购买了块CSR的蓝牙开发板. 现在想尝试写个蓝牙键盘玩一下. 可是我打开bluelab的app下的hid-keyboard蓝牙键盘例子程序. 编译并download到开发板上的蓝牙模块中. 运行后. 只看见板上灯在闪. 我插在PC上的蓝牙适配器并没有侦测到这个蓝牙键盘. ...…

查看全部问答>

USB总线过滤驱动中获取设备描述符后哪个标识表示设备是蓝牙?

如题,我要做一个USB总线过滤驱动,插入蓝牙后获取设备描述符,我想知道设备描述符里是否包含蓝牙的设备类型信息? 如果有,哪个是? 如果没有,我如何知道插入的设备就是蓝牙?怎么判断? 在google上没有搜到相关信息,请大家指点…

查看全部问答>

ADV7181C驱动问题

平台为海思3512,之前使用的AD转换芯片为cx25837,现在需换成ADV7181,具备高清功能,需要做ADC7181的驱动。 现在一个问题是:之前的cx25837是8路控制信号,而ADC7181是16路信号,请问有谁做过这一芯片的驱动,可以讨论下。…

查看全部问答>

wince的窗口问题

我用MFC智能设备应用程序做出来一个子对话框,上面有按钮等控件,放在一款手机上,界面没有出现任何问题,但把程序放在另一款手机上,画面就乱了,原本居中的按钮位置也变了等等,弄不明白是什么原因,而这两款手机分辨率是一样的。 请问大家wince ...…

查看全部问答>

plc控制步进电机总是响,求教高手!

初学plc,用一个前辈留下的程序控制步进电机,为什么我把输入端I0.1用常闭触点时,电机就可以转,改成常开触点外接用一个开关时,打开开关点击就响不转呢?小弟初涉此道,很多东西不懂,希望高手多多指教,先谢过  …

查看全部问答>

以太网和串口bootloader更新可以用

以太网和串口bootloader更新可以用,但碰到一个棘手的问题,在串口boot_series中,是通过判断pulApp = (unsigned long *)APP_START_ADDRESS;     if((pulApp[0] == 0xffffffff) || ((pulApp[0]& 0xfff00000) != 0x20000000) ||   ...…

查看全部问答>

【登记帖】谁要购买EE_FPGA焊好成品?

为了节省大家的成本,之前推出了散件购买链接(https://bbs.eeworld.com.cn/thread-248286-1-1.html),很多朋友害怕购买散件出现虚焊。考虑到大家的需求,我们打算提供焊接好的成品,但需要提前登记报名,凑够10人一组去焊接。 焊接测试好的EE_FP ...…

查看全部问答>