拓冰建站拓冰建站
首页 / 资讯中心 / 正文

STM32H5上移植MCSDK 6.4.2与FreeRTOS的完整实战指南

MCSDK 6.4.2 FreeRTOS Support for H5这个问题我在技术社区和客户答疑里被追问过不下十次。先说结论官方6.4.2版本的电机控制支持列表里没有STM32H5你在CubeMX里选一颗H563是没法直接勾上MCSDK然后一键生成工程的。但“官方不支持”和“不能跑”完全是两码事我自己就在H563评估板上把MCSDK 6.4.2和FreeRTOS一起跑起来了电机FOC控制正常FreeRTOS任务调度也稳定。这篇文章就把整个过程拆开聊透为什么官方忽略H5、MCSDK和FreeRTOS到底怎么协同、自己动手移植的详细步骤以及我踩过的一堆坑。先说一句题外话免得有刚入行的朋友误会。这个H5是ST的STM32H5系列微控制器Cortex-M33内核不是网页开发里的HTML5。两者差了十万八千里但在搜索和论坛提问里经常被混在一起。如果你是在找前端H5页面怎么调支付、怎么下载PDF、怎么跳小程序那这篇文章不是你要的。这里讨论的是电机控制、FOC算法、实时操作系统调度那一套硬核嵌入式内容。1. MCSDK 6.4.2的官方支持矩阵H5为什么被“忽略”1.1 先理清6.4.2这个版本到底带来了什么MCSDK是ST的电机控制软件开发套件全称Motor Control Software Development Kit。6.4.2属于6.x系列这一代最大的变化是全面转向HAL库和STM32CubeMX生态不再维护早期5.x那种基于标准外设库的工程。所以现在拿到MCSDK的常规路径是在CubeMX里通过Package Manager安装X-CUBE-MCSDK-FUL或者X-CUBE-MCSDK-SL然后在芯片选择界面选一颗官方支持的MCU配置电机参数后自动生成整个工程。6.4.2这个版本主要修了一批问题同时更新了对部分H7系列芯片的支持。从官方Release Notes能看到的支持清单大致覆盖了F0、F3、F4、G0、G4、F7这些主流电机控制系列后面逐步加入了一些H7型号。注意关键词是“官方验证过的”ST会针对每个支持的芯片做全套测试板验证包括时序、ADC采样精度、死区控制、保护逻辑等等。这套验证工作量大所以新芯片的适配周期普遍比较长。H5系列是2023年推出的新平台核变了外设变了安全特性也变了官方不可能在短时间内把它放进MCSDK的正式支持名单。如果你在CubeMX里尝试给H5勾选MCSDK中间件大概率会发现选项是灰色的这就是官方在告诉你这条路还没开。但这不意味着硬件上跑不了电机控制下面我会仔细分析。1.2 H5的硬件底子到底适不适合电机控制要理解为什么ST没有优先把H5纳入MCSDK支持列表得先看H5的硬件资源。H5系列主打的是250MHz Cortex-M33主频、TrustZone安全机制、硬件加密加速、丰富连接外设。从定位上看它的目标是中高端工业控制、物联网网关、安全认证类应用。而电机控制需要什么高精度PWM定时器、快速ADC、低延迟中断响应最重要的是生态验证。电机控制最核心的外设是高级定时器TIM1和TIM8H5上都有。它们带互补PWM输出、死区插入、刹车保护等功能这是做三相逆变器控制的基础。H5的ADC是12位采样速率在官方数据手册标称下能做到2.5MSPS级别对大多数20kHz载波的FOC应用来说够用。Cortex-M33的FPU处理浮点运算也不错跑FOC算法比上一代M4核心有一定提升毕竟主频更高了。但问题也明显。H5系列没有HRTIM高分辨率定时器而ST的高端电机控制参考设计里有不少是依赖HRTIM的。没有HRTIMPWM分辨率在250MHz主频下依然能做得很细但对于追求更高载波频率比如50kHz以上或者更精细死区控制的应用硬件基础就有些薄弱。另外一个因素是ADC注入组的采样时序灵活性H5的ADC设计和G4系列不太一样G4在电机控制上做过专门优化。这些差异导致ST需要重新调校全套电机控制库才能在H5上达到官方品质这不是短期能完成的。所以结论是H5的硬件能做FOC某些场景下甚至做得不错但没有经过官方调校只能用“民间方案”自己移植。下面我就详细讲移植这条路怎么走。2. 破解FreeRTOS与MCSDK结合的关键结构2.1 FOC的运行模型为什么电流环不进RTOS任务刚接触MCSDK和FreeRTOS组合的工程师最容易产生一个误解以为电机控制算法是放在FreeRTOS的两个任务里跑的。实际上完全不是这样搞清楚这一点后续移植和排查问题都会顺利很多。FOC磁场定向控制的核心是电流环。电流环需要以固定的频率周期性执行载波20kHz时就是每50微秒跑一次电流采样、坐标变换、PI调节、PWM占空比更新。这种硬实时任务有两个特点周期必须极准、抖动必须极小。FreeRTOS的任务调度器虽然也能做到毫秒级定时但它的时基来自Systick默认1ms一次tick而且任务切换要保存恢复上下文时间偏差就可能到几微秒甚至几十微秒。这个精度对电流环来说完全不可接受。所以MCSDK的设计是电流环放在定时器中断里。PWM定时器产生触发事件ADC同步采样三相电流采样完成后触发ADC中断在ADC中断服务函数里直接调用MCSDK的FOC核心处理函数完成电流环计算并更新PWM比较寄存器。整个过程是裸机中断驱动的不进入RTOS的调度范围。而FreeRTOS的任务负责的是更宏观的事情电机启停状态机、速度环运算、上位机通信、故障处理、用户逻辑。速度环的实时性要求通常是几百微秒到几毫秒用RTOS任务配合合理的优先级完全可以覆盖。这个层次关系决定了你在做移植和调优时的工作重点中断路径上的代码要干净、高效不能调用任何FreeRTOS的API因为中断优先级如果高于FreeRTOS管理的临界区调API容易导致系统崩溃。而RTOS任务里的代码可以放心使用队列、信号量、延时等进行调度。理解了这一点你就理解了整个MCSDK FreeRTOS架构的底层逻辑。2.2 OSAL层的真实面目MCSDK如何抽象RTOSMCSDK不是直接在代码里写vTaskCreate或者osThreadCreate这种具体RTOS调用的而是在中间隔了一层OSAL全称是Operating System Abstraction Layer。这层抽象早年是为了兼容MCSDK自己的一套简易调度器和第三方RTOS到了6.x版本官方实际支持的RTOS主要就是FreeRTOS或者说CMSIS-RTOS v2封装下的FreeRTOS。OSAL层提供的东西包括任务创建、任务延时、事件标志、消息队列、互斥锁。MCSDK的Advanced API里面任务调度和状态同步都通过这层接口来做。当你在CubeMX里把MCSDK的中间件设置成FreeRTOS后OSAL层会自动编译成FreeRTOS的实现如果选None就编译成MCSDK自带的裸机调度实现。这个设计对移植的意义很大。因为你在H5上手动移植的时候并不需要把MCSDK内部所有任务相关的代码都改成FreeRTOS调用——你只需要确保OSAL这一层能正确编译到FreeRTOS实现即可。实际操作中最干净的方式是让CubeMX生成一个带FreeRTOS的基础工程然后从官方支持列表的某个板子工程里把MC_App、MC_Control、MC_Driver、MC_Tasks这些目录整体拷过来让MCSDK的代码在H5工程里重新编译。只要OSAL配置正确MCSDK内部的任务机制就能自动跑在FreeRTOS上你几乎不用改MCSDK的源码逻辑。这就是OSAL层的价值。3. 在STM32H5上移植MCSDK 6.4.2 FreeRTOS的完整路径3.1 准备工作需要拿到的源码与工具链在动手之前先把材料准备齐全。我这个流程能跑通依赖的工具和源码包如下STM32CubeMX建议6.x较新版本能支持H5系列芯片包、STM32CubeH5固件包包含H5的HAL驱动和FreeRTOS中间件、X-CUBE-MCSDK-FUL 6.4.2包在CubeMX的Package Manager里下载、以及一份官方支持的电机控制板工程作为移植模板我推荐用NUCLEO-G431RB或者B-G431B-ESC1。G4系列和H5在部分外设上有相似性移植起来改动量小。还需要准备一个电机驱动板和一台被测电机。移植调试阶段强烈建议用低压小功率电机加电流型驱动板别一上来就上高压大功率设备容易出安全事故。我用的是一块24V的低压无刷驱动板电机是国产的一款云台电机参数自己了解即可。然后是H5的核心板或评估板。我手里是ST官方的NUCLEO-H563ZI用到了它板载的ST-LINK调试器很方便。需要注意的是NUCLEO-H563ZI默认配置里TrustZone有可能是开启的等下我会专门讲这个坑怎么处理。工具的版本匹配要强调一下CubeMX的芯片支持包、HAL库版本、FreeRTOS版本最好和MCSDK 6.4.2内部的依赖版本接近否则编译阶段会冒出一堆不兼容错误。我用的CubeMX版本是6.10左右H5的包版本是1.4整体兼容性没有问题。3.2 从G4工程克隆还是从零起步移植的第一步是确定基底工程。两个选择一是从零开始在CubeMX里配置H5工程然后把MCSDK代码目录拷进去二是在G4工程的基础上直接改芯片型号让CubeMX自动迁移。我两个都试过推荐第一种因为第二种的CubeMX跨系列芯片迁移经常会自动改乱你在外设上的配置处理起来比从零配置更恶心。从零开始的步骤是这样的第一步在CubeMX里新建H5工程选择NUCLEO-H563ZI对应的板卡型号。Board Selector界面找到NUCLEO-H563ZI后直接创建。此时先别急着加中间件先把RCC时钟树配好。H5的时钟树比F4G4系列复杂建议直接用CubeMX的Clock Configuration图形界面拉HSE外部晶振PLL倍频让SYSCLK跑到250MHzAPB1和APB2外设时钟尽量给到最大化。注意定时器的时钟源TIM1的时钟来自APB2域确认它的timer clock是250MHz这个值直接影响后面的ARR计算。第二步配置电机控制相关的外设。使能TIM1设为PWM Generation模式通道1、2、3做互补PWM输出同时把刹车功能打开。使能ADC1设置为注入模式注入通道分别对应电机的U相、V相电流采样点。配置DMA或者直接用中断方式读取ADC转换结果我建议先用中断方式调试起来简单。还不开FreeRTOS先把裸机工程编译通过再说。这一步的核心是让H5的TIM1和ADC正常初始化不报错。第三步从G4模板工程拷贝MCSDK代码。用CubeMX打开一个NUCLEO-G431RB工程并勾选X-CUBE-MCSDK-FUL生成生成之后在工程目录下找到MC文件夹整体复制到H5工程根目录。MC文件夹里包含MC_App、MC_Control、MC_Driver、MC_Framework、MC_Tasks、MC_Config这几个子目录。把这些目录加进H5工程的Include Path同时把相关源文件也加进编译列表。这一步做完之后直接编译你大概率会看到一大堆错误。不要慌这些错误大多是H5和G4的HAL库API差异导致的挨个处理即可。比如G4里的某些ADC函数签名在H5里可能有变化TIM的MSP初始化代码也要从G4的stm32g4xx_hal_msp.c移植到H5的stm32h5xx_hal_msp.c。这个阶段的关键是要细心逐个错误去查。3.3 时钟与ADC配置的关键计算移植过程中最容易出错也最关键的是PWM载波频率和ADC采样时序的计算。我以20kHz载波、H5系统时钟250MHz为例把计算过程完整走一遍。TIM1采用中心对齐模式Center-aligned mode 1。在中心对齐模式下一个完整的PWM周期包括计数器从0向上计数到ARR再向下计数回0这样两个过程所以PWM频率公式是f_PWM f_timer_clock / (2 x ARR)。把f_PWM定为20kHzf_timer_clock为250MHz那么ARR 250MHz / (2 x 20kHz) 6250。ARR算出来是整数非常理想。如果算出来不是整数运行频率就会有一点点偏差那就要微调PWM频率到最接近的可行值或者调整定时器时钟分频。ARR6250时TIM1的更新事件频率是40kHz也就是说每个PWM周期发生两次更新一次在计数器溢出ARR一次在计数器归零。ADC的电流采样就挂在这两个更新点上等于FOC电流环的采样频率是40kHz这就是电机控制里常说的双采样模式。双采样可以在一个PWM周期内分别采样高低桥臂导通状态下的电流在某些硬件拓扑下效果更好。如果只想单采样可以选择只在计数器溢出或归零时触发。ADC的转换时序也要算。H5的ADC时钟频率外部配置好后需要设置采样周期和转换周期。假设我们配置ADC时钟为50MHz单个通道转换时间是采样阶段加上12位逐次逼近阶段。如果采样周期选3.5个ADC时钟周期除以50MHz就是70ns的采样时间加上12位转换需要12.5个ADC时钟周期对应250ns。一个通道总转换时间约为70250320ns。每次FOC电流环需要采样至少两相电流U相和V相同时可能采母线电压这几次采样可以在一次注入组转换里顺序完成。在40kHz的采样周期25微秒内完成3次注入采样加若干规则采样时间余量非常充足。ADC的触发源选择TIM1_TRGO配置在TRGO上升沿触发让ADC同步于PWM事件开始转换保证电流采样的相位准确性。这些参数在MCSDK的配置文件中能对应到具体字段。关于ADC还有一个要注意的细节G4的FOC方案里ADC采样时机通常要避开PWM开关切换瞬间的电流尖峰。如果你的硬件设计没有做很好的电流采样滤波建议把采样点稍微往后挪一点比如在更新事件后延迟1到2微秒再触发ADC。这可以通过TIM1的重复计数器和触发输出相位来调整。H5的TIM1同样支持TRGO2等多路触发输出用起来比较灵活。3.4 FreeRTOS接入MCSDK的编译宏与任务初始化外设基本跑通后再来接入FreeRTOS。在CubeMX的Middleware分组里添加FreeRTOS选择CMSIS_V2接口。为什么选CMSIS_V2因为MCSDK 6.x的OSAL层是基于CMSIS-RTOS v2 API封装的它是连接MCSDK和FreeRTOS的桥梁。FreeRTOS的基础配置里有几个参数需要根据你的项目调整。第一个是configTOTAL_HEAP_SIZE即FreeRTOS堆大小。MCSDK的电机控制任务栈开销不小特别是速度环的状态机处理和部分调试组件建议给到16KB以上我实际配置了32KB。第二个是configMAX_PRIORITIES默认给到20到32就够用MCSDK会创建几个任务加上你自己的任务优先级数量足够即可。第三个是configUSE_TIME_SLICING建议开启可以让相同优先级的任务轮转调度调试时会友好一些。然后关键的一步在CubeMX里如果没法给H5勾选X-CUBE-MCSDK因为官方没支持你就需要手动在工程的编译宏定义里加上MCSDK需要的东西。具体来说要在C/C Preprocessor Symbols里确认有USE_HAL_DRIVER和STM32H563xx这两个由CubeMX生成的宏同时加上MCSDK的OSAL选择宏。MCSDK代码里通常会有类似“#ifdef MC_USE_FREERTOS”的条件编译分支所以你要把MC_USE_FREERTOS这个宏定义上确保OSAL层走的是FreeRTOS实现而不是裸机实现。当你把MC_USE_FREERTOS宏定义好MCSDK的mc_tasks.c文件会自动采用FreeRTOS的任务创建逻辑。以MCSDK 6.4.2为例MC_Tasks源文件里有几个典型的任务入口函数包括MCT_FSM_Task电机状态机管理任务、MCT_MotorControlTask速度环和FOC上层控制任务、MCT_UI_Task用户界面通信任务。这些任务在初始化阶段通过OSAL的接口创建。创建任务时的优先级分配可以直接参考官方模板电机控制任务优先级要高于普通用户任务但低于PWM中断和ADC中断的中断优先级。任务栈大小建议不要低于1024字4KB电机控制任务给到2048字更稳。初始化顺序也非常重要。在main.c里HAL_Init和SystemClock_Config之后要先用MC_StartMultipleMotors这种接口来启动电机控制库把TIM1和ADC的中断打开让FOC先跑起来然后才能调用osKernelStart()启动FreeRTOS调度器。为什么是这个顺序因为电机控制库需要在自己的中断环境下初始化几个关键状态如果先把FreeRTOS调度器跑起来再初始化电机库中断嵌套优先级在某些边界条件下可能产生竞争调试起来会很头疼。等调度器启动之后MCSDK的各个任务开始运行电机状态机从IDLE切换到READY你再去调用电机启停接口系统就正常工作了。3.5 中断优先级整个工程最容易翻车的地方中断优先级的配置真的是整个移植过程中最容易翻车的地方这里单独拿出来强调。Cortex-M33的中断优先级数值越小优先级越高而FreeRTOS为了内部临界区安全会规定一个“最高系统调用中断优先级”在FreeRTOSConfig.h里用configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY来定义。任何调用FreeRTOS API的中断它的抢占优先级数值必须不小于这个宏定义的值。但FOC的电流环中断不一样。ADC中断服务函数里直接调用了MCSDK的电流环计算函数严格来说它不应该调用FreeRTOS API所以它的中断优先级可以设置得非常激进抢占优先级数值小于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY。这样即使FreeRTOS正在处理某个临界区FOC中断也能立刻抢占保证电流环的实时性不受RTOS影响。这个设计是刻意的。我在H5工程里的具体配置是这样的ADC中断电流环优先级设置为抢占优先级0子优先级0TIM1更新中断和刹车中断设置为抢占优先级0子优先级1FreeRTOS本身管理的任务切换PendSV和Systick优先级为最低。FreeRTOSConfig里configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY设为1或2也就是只有优先级数值大于等于它优先级更低的中断才能调用FreeRTOS API。这样优先级0的FOC中断绝对不能被FreeRTOS打断数据一致性由中断抢占本身保证。如果这里配反了你会看到电机运行一段时间后突然卡死或者FreeRTOS任务莫名其妙崩溃。排查方法也很直接把FOC中断优先级调低一点或是把整个FreeRTOS先禁用只跑裸机FOC如果裸机下电机正常而加了FreeRTOS就出问题那九成是中断优先级配置不对。4. 实测中的典型坑与排查思路4.1 编译阶段的坑库版本冲突与头文件路径我在第一次尝试把MCSDK代码塞进H5工程时编译错误数量多到让人想放弃。最大的一类问题是HAL库版本不匹配。MCSDK 6.4.2在生成G4模板工程时自带的HAL驱动是某个特定版本而STM32CubeH5固件包里的HAL是另一套新版本两个版本的API存在细微差别比如ADC初始化结构体多了新字段、某些函数名变化等。最稳妥的办法不是强行让MCSDK的旧代码和新的H5 HAL兼容而是直接在H5工程里使用CubeH5的HAL驱动把MCSDK对HAL的依赖收敛到它实际调用到的那些API上。理论上MCSDK设计时尽量兼容HAL各版本但遇到API差异时不得不手动适配。另一个高频问题是头文件路径。MCSDK的MC文件夹里有大量跨目录引用MC_Control里的文件会去include MC_Config的头文件MC_App里会引用MC_Framework。你把MC文件夹拷过来之后必须保证所有子目录都在编译器的Include Path里否则编译器会报类似“motorcontrol.h not found”的错误而这个头文件其实就在MC_App/Inc下。在Keil里就是逐个添加包含路径在CMake工程里就是加target_include_directories。这个工作很机械但绝不能漏我建议你一次性把MC下的所有子目录都加进Include Path别留死角。还需要特别注意C语言标准。MCSDK源码里有些地方用了比较新的C标准特性和特定编译器的扩展GNU语法。如果你用GCC工具链建议把C标准设置到GNU17或更高如果用Keil AC6注意开启足够的C语言兼容级别。我曾经在GCC下没开合适的C标准导致MCSDK里一个用for循环内声明变量的文件直接编译失败当时排查了半小时才反应过来是C标准的问题。4.2 运行阶段的坑电机为什么嗡嗡响却转不起来编译全部通过刷进芯片电机表现却不正常这个阶段我花的时间反而比编译翻译更长。最典型的故障是上电后电机发出高频嗡嗡声但转子纹丝不动或者抖动但转不起来。先说一下嗡嗡声的含义。电机有声音说明三相PWM已经正常输出电流也确实进到了电机绕组里。转不起来说明电流的大小和相位不对FOC算法没形成有效的旋转磁场。可能原因有几个按排查优先级排序第一PWM极性和互补通道的映射是否正确。如果同一个半桥的上下管驱动信号逻辑反了或者U、V、W三相的PWM通路接错了那么电流方向就反了。我排查这个问题的办法是先不跑MCSDK的FOC算法直接手动给三对PWM输出一组固定的占空比组合用示波器看电机端的波形确认A A- 的互补关系和死区时间是否正常。波形正确再进FOC逻辑。第二ADC的电流采样方向或放大倍数是否配置正确。MCSDK底层把所有电流信号以Q15格式转换到内部标幺值体系如果你硬件上的电流采样电阻方向和MCSDK默认的正方向不一致软件里读到的电流符号就反了FOC算出来的电压矢量自然就错。很多MCSDK工程里都提供了电流采样极性的配置参数可以尝试对调采样通道或者在配置里翻转符号。第三角度估算或传感器反馈是否正常。如果你用的是无感FOC依靠反电动势观测器做转子角度估算那启动阶段对低速反电动势很小估算本来就容易失败如果你用的是有感FOC霍尔或编码器检查给到MCSDK的角度值是否连续变化。最简单的检查方法用手慢慢盘电机转子在调试器里观察角度变量是否跟着光滑变化如果角度值跳动可能是霍尔信号配线或者编码器配置有问题。第四电机参数是否严重偏离实际。MCSDK初始化时输入的电机相电阻、相电感、极对数等参数如果偏差太大电流环PI调节器一开始就饱和或者振荡。用万用表和LCR表实测电机的相电阻和相电感做到尽量准确。我当时就是偷懒直接照着一份相近参数填启动表现很不稳定后来把实测参数填进去问题立刻缓解了很多。4.3 H5特有的坑TrustZone、DCache与DMAH5这颗芯片和G4/F4最大的区别是引入了TrustZone和可配置的Cache。这两个特性在普通应用里能提升安全性和性能但在跑MCSDK这种老牌电机库时会带来一些额外的兼容性问题。先说TrustZone。STM32H5的TrustZone是可选的可以通过选项字节关闭。如果你的板子默认开启了TrustZone而你的代码都在非安全区运行同时MCSDK库和FreeRTOS也都要放在非安全区工程配置会很繁琐。我访问这颗芯片时遇到的现象是程序跑在非安全模式下但某些外设寄存器默认被安全属性管理一访问就触发HardFault。最省事的方案是用ST官方工具把TZEN选项字节关掉让整个芯片跑在非安全模式这样几乎和传统MCU一样MCSDK的裸奔代码不会有任何安全属性方面的别扭。关闭TZEN需要操作Option BytesWindows下可以用STM32CubeProgrammer在ST-LINK连接状态下写入也可以直接在调试器里设置。再说DCache和DMA。H5的D-Cache在开启时CPU访问内存的数据会先缓存到Cache里而DMA外设访问内存是直接访问SRAM两边数据不一致会导致你从DMA缓冲区里读到的电流采样值是旧的、或者直接被CPU写乱了。MCSDK的ADC采样如果使用DMA方式搬运数据你必须对使用的SRAM区域做Cache一致性处理比如每次DMA传输完成后调用SCB_InvalidateDCache_by_Addr清除对应地址的Cache行。如果你嫌麻烦干脆在H5上先关闭D-Cache。电机控制这种场景对Cache带来的性能提升并不敏感关掉之后少一类很难排查的bug。我实测关闭D-Cache后电流采样非常稳定中断延迟也完全扛得住40kHz采样率。最后说一个通用排查思路遇到随机性很强的故障先用最简配置跑通再逐步加功能。我习惯把系统裁剪到最小只保留TIM1、ADC和MCSDK核心FOCFreeRTOS暂时不启动裸机跑电机。确认裸机工作正常后再加入FreeRTOS任务。如果加了FreeRTOS之后才出问题那问题的范围就缩小到任务调度、中断优先级和资源竞争这几个领域排查起来高效得多。反过来也一样如果你先花一堆时间搞FreeRTOS电机硬件上有个错两个复杂系统叠加在一起排错难度直接指数级上升。在这个问题上再多说一点经验H5 MCSDK FreeRTOS这套组合根源上的复杂度在于三方各自的更新节奏不一样。H5是新产品CubeH5的HAL驱动每次更新都可能带来细微行为变化MCSDK 6.4.2的代码是围绕老平台验证过的FreeRTOS版本升级也会影响任务切换时序。如果你现在用的是更新的CubeH5版本或者升级到了FreeRTOS 11遇到奇怪问题先别急着怀疑H5芯片有问题检查一下三方版本的相互兼容性很多时候回退一个版本就能解决。毕竟官方一直没把H5纳入MCSDK支持名单就意味着每一条路都需要你自己去趟平。想清楚这一点心态就会稳很多。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门