ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

普冉MS32C001-C实战:ARM Cortex-M0+低成本32位MCU选型与开发

普冉MS32C001-C实战:ARM Cortex-M0+低成本32位MCU选型与开发 最近有个实际项目要换主控要求功耗低、成本敏感、接口还得够用朋友顺手推了一颗料过来芯岭技术这边在推广的普冉 MCU型号是 MS32C001-C32 位 ARM Cortex-M0 内核。说实话看到这个组合第一反应是“又是一颗国产替代芯片”但真正上手跑了一轮之后发现它在定位、资源、性价比上确实有点东西。这篇文章就把我从选型、硬件设计、开发环境到实际调试踩坑的全过程整理出来给正在评估或者已经拿到样片的工程师做个参照。我写的所有内容都围绕这颗芯片的实际使用展开适合三类人看一是做低成本 IoT 设备选型的硬件工程师二是想从 8 位单片机迁移到 32 位平台的学生或爱好者三是已经在用 MS32C001-C 但遇到外设、烧录、低功耗问题的开发者。整篇文章不讲虚的全部以实操为主参数部分以官方手册和实际测试为准我会尽量标注清楚哪些是手册值、哪些是我实测值。1. 项目背景与选型逻辑1.1 这颗芯片到底解决什么问题先看定位。MS32C001-C 是一颗基于 32 位 ARM Cortex-M0 内核的通用 MCU主频做到几十兆赫兹级别集成 Flash 和 SRAM内置多路定时器、通信接口、ADC 等常用外设。它的目标非常明确替代传统 8 位单片机把那些正在用 51、AVR、PIC 的老方案往 32 位平台迁移。为什么会有这种需求因为现在很多小家电、电动工具、传感器模组、智能家居面板算力需求比过去高了不少。比如我这次做的模拟项目叫“某温控器系统”原来用的 8 位单片机要同时跑 PID 运算、驱动数码管、做按键扫描和串口上报CPU 已经满负荷稍微加个功能就要换主控。换到 MS32C001-C 之后同样的功能跑下来资源占用还不到一半而且扩展余量明显变大。成本层面32 位 M0 芯片现在已经下探到和高端 8 位机差不多的价位真正做到了性价比上的对位。这颗芯片还解决了另一个问题开发体验。8 位平台各家工具链碎片化严重CMSIS 标准、统一的调试接口、丰富的库函数这些都是 32 位平台的天然优势上手成本其实比想象中低。1.2 为什么优先考虑 ARM Cortex-M0 而不是 M3 或者 8 位机很多人会问同样都是 ARM为什么不直接上 M3这里有几个关键考量。第一是功耗Cortex-M0 的流水线更短门数更少静态功耗和动态功耗都明显低于 Cortex-M3对于电池供电的设备来说非常关键。第二是成本M0 内核的授权费和芯片面积更小芯片厂能做到更低的售卖价终端产品才有利润空间。第三是外设够用很多场景确实用不到复杂的内存管理、浮点运算、DSP 指令。但 M0 也不是没有代价。比如没有硬件除法器复杂运算要靠软件模拟中断响应和嵌套能力也弱于 M3。所以选择时要评估你的应用是否真的需要高端特性。如果只是做电机控制、传感器读取、简单人机交互M0 足够如果涉及大量浮点算法、复杂的协议栈和快速上下文切换那就老老实实上 M3 或者 M4。对比传统 8 位机优势就更明显了。8 位机虽然便宜但总线宽度限制在那里处理复杂逻辑时效率很低。而 M0 即使主频只有几十MHz实际指令执行效率远超同频 8 位机遇到定时器比较、中断嵌套、多路 PWM 这种需求甩开 8 位机几条街。1.3 MS32C001-C 在同类方案里的定位在普冉的 MCU 产品线里MS32C001-C 属于基础通用型主打小封装、低成本、低功耗。和更高端的系列相比它没有那么多高级外设比如缺少 USB、SDIO、以太网这类复杂接口但是常用通信接口一个不少UART、I2C、SPI、ADC、定时器、PWM 都有。这意味着它非常适合做“功能单一但需要稳定”的设备节点。而且这颗芯片有几个容易被忽略的优点宽电压供电范围、内部振荡器精度可以满足大多数串口通信场景、引脚兼容性做得好。我测试的时候发现产品设计时不用外挂晶振也能跑稳串口通信很多时候能把 BOM 成本再压一档。整体定位可以概括成一句话用最低的成本和功耗完成 8 位机到 32 位平台的无痛迁移同时保持足够的接口灵活性。2. 硬件资源盘点与最小系统搭建2.1 核心资源与封装信息先看核心资源。MS32C001-C 的 CPU 是基于 ARM Cortex-M0 内核这意味着它天生支持 CMSIS 标准、标准调试接口SWD、SysTick 定时器、NVIC 中断控制器。存储方面Flash 容量有多个配置常见的有几十 KB 级别RAM 也有多种容量可选具体值必须按照你买到的那一档的型号后缀来确认不同子型号差别挺大。外设资源方面我拿到手的是中等配置版本实际集成了多路 12 位 ADC支持多通道采集多路高级定时器和基础定时器支持 PWM 输出至少两路 UART支持标准串口通信一路 I2C一路 SPI适合接传感器、存储、显示模块GPIO 数量充足支持外部中断和内部上拉/下拉电阻配置封装选择上有常见的 TSSOP、QFN、LQFP 等方便不同产品形态选择。我这里用的小体积封装做传感器节点非常合适。2.2 最小系统硬件设计要点最小系统其实很简单只要抓住下面几个点就不会出大问题。首先是电源芯片的 VDD 管脚要接高质量去耦电容一般 100nF 靠近 VDD 管脚放另外再加上一个 10μF 左右的钽电容或陶瓷电容做低频退耦。电源推荐使用低噪声 LDO如果系统里还有其他大功率器件地平面要分开处理。其次是复位管脚。很多工程师图省事直接把 NRST 接 VDD不接下拉和电容。这在调试阶段通常没问题但在强干扰环境下容易出现意外复位。建议按规格书要求接标准的 RC 复位电路电阻电容的值参考官方推荐不要随意加大电容否则上电复位时间太长会导致系统启动异常。然后是时钟配置。我做的这个项目直接使用了内部 RC 振荡器没有外接晶振。实测下来在常温环境下串口通信波特率误差完全可以接受。如果系统需要更精准的时钟比如要求严格的时间同步或者 USB 相关功能当然这颗芯片没有 USB那就需要外接晶振。晶振的两个负载电容选择很关键要根据晶振的负载电容参数来配配错了会导致起振困难或者频率偏移。2.3 供电、电平匹配与引脚保护这块重点讲电平问题。MS32C001-C 的 GPIO 在宽电压范围内工作但不同电压域之间做接口时还是要小心。如果外部传感器或者通信总线是 5V 电平而芯片工作在 3.3V则需要进行电平转换。哪些引脚内部有钳位保护二极管、哪些没有一定要看数据手册的引脚说明不能指望所有引脚都 5V 耐压。还有一个容易被忽视的地方引脚浮空输入。在系统初始化之前所有 GPIO 处于高阻态如果这些引脚连接的是关键使能信号可能在复位期间被误触发。解决办法是在硬件上加上下拉电阻或者在初始化代码里尽快配置引脚模式。我遇到过复位瞬间外部继电器被短暂吸合的情况就是因为 GPIO 高阻态导致电平翻转后来加了外部下拉电阻才彻底解决。设计最小系统的时候还建议预留 SWD 调试接口的测试点不要只引出电源和地。哪怕原型阶段不用调试器后期量产和故障分析也离不开调试口这点省不了。2.4 电源纹波与 PCB 布线建议这个环节比较偏实战。M0 内核的瞬态电流虽然不大但如果供电质量差Flash 读取会出错运行时会不定期死机。用示波器测 VDD 的纹波峰值不要超过 100mV否则就该考虑加大电容或者换低阻抗的电源走线。在 PCB 布线时晶体和去耦电容要尽可能靠近 MCU 管脚不要穿过大电流走线地线尽量用完整地平面不要在底层割裂。如果是两层板特别要注意时钟走线和高速信号SWDIO、SWCLK不要交叉不要走在板边。我之前做过一块板子为了走线方便把 SWCLK 拉得很长结果调试器偶尔连不上后来缩短走线并在 SWCLK 上串了小电阻才稳定。这些经验虽然零碎但在实际调试中能省很多时间。3. 开发环境搭建与工程创建3.1 Keil MDK 环境与器件支持包开发工具推荐直接用 Keil MDK因为普冉的官方库和例程大多基于 Keil 工程提供。新建工程之前需要先确认 Keil 版本不要太老最好选用较新的版本避免出现编译器兼容性问题。然后安装对应的器件支持包安装之后在 Device 列表里就能找到 MS32C001-C 对应的型号。这里有个细节有些人安装完支持包后发现编译时仍然报找不到头文件其实是因为没有正确选择芯片型号导致 Keil 没有把 Device 相关的宏定义和头文件路径自动加进来。建议在工程配置里确认 C/C 选项卡中的 Define 和 Include Paths 已经自动添加不要手动乱改。如果遇到编译报错说找不到 core_cm0plus.h基本就是选择了错误的 Device 或者没有安装 CMSIS 支持包。3.2 官方 SDK、标准库与寄存器操作如何选择开发时一般有三种选择直接用官方 SDK、用标准外设库、完全寄存器操作。我的建议是快速原型验证用官方 SDK因为里面已经把外设驱动封装好了直接调用接口大部分情况不用自己挖寄存器。产品做稳定版本时可以把涉及性能瓶颈的部分改用寄存器操作比如 PWM 占空比更新、ADC 多通道切换、串口高速收发。如果想深入理解芯片或者做底层移植直接用寄存器操作学习效果最好但工作量确实大。我自己做这个项目时初期用的是官方库函数跑通功能后再逐步把定时器中断和 ADC 采集部分改成寄存器操作性能有很大提升。比如 PWM 在库函数方式下更新占空比可能需要多个函数调用合成一条寄存器写操作后周期抖动明显改善。3.3 编译与下载配置Keil 工程里的烧录配置需要注意几点。第一编程算法要和 Flash 容量匹配选错了或者容量超出范围会导致烧录到一半报错。第二下载前是否勾选“擦除整个 Flash”如果只擦除部分扇区而代码分散在多个位置可能出现残留数据导致程序跑飞。第三复位模式一般选择复位后运行这样的话下载完成后芯片会自动复位并跑起来方便验证。烧录工具我用的是兼容 CMSIS-DAP 的调试器成本低速度也够。如果要批量生产建议用脱机编程器或者专用烧录底座速度快、稳定还能做序列号和 MAC 地址写入。关于软件架构老生常谈但还是要说中断服务函数里不要写复杂逻辑尽量只在中断里置标志位、读数据主循环再处理协议和业务。这样写的好处是中断延迟稳定不容易出现数据丢失。比如串口接收如果直接在中断里处理帧解析收到长帧时很容易把其他中断饿死改成中断只往环形队列里丢字节主循环再解析就稳定多了。4. 外设驱动开发与代码实践4.1 GPIO 与延时函数实战GPIO 算是最基础的外设但这里有几个容易踩的坑。先看一段点灯和延时代码#include MS32C001_C.h #define LED_PIN GPIO_PIN_5 #define LED_PORT GPIOB void delay_ms(uint32_t ms) { for (uint32_t i 0; i ms; i) { for (volatile uint32_t j 0; j 8000; j); } } int main(void) { GPIO_InitTypeDef gpio_init; gpio_init.Pin LED_PIN; gpio_init.Mode GPIO_MODE_OUTPUT_PP; gpio_init.Pull GPIO_NOPULL; gpio_init.Speed GPIO_SPEED_LOW; HAL_GPIO_Init(LED_PORT, gpio_init); while (1) { HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET); delay_ms(500); HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET); delay_ms(500); } }这个延时函数里 8000 这个数字要根据实际主频和编译器优化级别调整。最好的做法是不要用这种纯软件空循环来延时因为你换编译器版本、换优化级别时间就可能不对。项目里涉及到需要准确时间的地方我都改用 SysTick 来实现。SysTick 是 Cortex-M0 内核自带的一个 24 位递减计数器用它做时基非常标准。说回 GPIO。输出模式要分清推挽和开漏驱动 LED、蜂鸣器用推挽I2C 总线这种需要外部上拉的总线一定要用开漏。输入模式要区分上拉、下拉和浮空按键检测建议内部上拉传感器信号建议根据传感器输出方式选不要盲目用浮空。总之GPIO 初始化时不要只设置方向还要认真设置上下拉和速度否则会在功耗和信号完整性上出问题。4.2 串口 UART 与 printf 重定向串口是嵌入式调试的第一利器MS32C001-C 的串口模块支持标准波特率内部 RC 在常温下跑 115200 基本没问题。但要注意如果系统主频有误差波特率就会有误差两个设备累计误差超过 2% 就可能丢数据。所以量产前一定要实测串口通信的稳定性。使用串口之前先初始化时钟、GPIO 复用功能和 UART 外设。GPIO 复用这块很多人容易忽略以为初始化了 GPIO 就能直接做串口其实必须把对应的引脚切换成复用功能否则数据完全不通。这点在数据手册的引脚功能表里会有详细说明我强烈建议画原理图的时候就把复用关系标出来后续写代码就清楚了。printf 重定向是串口调试最实用的技巧。在 Keil 环境里重定向标准输出到串口只要实现一下 fputc 函数int fputc(int ch, FILE *f) { // 把 ch 发送到调试串口 USART_SendData(DEBUG_UART, (uint8_t)ch); while (USART_GetFlagStatus(DEBUG_UART, USART_FLAG_TXE) RESET); return ch; }重定向之后直接用 printf 打印调试信息效率非常高。注意用微库时要勾选 MicroLIB否则浮点格式化等比较耗资源。调试没问题之后正式代码里可以减少甚至关掉 printf避免拖慢主循环。4.3 ADC 多通道采集与参考电压校正ADC 这块是我在项目里花费时间最多的外设因为采集温湿度传感器的模拟输出电压时精度直接影响了 PID 控制效果。MS32C001-C 的 ADC 是 12 位精度理论上最高分辨率可以到 4096 级但实际精度受参考电压稳定性、PCB 噪声和采样时间影响很大。我的建议是ADC 参考电压不能直接接在系统电源上最好用高精度基准源或者至少保证 VDD 纹波足够小。采样时间不要设太短信号源阻抗高时采样时间不足会导致充电不充分采集值偏低。我一般是尽量把采样周期设置得比最小要求长一点换取稳定度。多通道采集时通道切换后要等一小段时间再启动转换否则前一次采样的残留电荷会影响结果。如果需要精确测量必须做软件校准。方法是用一个已知精度的参考电压输入到某个 ADC 通道然后计算增益和偏移误差再把所有通道的读数做线性补偿。做电池电压检测时还要注意分压电阻的阻值选择。分压电阻太大漏电流小但采样会变慢太小采样快但会白白耗电。在低功耗设备里一般用 100K 量级的分压电阻并且用 MOS 管或者 GPIO 控制分压网络的通断只在测量瞬间才上电测量完立刻断电。4.4 PWM 输出与定时器使用经验PWM 输出在电机调速、灯光调光、蜂鸣器音调控制上非常常用。MS32C001-C 的定时器可以输出多路带死区的 PWM直接驱动半桥电路或者做灯光控制很方便。我做的温控器里就用 PWM 控制加热棒的功率占空比由 PID 运算结果更新温控稳定度比传统的继电器通断方式高很多。配置 PWM 有几个规律分频和自动重装载值决定频率预分频决定计数时钟重装载值决定周期。占空比由比较值决定更新比较值的时机最好放在定时器中断的底部并且一次更新完成避免多个寄存器写入过程中产生中间状态。电机驱动等应用要配置死区避免上下桥同时导通。如果对频率精度要求高建议用外部晶振做定时器时钟源内部 RC 在不同温度下会有偏移。我在实际调 PWM 时就遇到过一个现象占空比输出偶尔跳变一开始以为是芯片问题后来发现是软件里更新比较值时被更高优先级的中断打断导致两个寄存器写入不同步。解决办法是先把比较值算好在关闭定时器中断的情况下同时更新或者使用影子寄存器机制一次更新整个周期。5. 低功耗、可靠性设计与量产注意事项5.1 低功耗模式选型与实测这颗芯片最大的卖点之一就是功耗Cortex-M0 内核本身很省电。我在做项目时把待机功耗做到了很低具体数值受外设和 GPIO 状态影响很大。芯片支持多种低功耗模式其实用选择只有两个原则需要被外部中断唤醒的就用睡眠模式不需要任何唤醒源的或者在极端低功耗场景下才考虑停机模式。先讲睡眠模式。睡眠模式的特点是 CPU 停住但定时器和串口等外设还在跑唤醒后可以继续执行。这种模式适合做定时唤醒类的应用比如每隔几秒采集一次传感器然后继续睡觉。进入睡眠前把不需要的外设时钟关掉GPIO 配置为低功耗状态这个低功耗状态很有讲究悬空的引脚会带来非常大的漏电所以要么启用内部上拉要么配置成输出低电平总之不能让引脚悬空。再讲停机模式。在停机模式里主要时钟源停止只有少数唤醒源可以唤醒唤醒后系统相当于复位重启要从头初始化。这个模式适合电池供电、大部分时间都在休眠的设备。实测待机电流比睡眠模式低一个到两个数量级。我最开始测试低功耗时电流一直偏高排查了很久才发现是 GPIO 的问题。有个引脚接的传感器模块模块内部有上拉电阻主控停机时模块仍然从引脚灌电流进来导致待机电流下不去。后来在传感器模块的供电线上加了 MOS 管主控睡眠的时候把整个模块断电才达到理想待机电流。这个属于硬件设计和软件联动的经验遇到功耗问题首先要查的往往不是睡眠模式配置而是外部电路在睡眠时的漏电路径。5.2 Flash 擦写寿命与掉电保存参数工程上有时候需要把设备参数存在 Flash 里比如校准系数、设备地址、用户设置。Flash 的擦写次数是有限的你需要规划好数据存储策略。大多数 M0 芯片 Flash 的擦写寿命在 1 万次到 10 万次量级具体看手册。如果你的设备经常写参数一天写几百次那很快就到寿命上限了。解决思路是尽量只在参数变化时写 Flash不要周期性重复写同样的值。使用多备份存储交替写入多个扇区一边写坏了就用另一块。写入时先写数据到临时扇区校验成功后更新正式扇区防止写入中途掉电造成数据损坏。关键参数加校验和或 CRC读取时校验校验不通过就用默认值。掉电保存是这个方向里最容易出问题的点。如果系统正在擦写 Flash 时断电Flash 内容可能是未定义状态。所以要做掉电检测加了电压监测功能当检测到电压低于某个阈值时先完成当前写入并停止新的写入。光靠软件延时做不到这一点必须在设计时就预留分压检测网络和中断引脚。5.3 批量烧录、代码保护与工厂测试量产烧录首先要考虑效率。用调试器逐台烧录太慢建议上脱机编程器或者下载底座一次性烧多台。脱机烧录前把固件、配置、序列号规则都准备好烧录时再校验一遍。芯片的读保护功能要记得开启开启之后别人没法直接通过调试器读出固件内容防止方案被轻易抄走。我建议量产流程里加一个“烧录后自检”环节程序加上自检逻辑上电后先检查按键、LED、传感器等关键外设自检通过后通过串口打印测试结果工厂用扫码枪扫描产品条码配合自动化测试工装把结果存档。这样产线就能自动筛掉焊接不良和芯片本身有问题的板子。这里还有一个经验芯片的 GPIO 在复位瞬间是高阻态如果产品里直接驱动了大功率负载上电瞬间会引起负载误动作。量产测试时要特别留意通电顺序必要时在软件里做“上电安全状态”在所有 GPIO 初始化完成后才允许驱动外部大功率设备防止烧坏后面电路。6. 实际项目里踩过的坑与排查手册6.1 调试器连不上芯片怎么办SWD 连接失败是个经典问题。常见原因有好几种我按出现频率排序一下现象可能原因排查方法连接失败提示 No target connected目标板没有供电先测量 VDD/GND确认电压连接失败但供电正常SWDIO/SWCLK 接反检查杜邦线或排针顺序连接时断时续调试线太长、接触不良缩短线缆降低 SWD 时钟频率烧录时报 Erase Failed读保护已开启先用工具执行整片擦除解锁程序运行后连接不上代码里把调试引脚复用成普通 GPIO检查 GPIO 复用配置预留调试恢复入口我自己遇到的坑是芯片的 BOOT 引脚状态和复位引脚电平导致下载失败。当时为了省成本BOOT 引脚直接悬空结果在某些环境下进入异常模式。后来按照手册要求接了外部下拉电阻下载恢复正常。所以在做板子的时候就把 BOOT、NRST 引脚的默认状态设计好不要等调试时再来补电阻。6.2 串口数据乱码或丢字节串口乱码一般不是芯片坏而是波特率或者时钟配置问题。排查顺序检查系统主频配置主频本身与预期不符那波特率一定会偏。检查串口模块的时钟源是内部 RC 还是晶振内部 RC 在高温下精度会下降。检查双方逻辑电平TTL 电平要一致RS232 和 TTL 不能直接对接。检查是否共地不共地会导致噪声大、乱码。检查发送缓冲区溢出提示信息刷屏导致程序卡顿。我实测过内部 RC 在低温环境下波特率误差会变大所以如果你做的是户外设备串口长时间通信时建议用外部晶振。如果是设备之间短距离调试内部 RC 完全可以接受。6.3 低功耗模式待机电流偏大这个问题的排查顺序应该是先量电流确认是跳动还是稳定偏高。逐个关外设定位是哪个外设还在耗电。检查 GPIO 浮空。检查外部模块的静态电流。检查 LDO 自身功耗和泄漏。我发现大多数低功耗问题都不是芯片本身的问题而是板子上的外围电路。比如一个 LED 指示灯的限流电阻计算错误一个上拉电阻忘去掉一个外部传感器在睡眠时仍然保持工作状态这些都会轻松吃掉几十微安电流。做低功耗产品时硬件原理图评审要非常严格每一路电阻、每一个芯片模块在睡眠模式下的状态都要画清楚不能只靠软件。6.4 ADC 采集值跳动大、误差大ADC 跳字问题是嵌入式里面的高频问题。先排除是不是信号源本身波动再用镊子短路输入引脚到地如果读数不归零说明 ADC 内部或基准有问题。还有可能是采样保持时间太短读取速度过快导致前一次充电电荷干扰。另外电源纹波会让 ADC 参考电压晃动上下几 mV 的波动在 12 位分辨率下就会产生明显的跳码。我的做法是在 ADC 前加一级 RC 低通滤波器时间常数根据采样率来定既可以滤掉高频噪声又能防止混叠。如果信号变化很慢比如温度传感器读数可以在软件上做多次采样取平均值或者用中值滤波去掉毛刺。但滤波代码要写得隐蔽不能让整个采集流程因为滤波而变得响应迟钝。6.5 芯片复位不规律、程序跑飞芯片复位不规律有两种大方向一是硬件上电源和干扰问题二是软件上的看门狗、栈溢出和异常中断。先测电压排除供电跌落再看复位引脚是否有毛刺最后查代码看看门狗有没有被意外触发。如果代码里开了中断但没有把所有中断入口都补齐被触发后程序跳到异常向量表最高优先级的地方表现就是看起来复位了实际是崩溃了。在这里提供个实用建议可以在主循环的低优先级位置加入关键变量和调用深度的校验发现异常时打印关键信息后主动重启。这个思路可以帮你快速定位跑飞原因。中断优先级和临界区保护也要好好检查M0 的中断控制器虽然简单但优先级分组和使能顺序很容易被忽略特别是在初始化多个外设时。写在最后的一点经验从拿到 MS32C001-C 到完成整个模拟项目我最深的体会是这颗芯片的“上手门槛”比想象低但上限完全取决于你对细节的把握。Cortex-M0 平台降低了编程难度可是硬件电路设计上的坑比如 GPIO 浮空、电源纹波、低功耗漏电路径、Flash 写入可靠性一个都不会少。真正花时间去解决的很多时候并不是复杂的外设框架而是一个下拉电阻没加、一个采样时序没等够这类小问题。如果你正在评估这颗芯片我建议先去认真读一遍数据手册的引脚功能表和电气特性表画原理图前把每个引脚的默认状态、复用关系、耐压要求都标出来再做开发。芯片本身是一个不错的低成本 32 位方案剩下的就看你的系统设计功力了。希望这篇文章能帮你少走几步弯路尤其在低功耗和量产这两个环节做到了就能稳定交付。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表