深入解析NXP MK20微控制器:从ARM Cortex-M4核心到工业应用实战

发布时间:2026/8/1 16:06:04
深入解析NXP MK20微控制器:从ARM Cortex-M4核心到工业应用实战 1. 项目概述MK20一个被低估的经典如果你在电子、嵌入式或者DIY圈子里混过一段时间大概率听说过“MK20”这个代号。它不像STM32那样家喻户晓也不像ESP8266那样在物联网领域遍地开花但在很多资深工程师和特定行业的项目里MK20系列微控制器MCU一直扮演着“定海神针”般的角色。我第一次接触MK20是在一个工业控制项目上当时需要一颗能在-40℃到105℃宽温范围内稳定运行同时具备丰富通信接口和可靠模拟采集能力的芯片在对比了多个方案后最终选定了NXP原飞思卡尔的Kinetis K20系列。几年用下来它给我的感觉就是扎实、可靠几乎从不出幺蛾子。MK20到底是什么简单说它是NXP Kinetis K系列中基于ARM Cortex-M4内核的32位微控制器的一个子系列。这个“20”通常指代其内存配置比如128KB Flash 16KB RAM的MK20DX128或者是其性能定位。它诞生于ARM Cortex-M内核如日中天的时代虽然没有赶上后来M7内核的极致性能也没有M0内核的极致性价比但M4内核的“甜点级”性能——兼顾了不错的运算能力带硬件浮点单元FPU和能效使得MK20在需要一定数字信号处理如电机控制、简单音频处理同时又对成本和可靠性有要求的场合找到了自己的生态位。很多人可能会问现在有那么多更新、更炫的MCU为什么还要聊MK20原因恰恰在于它的“经典”和“稳定”。对于很多已经量产的产品更换主控芯片意味着重新设计硬件、移植软件、重新进行各种认证和测试成本极高。MK20拥有经过长时间市场验证的成熟生态、丰富的文档虽然有些老和大量的实际应用案例。对于学习者而言从MK20入手可以让你更深入地理解ARM Cortex-M4内核、MCU外设驱动开发、以及如何在没有太多“保姆级”HAL库的情况下与硬件打交道这种基本功在技术迭代飞快的今天反而显得更加珍贵。接下来我就结合自己多年的使用和调试经验为你深度拆解MK20的核心技术点、应用场景以及那些在数据手册里不会写的实操细节。2. MK20核心架构与选型解析2.1 ARM Cortex-M4内核与MK20的“定制化”MK20系列的核心是ARM Cortex-M4处理器。与更常见的M0和M3内核相比M4最大的亮点在于集成了单精度浮点单元FPU和一系列DSP指令集。这意味着它能够高效地处理涉及小数运算和数字滤波的算法。例如在实现一个PID控制器或者进行FFT快速傅立叶变换分析时硬件FPU能带来数量级的速度提升。然而芯片厂商拿到ARM内核的IP后会进行一系列的“装修”和“扩展”这就形成了不同品牌、不同系列MCU的差异。MK20的“装修”特点非常鲜明存储器加速模块Memory-Mapped Flash Accelerator这是Kinetis系列的一个关键设计。Flash存储器的读取速度通常慢于CPU核心频率这会导致CPU经常需要等待数据形成性能瓶颈。MK20的加速模块通过预取指和缓冲机制将Flash访问等效为一个零等待周期的存储器在特定频率下极大地提升了代码执行效率。在配置系统时钟时必须根据芯片型号和数据手册确保核心频率不超过Flash加速器所能支持的最大频率否则性能会急剧下降。交叉开关Crossbar Switch这是MK20内部总线架构的核心。不同于传统的总线矩阵交叉开关提供了更灵活、带宽更高的外设与内存、DMA之间的互联。简单理解它像一个高效的交通枢纽允许多个“主设备”如CPU、DMA同时访问多个“从设备”如Flash、RAM、外设减少了总线冲突提升了系统整体吞吐量。这在需要高频数据交换如ADC采集数据通过DMA直接存入内存同时CPU处理另一块内存中的数据的应用中优势明显。电源管理与低功耗特性MK20提供了多种运行模式如RUN运行、WAIT等待、STOP停止等。其低功耗设计尤其体现在STOP模式上在此模式下核心时钟关闭但部分外设如低功耗定时器、RTC和RAM数据可以保持功耗可以降到微安级别。这对于电池供电的设备至关重要。一个实操心得想要达到数据手册上标称的最低功耗必须仔细关闭所有未使用外设的时钟源和引脚上下拉电阻甚至需要将未使用的IO引脚配置为禁止状态Disable漏电流往往就来自这些不起眼的细节。2.2 型号解读与选型指南面对NXP官网上一长串的MK20型号如何选择型号命名包含了关键信息。以MK20DX256VLH7为例MK20系列名。D代表芯片具有硬件加密加速模块如AES、DES、SHA这是安全类应用的刚需。X代表扩展温度范围-40℃ to 105℃。如果是Z则是更宽的工业级温度。256Flash容量为256KB。V封装类型此处可能代表BGA或LQFP。L引脚数量此处可能代表64或80引脚。H7芯片版本或特定功能集。选型时需按以下维度考量性能与内存首先确定应用所需的Flash和RAM大小。务必为协议栈如USB、TCP/IP、操作系统如FreeRTOS和未来功能升级预留至少20%-30%的余量。如果涉及复杂算法256KB Flash和64KB RAM可能是起步配置。外设需求这是选型的重中之重。列一个清单通信接口需要几个UART是否需要高速UARTLPUART是否需要I2C、SPI是否需要USB OTG全速/高速是否需要CAN总线模拟功能需要多少路ADC精度要求12位/16位采样速率要求是否需要DAC定时与控制需要多少个通用定时器PWM输出、输入捕获是否需要电机控制专用的FlexTimerFTM模块是否需要实时时钟RTC安全与加密产品是否需要硬件加密AES、随机数生成器RNG或安全存储这直接决定要选带D后缀的型号。封装与功耗引脚数决定了芯片尺寸和可用的IO数量。功耗则需结合电池容量和工作模式常开还是间歇唤醒来评估。成本与供货这是量产必须考虑的。MK20系列生命周期很长但具体型号也需关注官方产品寿命状态。通常引脚数中等、配置主流的型号如MK20DX128VLH5、MK20DX256VLH7供货最稳定社区资源也最丰富。注意千万不要只看参数“有没有”而要深究“够不够用”和“好不好用”。例如ADC的采样速率在数据手册里是理想值实际使用中开启DMA、配置不同的时钟分频、以及PCB布局都会影响有效采样率。最好在选型初期就找到对应型号的评估板或核心板进行关键外设的实测。3. 开发环境搭建与项目初始化实战3.1 工具链选择经典与现代的权衡为MK20开发你有几条路可以走Keil MDKARMCC传统且强大在工业界保有量极高。其编译器优化效率高调试器稳定对ARM内核的支持最“原生”。缺点是商业软件许可证费用不菲且界面相对老旧。IAR Embedded Workbench与Keil齐名的另一巨头同样以优秀的编译器著称在某些基准测试上性能甚至更优。它和Keil是工程师求职时的“经典技能”。缺点同样是商业授权。GCC 开源IDE如VS Code、Eclipse这是当前越来越流行的免费方案。使用NXP官方提供的MCUXpresso IDE基于Eclipse或自行配置GCC ARM工具链如arm-none-eabi-gcc搭配VS Code成本为零灵活性极高。MCUXpresso还集成了配置工具和调试支持对新手友好。我的选择倾向对于个人学习和小批量项目强烈推荐MCUXpresso IDE或VS Code ARM GCC Cortex-Debug插件的方案。它让你更接近编译和链接的本质且生态充满活力。MCUXpresso SDK这不是IDE而是NXP提供的软件开发套件包含所有外设的驱动库Driver、中间件Middleware和大量示例工程。无论你选择上述哪种编译环境都应该下载对应MK20型号的SDK这是你开发的基石。3.2 从零创建你的第一个工程点灯与调试我们以MCUXpresso IDE为例手把手走一遍流程这里面的坑点比想象的多。步骤一安装与芯片支持包CSP安装安装MCUXpresso IDE后首先需要通过其内置的“SDK Builder”或“Installed SDKs”窗口在线搜索并安装你的MK20型号对应的SDK。例如搜索“K20D50”或“MK20DX256”。安装后SDK中的驱动库、头文件和示例代码就就绪了。步骤二创建新工程选择“File - New - C/C Project”然后选择“MCUXpresso IDE - MCUXpresso SDK Project”。在向导中选择你的MK20具体型号。选择SDK版本。关键一步选择工具链。如果你用IDE自带的GCC就选“MCUXpresso GCC”如果你用自己装的ARM GCC选“ARM GCC”。这里选错会导致后续编译失败。选择“Hello World”或“Empty”示例作为起点。建议选“led_blinky”如果有这是最直接的硬件验证。步骤三解读工程结构与关键文件工程创建后你会看到类似这样的结构/board板级支持文件包含你具体评估板的引脚定义、初始化代码。/driversNXP官方编写的外设驱动库fsl_uart.c, fsl_gpio.c等。注意这些是底层寄存器操作封装建议通读一两个理解其封装思想。/source你的应用代码主目录main.c就在这里。/project_settings链接脚本.ld文件和调试配置文件在此。链接脚本是重中之重它决定了代码、数据、堆栈在Flash和RAM中的布局。对于MK20你需要关注FLASH和SRAM的起始地址和大小这必须与数据手册完全一致。步骤四配置时钟树——MK20的“心脏”这是新手最容易卡住的地方。MK20的时钟源多样内部慢速时钟IRC、内部快速时钟IRQ、外部晶振OSC等。系统时钟Core Clock和外设时钟Bus Clock都由它们分频、倍频而来。 在main.c的初始化部分你会调用BOARD_BootClockRUN()之类的函数在board.c中定义。你必须打开这个函数理解其每一步配置使能外部晶振如果使用。配置锁相环PLL的输入源、倍频系数以得到所需的核心频率例如从8MHz晶振倍频到96MHz。选择系统时钟源来自PLL还是内部时钟。配置各总线AHB、APB的分频系数。一个常见的错误是配置的时钟频率超过了Flash加速器支持的最大频率导致程序运行不稳定。实操技巧在调试时可以在时钟配置完成后通过读取芯片的SIM_CLKDIV1等寄存器或者使用调试器查看相关变量来验证时钟频率是否配置正确。步骤五编写点灯代码与调试假设LED连接在PTA1引脚GPIO A口第1位。#include fsl_gpio.h #include pin_mux.h // 引脚复用配置 int main(void) { // 1. 硬件初始化时钟、引脚 BOARD_InitPins(); BOARD_BootClockRUN(); // 2. 配置GPIO gpio_pin_config_t led_config { kGPIO_DigitalOutput, 0, // 初始输出低电平 }; GPIO_PinInit(GPIOA, 1U, led_config); // 初始化PTA1 while(1) { GPIO_PinWrite(GPIOA, 1U, 1); // 拉高LED亮 SDK_DelayAtLeastUs(500000, SystemCoreClock); // 延迟500ms GPIO_PinWrite(GPIOA, 1U, 0); // 拉低LED灭 SDK_DelayAtLeastUs(500000, SystemCoreClock); } }编译并下载程序到开发板。如果LED没有闪烁按以下顺序排查硬件连接确认LED引脚是否正确限流电阻是否合适LED正负极是否接反。时钟配置确认系统时钟是否成功运行在预期频率。可以用示波器测量一个配置为输出的GPIO引脚用软件翻转它根据波形周期计算实际频率。引脚复用MK20的引脚大多有多种功能GPIO、UART、ADC等。BOARD_InitPins()函数里通过IOMUXC模块配置了引脚功能。你必须确认PTA1被正确配置为GPIO功能而不是其他外设功能。下载器与调试接口确认使用的是SWDSerial Wire Debug接口并且连接可靠。MCUXpresso IDE的调试视图可以查看寄存器和内存这是最直接的诊断工具。4. 关键外设驱动开发与深度优化4.1 GPIO与中断高效事件响应的基石GPIO看似简单但用好不易。MK20的GPIO模块功能丰富支持上下拉电阻配置、中断触发边沿/电平、高驱动能力等。中断配置要点 MK20使用嵌套向量中断控制器NVIC。配置一个GPIO中断的流程如下配置引脚为输入并启用内部上拉或下拉电阻以保持稳定状态。配置引脚中断通过GPIO_PinSetInterruptConfig()设置触发方式上升沿、下降沿或双边沿。使能NVIC中的对应中断每个端口PORTA, PORTB...对应一个中断向量。例如PORTA的中断向量是PORT_A_IRQn。使用EnableIRQ(PORT_A_IRQn)使能。编写中断服务函数ISR函数名需与启动文件startup_*.s中的向量表定义一致通常由IDE的框架自动关联或通过属性声明如__attribute__((interrupt))。在ISR中清除中断标志这是最易遗漏的一步必须在ISR内读取该端口的中断状态寄存器并清除对应的标志位否则会连续触发中断导致系统卡死。// 示例配置PTA2为下降沿触发中断 void PORTA_IRQHandler(void) { if (GPIO_PinGetInterruptFlags(GPIOA) (1U 2)) { // 检查PTA2中断标志 // 处理你的中断任务... GPIO_PinClearInterruptFlags(GPIOA, (1U 2)); // 必须清除标志 } // ... 可能还需要清除PORT模块的总体中断标志 }注意事项中断服务函数应尽可能短小只做标记、清标志等最必要操作将耗时任务放到主循环中基于标志位处理。避免在ISR中调用printf等可能阻塞或重入的函数。4.2 定时器PIT/FTM与PWM精准的时间控制MK20的定时器外设主要有两种周期性中断定时器PIT和FlexTimerFTM。PIT用于产生精确的周期性中断。它是一个递减计数器简单可靠。配置时主要关注时钟源通常是总线时钟Bus Clock和加载值Load Value中断周期 (Load Value 1) / 时钟频率。FTM功能强大是电机控制和复杂PWM输出的核心。它支持互补带死区的PWM输出用于驱动H桥防止上下管直通。输入捕获测量脉冲宽度或频率。输出比较在特定时刻触发动作。配置一个中心对齐PWM输出的关键步骤初始化FTM模块设置时钟预分频、计数模式向上/向下/中心对齐。配置FTM通道为PWM输出模式。设置周期通过MOD寄存器和占空比通过CnV寄存器。对于中心对齐模式占空比计算需特别注意有效电平时间与CnV和计数方向有关。使能通道输出和FTM计数器。一个踩过的坑当使用FTM的硬件触发ADC采样时即PWM中心点或过零点触发ADC同步采样需要精确配置FTM的同步触发输出。务必仔细阅读数据手册中关于FTMx_TRIG寄存器的描述并确保ADC的触发源选择正确。我曾因为一个触发极性配置错误导致ADC采样点完全错位调试了整整一天。4.3 ADC与DMA高速数据采集的黄金组合MK20的ADC通常是16位SAR ADC精度高但要想实现高速连续采样必须引入DMA直接存储器访问。典型的高精度数据采集流程ADC配置选择时钟源ADCK设置采样时间长采样时间可提高精度但降低速度配置为连续扫描模式使能硬件触发如来自FTM的触发信号。DMA配置设置源地址为ADC的结果寄存器如ADC0_RA。设置目标地址为内存中开辟的缓冲区如uint16_t adc_buffer[1024]。设置传输数据宽度半字对应16位ADC结果。配置为循环缓冲模式Circular Mode这样当缓冲区满后DMA会自动回到开头覆盖旧数据实现不间断采集。使能DMA传输完成中断当半缓冲或全缓冲满时通知CPU来处理数据。启动先启动DMA再启动ADC并使其等待硬件触发。当FTM的PWM信号触发ADC时ADC转换完成即自动发起DMA请求数据被无声无息地搬移到内存。性能优化点内存对齐确保DMA缓冲区地址按字4字节对齐可以提升DMA传输效率。双缓冲Ping-Pong Buffer使用两个缓冲区当DMA向缓冲区A写数据时CPU处理缓冲区B的数据反之亦然实现数据无缝处理避免丢失。ADC校准MK20的ADC有自校准功能。在上电初始化后应执行一次校准流程通常涉及写入校准寄存器可以显著减少零点误差和增益误差。5. 系统设计进阶与故障排查实录5.1 实时操作系统RTOS的引入当你的应用需要同时处理多个任务如按键扫描、显示刷新、数据上传、电机控制时一个简单的while(1)超级循环会变得难以维护且响应不及时。此时引入一个轻量级RTOS如FreeRTOS或ThreadX是明智的选择。在MK20上移植FreeRTOS的关键步骤获取源码从FreeRTOS官网下载源码。修改与硬件相关的文件FreeRTOSConfig.h这是核心配置文件。你需要根据MK20的硬件定义系统时钟频率configCPU_CLOCK_HZ、Tick中断频率configTICK_RATE_HZ并合理设置堆栈大小、任务优先级数量等。port.c和portmacro.h通常已经存在ARM Cortex-M4的移植层但你需要确认其中用于触发PendSV和SysTick中断的汇编指令与你的编译器兼容。MCUXpresso SDK有时会提供现成的FreeRTOS移植示例这是最好的起点。实现SysTick中断FreeRTOS的心跳Tick依赖于SysTick定时器。你需要确保SysTick_Handler中断服务函数中调用了xPortSysTickHandler()。创建任务在main.c中创建你的应用任务如vTaskLEDvTaskUART并启动调度器vTaskStartScheduler()。使用RTOS的注意事项堆栈溢出这是RTOS最常见的问题。务必使用FreeRTOS提供的堆栈溢出检测钩子函数vApplicationStackOverflowHook并在开发阶段开启此功能configCHECK_FOR_STACK_OVERFLOW。中断优先级ARM Cortex-M4的中断优先级数值越小优先级越高。SysTick和PendSV中断的优先级必须设置为最低数值最大以确保它们不会打断高优先级的外设中断。而像UART、DMA这些硬件外设的中断优先级应设置为高于它们。资源互斥当多个任务共享一个硬件资源如UART发送函数时必须使用信号量Semaphore或互斥量Mutex进行保护防止数据错乱。5.2 通信总线UART, I2C, SPI调试心法UART异步串口波特率误差计算波特率发生器的分频值UARTx_BDH和UARTx_BDL寄存器时务必使用浮点数计算并四舍五入到最接近的整数以最小化误差。误差应控制在2%以内否则长距离或高速通信时容易出错。中断与DMA对于高速或不定长数据接收强烈建议使用DMA空闲中断Idle Line Interrupt的方式。当总线空闲超过一个字符时间时触发中断在中断中处理DMA已接收的数据包效率远高于单个字节中断。I2C上拉电阻I2C总线是开漏输出必须外接上拉电阻通常4.7kΩ-10kΩ。电阻值过大会导致上升沿太慢在高速模式下通信失败过小则增加功耗。软件模拟 vs 硬件模块MK20有硬件I2C模块但它的状态机比较复杂调试起来有时比软件模拟用两个GPIO模拟时序更麻烦。在从机设备简单、速率要求不高100kHz时软件模拟反而更稳定可控。一个经典排查步骤当I2C通信失败时首先用逻辑分析仪或示波器抓取SCL和SDA波形看起始信号、地址字节、ACK信号是否正常这是定位问题的黄金法则。SPI时钟极性与相位CPOL/CPHA这是SPI通信匹配的首要条件。主从设备的CPOL和CPHA必须设置一致。数据手册通常会给出从设备如Flash芯片、传感器的时序图根据时序图确定CPOL和CPHA。数据帧大小MK20的SPI模块支持4-16位的数据帧。确保主从双方设置的数据位宽相同。DMA传输对于大批量数据读写如读写SPI Flash配置SPI的Tx和Rx为DMA模式可以极大解放CPU。5.3 常见问题排查速查表以下是我在多年项目中遇到的MK20典型问题及解决方法问题现象可能原因排查步骤与解决方案程序下载后不运行或运行一次后死机1. 时钟配置错误超频。2. 中断向量表地址错误。3. 堆栈溢出。1. 检查SystemCoreClock变量值用示波器测量核心时钟输出。2. 检查调试配置中ROM/RAM的起始地址和大小是否与链接脚本匹配。3. 在调试模式下单步执行看卡死在哪个函数或增加堆栈大小。GPIO输出正常但输入或中断不响应1. 引脚复用功能未配置为GPIO。2. 上下拉电阻未使能引脚悬空。3. 中断未使能或标志未清除。1. 检查IOMUXC相关寄存器配置。2. 配置GPIO时启用内部上拉或下拉。3. 在调试器中查看NVIC和GPIO中断使能寄存器、标志寄存器。ADC采样值跳动大不准1. 电源噪声或参考电压不稳。2. 采样时间不足。3. 未进行校准。4. PCB布局不佳模拟信号受数字干扰。1. 测量模拟电源VDDA和参考电压VREFH的纹波加滤波电容。2. 增加ADC配置中的采样周期sample time。3. 执行ADC自校准程序。4. 遵循模拟布局规则模拟地单点连接远离数字高频信号线。UART能发送不能接收或数据乱码1. 波特率不匹配。2. 收发引脚接反TX对RX。3. 硬件流控RTS/CTS未正确处理。4. 中断/DMA配置错误导致数据覆盖。1. 用逻辑分析仪测量实际波特率。2. 交叉连接TX和RX线。3. 如果不用流控在软件中禁用相关功能。4. 检查接收缓冲区大小和溢出标志。使用RTOS后系统偶尔死机1. 任务堆栈不足。2. 在中断服务程序中调用了可能导致阻塞的RTOS API如xQueueSend。3. 临界区保护不当资源冲突。1. 调大出问题任务的堆栈并启用堆栈溢出检测。2. 中断中只能调用带FromISR后缀的API如xQueueSendFromISR。3. 对共享资源全局变量、外设的访问用任务调度器锁或互斥量保护。低功耗模式无法唤醒或功耗高于预期1. 唤醒源如GPIO中断、RTC闹钟未正确配置。2. 进入低功耗模式前未关闭不使用的外设时钟和模块。3. 未使用的IO引脚配置为模拟输入或明确输出高低电平而非浮空。1. 确认唤醒中断的触发条件和优先级已配置且总中断已开启__enable_irq()。2. 在进入STOP模式前手动关闭ADC、DAC、定时器等模块的时钟。3. 对所有未使用的引脚执行上拉/下拉或禁用操作这是降低漏电流的关键。6. 从项目到产品可靠性设计与测试要点当你用MK20完成了一个炫酷的原型准备将其转化为可以量产的产品时下面的工作至关重要。硬件可靠性设计电源完整性MK20的模拟部分VDDA, VREFH对噪声极其敏感。必须使用LC滤波电路磁珠电容将其与数字电源VDD隔离。退耦电容通常0.1uF和10uF组合必须尽可能靠近芯片的每个电源引脚放置。复位电路不要依赖芯片内部的POR上电复位。外部增加一个可靠的复位芯片如MAX809确保在电源波动时系统能可靠复位。ESD与过压保护所有连接到外部的IO口如USB、串口、按键都应考虑添加TVS管或串联电阻以抵御静电和浪涌冲击。软件看门狗WWDG/IWDG MK20通常有独立看门狗IWDG和窗口看门狗WWDG。务必启用其中一个并在主循环或关键任务中定期“喂狗”。这是防止软件跑飞的最后一道防线。配置看门狗的超时时间要略长于你的最长任务执行周期但又要短于系统允许的失控时间。固件升级Bootloader 对于需要后期更新功能的产品必须设计Bootloader。一个典型的方案是将Flash分为两个区域Bootloader区起始地址 如0x0000_0000和应用程序区如0x0000_4000。Bootloader程序负责通过UART、USB或CAN等接口接收新的应用程序固件包校验CRC校验是关键并烧写到应用程序区。应用程序的开头需要设置正确的向量表偏移通过修改链接脚本和VTOR寄存器实现。Bootloader和应用程序之间需要约定好握手协议如特定的引脚状态、共享内存区的标志位来决定是进入Bootloader模式还是直接跳转到应用程序。测试与老化高低温测试将产品放入温箱在-40℃和85℃下分别运行所有功能至少24小时观察是否出现复位、数据错误或外设失效。长时间压力测试编写测试程序让所有外设ADC、DMA、通信接口满负荷或交错工作连续运行一周以上监测内存是否泄漏、系统是否死机。EMC测试如果产品需要过认证射频干扰和抗扰度测试是必须的。良好的PCB布局和软件上的容错设计如通信增加重试和校验机制能大大提高通过率。回顾与MK20打交道的这些年它给我的感觉更像是一位沉稳可靠的伙伴而非追求极致参数的先锋。它的价值不在于跑分有多高而在于那份“你交代给它的事它总能稳稳完成”的确定性。在纷繁复杂的芯片选型中这种确定性往往是最宝贵的。对于后来者我的建议是不要因为它“老”而轻视它深入理解它你会掌握一套应对复杂嵌入式系统的扎实方法论这套方法论的适用性远比你追逐某一颗最新型号的芯片要宽广得多。最后一个小技巧多去翻阅官方勘误手册Errata里面记录了芯片已知的硬件问题及软件规避方法这能帮你省去无数徒劳的调试时间。