RK3568这块芯片,这几年在工控和开发板圈子里出镜率是真的高。我前后帮几个朋友调过RK3568的板子,从到手第一步的盲刷固件,到把MIPI屏点亮,再改成HDMI输出外接大屏,每一步都踩过不少坑。这篇文章就把我整理过的RK3568开发板刷机流程、MIPI屏调试思路、以及从MIPI切换到HDMI输出的设备树改动方案完整记录下来,内容包括固件烧写工具的用法、分区烧写与整包烧写的区别、MIPI DSI屏点不亮时的排查顺序、HDMI信号接口的检查方法,还有一些摄像头和系统扩展的经验,适合正在折腾RK3568这块板子的朋友直接参考。
1. 刷机前必须搞清楚的几件事
1.1 RK3568与RK3566到底差在哪
很多人第一次接触瑞芯微平台,会在RK3568和RK3566之间纠结。这两颗芯片都是四核Cortex-A55,NPU算力也接近,但它们在接口资源上的差别其实挺大,直接影响到你选开发板时能不能满足需求。
RK3568相比RK3566,最明显的差异是支持PCIe 3.0,带双千兆网口,而且内置的VPU视频编解码能力更强,支持到4K 60fps的H.264/H.265编解码。RK3566则更偏向平板类产品,省掉了PCIe,网口通常只有一个千兆。对于做工业控制、边缘计算、网关类产品的朋友,RK3568的可扩展性明显更好;如果是做带屏的消费类设备、简单的人机交互界面,RK3566也够用,成本能压得更低。
这个区别跟刷机有什么关系?关系很大。网上很多固件和刷机资料是混着发的,如果你拿RK3566的固件刷到RK3568的板子上,启动后大概率会在内核阶段卡死,因为设备树里外设配置对不上。我建议刷机前先通过芯片表面的丝印确认型号,不要只看开发板外壳标签,有的公版外壳贴纸印错了也不奇怪。
1.2 刷机前的工具清单与版本选择
给RK3568刷机,最常用的工具是瑞芯微官方的RKDevTool,配合Windows驱动DriverAssitant。我平时常用的组合是DriverAssitant v5.0加RKDevTool v2.96,这两个版本在Win10和Win11下实测都稳定。驱动安装这一步很多人跳过了,觉得插上USB就能识别,结果设备管理器里看到一个带感叹号的未知设备,怎么烧都失败。
正确的做法是先运行DriverAssitant,点击驱动安装,然后把开发板以Loader模式连接到电脑。进入Loader模式的操作是:先按住板上的RECOVERY键不放,再插入USB线(有一些板子是按住MASKROM键),等电脑识别到后松开。驱动安装成功后,设备管理器里会多出一个Rockusb Device设备,这时候打开RKDevTool,就能看到设备已经连接,读取到芯片信息以及Loader版本。
还需要注意一点:数据线一定要用能传数据的线,最好是USB 3.0的Type-C线。有些Type-C线只能充电,插入后设备管理器反复报USB设备无法识别,排查一圈才发现是线的问题。我踩过一次,后来抽屉里专门放了一根标“D+”的传数据线,只用来刷机。
1.3 先想清楚:你的显示输出到底怎么走
刷机只是第一步,显示输出才是很多人真正要解决的需求。RK3568的显示链路跟不少芯片不一样,它内部有VOP2(Video Output Processor),负责把图形合成后的画面输出到各个显示接口,包括HDMI、MIPI DSI、eDP、LVDS等,但同一时刻VOP2的各路port不能随便乱映射。
有朋友问,我接一块MIPI屏,为什么板上明明有HDMI接口,插上显示器却没信号?因为没有在内核设备树里配置route_hdmi这条显示链路。RK3568默认固件可能把VOP2的port0分配给了MIPI DSI,而HDMI需要用到另一条route。这就是为什么建议刷机前先想清楚显示输出走哪路:如果只用MIPI屏,固件里就要确保MIPI DSI节点被使能;如果要用HDMI外接大屏,就要确认HDMI的route节点状态;如果两个都要同时显示,那得用双显示输出配置,两个接口分配到不同的vop port。
这个问题如果不提前规划,后面每次修改设备树、重新编译内核、再刷boot分区,反复折腾浪费时间。我自己现在养成的习惯是刷机前先到板子对应的SDK文档里查一下这块板子默认的显示方案,再决定刷哪个固件,能省掉大半麻烦。
2. 固件烧写完整流程:从Loader分区到整包烧录
2.1 进入Loader模式:驱动安装与按键配合
我先说一个最常见的失败场景:板子插上USB,RKDevTool一直显示“没有发现设备”。这里首先确认的是驱动,其次再确认模式有没有进对。
RK3568支持的烧录模式主要有Loader模式和MaskRom模式。Loader模式是通过按RECOVERY键进入的引导烧录模式,使用频率最高,普通出厂固件的烧写都走这个模式。MaskRom模式是Loader损坏或者设备变砖之后使用的底层模式,此时设备管理器会识别到单独的Rockusb设备,烧写时一般要配合短接板上的MaskRom焊盘操作。
具体操作顺序可以按这个来:
- 断开开发板所有电源。
- 按住板上的RECOVERY键(有的板子叫Download键)。
- 保持按住,插入USB线到电脑。
- 等待2-3秒,电脑提示安装驱动或者设备管理器出现Rockusb Device。
- 松开按键,打开RKDevTool确认设备状态。
如果按了RECOVERY键还是没有设备,试试短接MaskRom引脚。不同板子的短接点位置不一样,参考板卡的硬件说明文档。有的板子虽然没有物理RECOVERY按键,但可以通过GPIO映射到某个引脚,需要用杜邦线短接,因此建议买板子后先把原理图下载保存好,不然遇到变砖会非常被动。
2.2 RKDevTool分区烧写与整包烧写怎么选
RKDevTool界面上其实提供了两种烧写方式:一种是按分区烧写,另一种是烧写统一固件。统一固件通常是一个update.img文件,里面把parameter分区表、uboot、boot、rootfs等打包到了一起,操作最简单,点“升级固件”然后选文件就能烧。但整包烧写有一个问题:它会把整个flash清掉,所有分区都恢复到出厂状态。
分区烧写则灵活得多,适合日常开发。修改了内核设备树、只重新编译了boot.img,就可以只烧boot分区,不用重刷整个系统。这种方式尤其适合调试屏幕或摄像头,因为改驱动、编译、烧写整个流程可以控制在几分钟内。
分区烧写前要确保你的固件和你的分区表是对应的。RK3568的分区表在parameter.txt里定义,常见的分区有:
- uboot:启动引导
- boot:内核和设备树
- rootfs:根文件系统
- recovery:恢复模式
- misc:标记启动模式
如果不小心烧错了不同类型的分区,比如把一个完整的update.img直接拖到boot分区烧,板子基本就变砖了,得重新进MaskRom模式恢复。我见过有人整包和分区烧写概念混淆,把烧录工具里“导入”和“执行”按钮当成同一个功能,结果分区数据被覆盖,后来只能短接恢复,浪费了不少时间。
2.3 烧写后的第一次启动验证方法
烧写完成并不代表系统一定能正常启动。我每次烧完,都不急着接屏幕,先接上串口调试线看启动日志。RK3568的调试串口通常位于板卡上标注UART2的位置,波特率一般是1500000(1.5Mbps),这不是常见的115200,直接用115200读会出现乱码。
启动日志里主要关注几个关键节点:uboot版本信息、内核加载阶段的打印、rootfs挂载是否成功。如果启动卡在Starting kernel,最可能的原因就是设备树和内核版本不匹配,或者固件的DDR初始化参数与板子硬件不兼容,此时换固件版本排查。
如果串口没有输出,先检查串口电平是否匹配,RK3568的调试串口是3.3V TTL电平,直接用USB转TTL模块连接时要确认模块也是3.3V电平,接到5V的模块上可能烧坏串口引脚。不少转串口模块上有个跳帽选择3.3V或5V,很多人忘记调,我就在这块浪费过半个下午。
系统启动后,可以用以下命令快速检查显示相关状态:
# 查看DRM设备状态 cat /sys/kernel/debug/dri/0/state # 查看已加载的显示模块 ls /sys/class/drm/ # 查看framebuffer信息 cat /proc/fb如果/sys/class/drm/下能看到card0-HDMI-A-1或者card0-DSI-1这样的节点,说明内核已经识别到了显示接口,下一步就该确认信号是否真正输出。
3. MIPI屏显示适配:设备树、时序与常见翻车点
3.1 MIPI屏不亮,先分硬件还是配置问题
MIPI屏不亮是RK3568开发板调显示时候最让人头疼的问题,因为“不亮”这个现象太笼统了。是屏幕完全黑屏?还是背光亮但无画面?还是画面闪烁?这三种现象对应的排查方向完全不同。
我的经验是先按这个顺序过一遍:
- 背光不亮:检查背光电源,看背光驱动有没有使能,GPIO状态对不对。
- 背光亮但无画面:基本可以判定MIPI数据通道或屏幕初始化时序有问题,优先怀疑设备树参数和上电时序。
- 画面闪烁或花屏:重点查MIPI时钟频率、lane数量、分辨率时序参数。
把问题归类之后,再用万用表量供电,用示波器抓信号,效率会高很多。乱猜是解决不了问题的,更不要一上来就怀疑芯片坏了,MIPI屏点不亮的问题,绝大多数出在配置上。
3.2 设备树里MIPI DSI屏的关键参数确认方法
RK3568内核通过设备树描述MIPI DSI屏的型号、时序和功耗相关配置。我以一块常见的5.5寸1080P MIPI DSI屏为例,它在设备树里大致包含以下节点:
&dsi0 { status = "okay"; rockchip,lane-rate = <891>; panel@0 { compatible = "simple-panel-dsi"; reg = <0>; backlight = <&backlight>; reset-gpios = <&gpio3 RK_PB4 GPIO_ACTIVE_LOW>; pinctrl-names = "default"; pinctrl-0 = <&lcd_panel_reset>; enable-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>; dsi-lanes = <4>; display-timings { native-mode = <&timing0>; timing0: timing0 { clock-frequency = <148500000>; hactive = <1080>; vactive = <1920>; hback-porch = <40>; hfront-porch = <80>; vback-porch = <10>; vfront-porch = <20>; hsync-len = <4>; vsync-len = <4>; de-active = <0>; pixelclk-active = <0>; }; }; ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; panel_in_dsi: endpoint { remote-endpoint = <&dsi0_out_panel>; }; }; }; }; };拿到一块新屏,最麻烦的是timing参数。通常可以在屏厂给的规格书里找到时序表,对照hactive、vactive、back-porch、front-porch、hsync-len这些值填进去。如果规格书给的是HTotal和VTotal,也可以通过计算得出porch值:hback-porch = HTotal - hactive - hfront-porch - hsync-len。
还有一个隐藏参数叫lane-rate,表示每条MIPI lane的数据传输速率,单位是MHz。计算公式可以按像素时钟来估算:
lane_rate = pixel_clock * bits_per_pixel / dsi_lanes比如1080P RGB888屏,每个像素24bit,4条lane,像素时钟148.5MHz,计算如下:
lane_rate = 148.5 * 24 / 4 = 891MHz有些屏参数里的lane-rate写得不准确,内核反而会按照错误值配置PHY,导致屏幕黑屏或者只有上半屏显示。这种问题用示波器抓时钟信号就能发现偏差。
3.3 背光、复位、上电时序这三大坑
MIPI屏最常见的三个坑分别是背光不亮、复位引脚配置错误、以及上电时序不对。
背光这块,RK3568一般用PWM调节亮度,设备树里会有backlight节点,它依赖PWM控制器。检查背光的时候先确认PWM节点是否使能、默认亮度是否为非0值。有的固件默认亮度是0,结果屏幕亮不起来,变量一追才发现是backlight-brightness-level初始化为0了,把默认亮度改成128后正常。
复位引脚的问题在于极性。屏厂的复位引脚通常低有效,也就是复位引脚拉低、然后拉高,完成一次复位操作。但不同屏的复位时序要求不同,有的要求复位后等待10ms再初始化,有的要求120ms。我在调试一块ST7701S驱动IC的屏时,复位后初始化太快,导致屏幕花屏,后来在上电流程里加了延时,问题才解决。
上电时序方面,MIPI DSI屏通常会要求电源、复位、初始化三者的时序关系:先供电,再释放复位,延时后发送初始化命令。如果板上用的一颗LDO同时给屏幕和摄像头供电,供电稳定时间可能不同,屏幕就会出现概率性点不亮。这类问题比较隐蔽,只能用示波器同时抓电源和复位波形,确认时序是否符合规格书要求。
3.4 用示波器看MIPI时钟信号波形
MIPI DSI的信号是差分信号,包括一组时钟lane和若干组数据lane。可以抓时钟lane的波形来判断MIPI输出是否正常。用示波器抓MIPI时钟波形时,探头的接地线要尽量短,最好用靠近探头的接地弹簧,直接用长接地夹会导致高频信号失真,看起来就像信号质量差。
MIPI时钟lane的频率在正常输出时会稳定在一个固定值。根据前面算出来的lane_rate,在DDR模式下,时钟lane的实际频率是lane_rate的一半,例如lane_rate是891MHz,那么示波器上看到的差分时钟频率应该在445.5MHz附近。如果测出来频率差太多,要么设备树里的lane-rate填错,要么屏幕的初始化时序不对导致PHY没正常工作。
实测中如果屏幕正常点亮,D0数据lane上能看到差分波形,而在黑屏状态且没有画面输出时,数据lane的电压基本平行,只有时钟lane在跑。这样就能快速区分MIPI控制器有没有正常工作。
4. 从MIPI切换到HDMI输出:显示链路调整
4.1 HDMI接口信号定义与常见误区
MIPI屏调试正常后,很多人想把画面转到HDMI接大屏显示器。切换之前,我先把HDMI接口的信号定义列一下,因为排查无信号问题时要用到:
| 引脚功能 | 说明 | 排查要点 |
|---|---|---|
| TMDS Data0-2 | RGB数据通道,差分信号 | 需要示波器确认有波形输出 |
| TMDS Clock | 像素时钟 | 频率随分辨率变化,4K60约594MHz |
| DDC(I2C) | 读取显示器EDID | SDA/SCL连通性,电平3.3V |
| HPD | 热插拔检测 | 显示器未接入时此引脚为低电平 |
| CEC | 消费电子控制 | 部分屏幕没有此功能,默认悬空 |
| 5V | 给HDMI源端供电 | 多数开发板有输出,注意别短路 |
HDMI无信号,最常见的原因不是驱动没配好,而是HPD检测不到。RK3568的HDMI控制器依靠HDMI接口的HPD信号判断显示器是否接入,如果HPD引脚电平不正确,内核不会使能HDMI输出。用万用表量一下HDMI座子的HPD引脚对地电压,正常接入显示器时应为高电平,没有显示器时为0V。很多时候驱动看起来一切正常,其实只是线没插好或者转换头太差,信号质量不过关也会导致持续黑屏。
4.2 切换HDMI输出的设备树修改示例
在RK3568 SDK中,显示输出的路由关系通常在内核设备树里配置。以VOP2为例,如果默认配置是MIPI DSI输出,现在要切换到HDMI,设备树里需要使能HDMI相关节点,并把route_hdmi指向对应的vop port:
&hdmi { status = "okay"; }; &route_hdmi { status = "okay"; connect = <&vp0_out_hdmi>; }; &dsi0 { status = "disabled"; }; &route_dsi0 { status = "disabled"; };需要特别说明,MIPI DSI的节点不能同时跟HDMI抢同一个vop端口。RK3568的VOP2有多个video port,例如vp0、vp1、vp2,可用的连接方式需要参考SDK里对应板型的dts文件。我调试时曾同时使能了dsi0和hdmi,结果两个接口都没有输出,原因就是把vp0同时分配给了两个输出,导致路由冲突。后来按SDK文档把dsi0停掉,只启用hdmi,画面才正常出来。
如果确认设备树没问题但HDMI依然黑屏,检查一下启动时是否有类似hwc或weston的显示合成进程占用了MIPI输出。RK3568带GPU方案的系统里,显示合成器会主动读取DRM设备状态,如果weston加载时选错了后端,HDMI同样没画面。
4.3 多路HDMI输入输出的场景怎么扩展
有时候项目需求不止一路HDMI输出。比如要做视频矩阵或多屏拼接,在RK3568基础上外接视频转换芯片是很常见的做法。有网友问过“4路HDMI输入1路HDMI输出的芯片怎么选”,这里提一下,这种场景通常需要一路支持多输入切换的HDMI切换器芯片,或者通过MIPI CSI转HDMI输入的采集方案。
RK3568本身只有一路HDMI TX输出,要扩展成为4路HDMI输入转1路HDMI输出的信号调度系统,可以使用外置的HDMI交换芯片,通过I2C或SPI控制输入通道切换,HDMI输出再接回RK3568的HDMI输入端口。但要注意,RK3568原生没有HDMI RX输入接口,如果要采集外部HDMI信号,通常通过MIPI CSI接口外接HDMI转MIPI CSI的采集模块实现。这种方案的延迟和兼容性需要提前测试,不同转接芯片对HDCP和时序的处理差异很大。
对于只是想把RK3568接到会议室大屏这种简单需求,完全不需要考虑外置芯片,直接用HDMI线连接即可,前提是把route_hdmi配好。
5. 显示之外的高频扩展需求
5.1 RK3568调试MIPI摄像头:OV5695与OV8858
显示调试完之后,很多人会接着做摄像头。RK3568的MIPI接口不只用于显示,还能接MIPI CSI摄像头,像OV5695、OV8858这些常用sensor我都在RK3568上调过。调试过程中发现,摄像头不出的问题往往和显示问题有相似之处,第一是电源,第二是MCLK,第三是复位和上下电时序。
RK3568给sensor提供的参考时钟MCLK一般是24MHz,可以在设备树里通过pinctrl配置gpio口输出时钟。检查MCLK是否正常,用示波器抓sensor的XVCLK引脚,能抓到幅值约1.8V、频率24MHz的方波就说明时钟正常。如果没有波形,优先确认设备树里摄像头节点是否引用对了clock ID。
OV5695和OV8858都是通过I2C配置寄存器,它们的I2C地址不同,OV5695的地址一般是0x36,OV8858是0x36或0x20视具体配置而定。I2C地址错误会导致内核日志反复报sensor not found,用i2cdetect命令能快速验证设备是否在线:
i2cdetect -y 6如果看到对应的地址有设备编号输出,说明sensor已经被正确供电和复位,问题大概率出在驱动配置;如果扫描不到设备,就得从硬件连接和供电查起。
5.2 RK3568上做EtherCAT主站的体会
RK3568在网络实时通信场景中的应用也很多,特别在工业控制领域,不少人想在RK3568上跑EtherCAT主站。EtherCAT IGH主站依赖网卡的实时性能,通常要求使用特定型号的网卡芯片,比如Intel的i210/i211,或者瑞昱的RTL8168系列。
RK3568原生自带的GMAC接口能否直接用于EtherCAT,答案是分情况。有些EtherCAT从站设备对主站网卡要求不高,直接用原生千兆网口配合IGH也能跑起来,但实时性和抖动性能会差一些,控制周期一般只能做到1ms左右,再高就稳不住。如果项目对同步性要求严苛,建议用PCIe接口外接Intel网卡,然后给内核打上RT补丁,这样能把控制周期做到500us甚至250us以下。
适配IGH时需要注意网卡驱动和实时补丁的匹配问题。IGH官方文档建议在EtherCAT主站机上使用专门打补丁的内核,而不是直接用主线的PREEMPT_RT补丁。我在RK3568上实验时,先给内核打上RT补丁,再编译IGH,然后用ethercat命令扫描从站,实测成功率还是比较高的。具体步骤是:编译内核时打开igb驱动,配置CONFIG_IGB=y,然后编译安装IGH,启动主站前用ethtool确认网卡工作在直通模式。
5.3 在RK3568上挂载Ubuntu与桌面系统的注意点
很多人拿到RK3568开发板,第一步就是刷成Ubuntu系统。热词里也有“开发板挂载Ubuntu”的说法,其实是指将Ubuntu的rootfs刷入或挂载到板子上。RK3568官方SDK通常会提供Ubuntu rootfs镜像,可以直接整包烧写,也可以用SD卡或NVMe硬盘制作独立系统启动。
如果在NVMe SSD上跑Ubuntu,需要注意固件里是否支持从PCIe NVMe启动。RK3568的uboot默认可能只从SD卡和eMMC加载内核,需要在uboot环境变量里加上对NVMe设备的支持。设置方法是在uboot命令行下执行:
setenv boot_targets 'nvme0 mmc0 usb0' saveenv设置之后,就能把Ubuntu系统装在NVMe盘里,开机自动从NVMe引导,实测下来读写速度比eMMC明显好很多,尤其是编译内核这类大量IO的操作,体感差距很明显。
桌面系统还有一个常见问题是HDMI没有声音。RK3568的HDMI音频是通过I2S接口将音频数据发送到HDMI控制器,再和视频一起输出。如果系统里跑的是带桌面的Ubuntu,插上HDMI线后没有声音,检查alsa配置文件里默认声卡是否指向了HDMI声卡,以及weston或X11是否有音频后端。
6. 常见问题排查速查与个人避坑总结
6.1 刷机失败问题速查表
我把实际操作中遇到的典型问题整理成了表格,方便直接对照排查:
| 现象 | 可能原因 | 解决方向 |
|---|---|---|
| 电脑不识别设备 | 驱动未安装/数据线问题 | 重装DriverAssitant,换数据线 |
| RKDevTool提示设备连接超时 | 没有进入Loader/MaskRom模式 | 重按RECOVERY键或短接MaskRom点 |
| 烧写过程中报写失败 | 分区表与固件不匹配 | 检查parameter.txt,按官方默认分区烧写 |
| 启动卡在Starting kernel | 设备树与内核版本不匹配 | 换固件或重新编译适配的boot.img |
| 背光亮但无画面 | MIPI时序/初始化代码问题 | 用示波器抓MIPI时钟,核对timing参数 |
| HDMI黑屏 | HPD检测异常或route未配置 | 量HPD引脚电压,检查route_hdmi节点 |
| HDMI无声音 | 声卡路由错误 | 用alsamixer选择HDMI声卡设备 |
这个表只列了高概率点,实际排查时还是建议按照从硬件到软件的顺序来,先把电源、信号、连接确认一遍,再动软件配置,会少走很多弯路。
6.2 显示输出异常快速排查路线
如果是显示输出完全不工作,我建议按下面这个顺序过一遍,最多半小时就能定位到问题。
第一步,看串口日志。内核启动时drm相关模块会打印VOP、HDMI、DSI的初始化状态。如果出现类似vop2 is disabled的信息,先回设备树检查对应节点的status是否为okay。
第二步,检查内核是否识别到显示设备。执行ls /sys/class/drm/,如果该有的节点没有,说明驱动初始化阶段就失败了。节点存在但没有信号,才进入第三步。
第三步,检查用户态合成进程。带GUI的系统里,weston或X11会对DRM设备加锁,如果它们没有正确启动,HDMI即使配置正确也看不到画面。尝试杀掉显示进程,直接用framebuffer输出看看是否正常。
第四步,硬件信号检查。用示波器量HDMI的TMDS Clock对地波形,正常输出时能看到明显差分波形。如果示波器显示无信号,再反向检查HDMI接口供电、HPD、DDC一连串信号。
6.3 我个人总结的几条避坑经验
调试RK3568这一年多,有几条经验是反复验证过的,写在这里给后来人参考。
第一,保存一份可用的干净固件。无论怎么改配置,电脑里始终留一份官方出厂固件。系统玩坏了随时刷回去,能节省大量调试时间。我习惯把不同版本固件按照日期和功能命名,比如rk3568_hdmi_20250101.img,避免过了一个月自己都分不清哪个能用。
第二,设备树改动要遵循最小化原则。一次只改一个变量,测试通过后再改下一个,不要在没有任何验证的情况下同时调整屏参、lane数、电源和复位引脚,出了问题根本定位不到。
第三,串口调试线是必须的。用串口看日志,远比通过屏幕显示反向判断问题要来得快。RK3568的调试串口波特率是1500000,提前在SecureCRT或MobaXterm里配置好。没有串口日志的嵌入式调试,基本等于盲人摸象。
第四,MIPI屏的初始化代码(即屏厂给的init sequence)尽量用SDK标准格式组织,不要随意修改延时和命令顺序。很多屏出现暗屏、花屏、闪烁,都是init sequence里某个延时过短导致的,加大到屏厂建议值之后症状就消失了。
这个内容后续如果要深入,可以再写写RK3568在双屏异显、摄像头多路接入、以及EtherCAT实时性调优这几个方向的实战细节。我自己在实际操作中的体会是,RK3568虽然资料多,但真正能拿过来直接用的经验还是需要从一次次踩坑里攒,希望这篇记录能帮你少走几步弯路。