十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

GD32H759+RT-Thread开发环境搭建:从零跑通第一个点灯实验

GD32H759+RT-Thread开发环境搭建:从零跑通第一个点灯实验 1. 为什么选GD32H759这颗料来做工控项目工控圈子里提到国产MCU很多人第一反应是STM32的替代方案但真正把性能和生态拉满的国产型号GD32H759绝对算一个。这颗芯片是兆易创新目前性能天花板级别的东西Cortex-M7内核跑到480MHz还带一个Cortex-M4的协处理内核这个双核架构在工控场景意味着什么意味着你可以在M7上跑主业务逻辑和实时控制M4单独处理通信协议栈或者冗余校验完全隔离互不干扰。我最早拿到这颗料的时候第一反应是这已经不是传统意义上32位单片机的概念了它里面集成了硬件加解密、图形加速器、以太网MAC甚至能直接挂SDRAM和外部存储控制器规格上完全够得着入门级应用处理器的门槛。再回头看工控的实际需求多路串口、CAN/CANFD、以太网、PWM、正交编码器接口、高精度ADC这些外设GD32H759基本一应俱全而且不是有就完事的水平是真正能扛活的那种。比如它支持3个12位ADC采样率能到5Msps左右配合M7内核的高主频做电机控制和电源监控这类需要实时采样的任务精度和响应速度都有保障。但说实话芯片本身再强开发体验跟不上也是白搭。GD32系列在国内火起来除了性价比还有一个很重要的原因是生态对标STM32做得太彻底用标准外设库写代码的思维模式可以无缝迁移。而GD32H759想要发挥全部性能裸机开发虽然可行但工控项目里大家更习惯跑一个RTOS来管理任务调度。这时候RT-Thread的价值就体现出来了国产开源RTOS中文文档齐全社区活跃度高对GD32系列的支持也在持续完善两者搭配属于典型的国产芯国产系统组合无论是成本敏感型产品还是需要自主可控的工业设备这条路都非常值得走通。这一篇是系列的第0篇不整复杂业务就把环境从零搭起来跑通一个点灯实验。但我会把整个过程中每个环节为什么这么做、会遇到什么坑讲清楚后面几篇再逐步往电机控制、协议栈移植、双核通信这些方向深入。2. 环境搭建前必须搞清楚的硬件细节选型和开发环境之间隔着一层很重要的东西就是你对板子的硬件资源心里要有数。很多新手一上来就装软件写代码结果要么找不到对应的器件包要么调试器连不上芯片折腾半天发现是硬件配置的问题。所以在搭环境之前先花几分钟梳理一下GD32H759的硬件资源和使用注意事项。2.1 核心参数与选型判断GD32H759那颗M7内核的主频是480MHz这数据在MCU领域相当夸张。配套的M4协处理器跑240MHz两个核之间通过内部硬件邮箱机制通信有点像异构多核的简化版。如果你之前的项目一直停留在Cortex-M3/M4级别刚接触这芯片会明显感觉到外设寄存器变得复杂了时钟树也从原来的单总线变成多层级结构APB1/APB2/APB3还有AHB外设挂载的时钟源不同初始化顺序也会有讲究。芯片内部Flash最大能到4MBSRAM是1MB这个容量跑RT-Thread完整版加各种组件绰绰有余。工控现场设备往往需要在断电瞬间保存参数它还支持外部SDRAM和QSPI Flash扩展整套存储体系非常完整。芯片封装方面我测试用的是LQFP176封装引脚数量够多IO口资源非常富裕。如果你的项目对板子面积敏感还有BGA封装的型号可选但手工焊接难度会高一些初期调试建议用带引脚的封装。2.2 调试器选型和连接方式GD32H759支持标准的JTAG和SWD调试接口我强烈建议优先用SWD四根线搞定占IO少连接稳定。市面上常见的DAP-Link、J-Link、ST-Link都能用但需要注意一个坑很多ST-Link或者盗版J-Link固件版本比较老对Cortex-M7内核的识别支持不完善可能出现能连上但无法单步调试或者下载后不自动运行的情况。我实际测试下来最稳妥的组合是正版J-Link V9以上版本或者用带固件较新的DAP-Link。如果你手头只有ST-Link建议先升级固件到最新版本再试大概率能解决。接线方面需要注意SWDIO和SWCLK这两根线尽量短一般控制在10cm以内高速调试时信号完整性才跟得上。另外GD32H759的复位脚最好也接到调试器上面防止调试时芯片跑飞了无法自动复位。2.3 电源和时钟系统GD32H759的内核电压是1.2V左右芯片内部有稳压器外部只需要提供3.3V主电源就行。但注意模拟部分比如ADC的参考电压VREF需要单独做滤波处理否则采样数据的噪声会比较大。这是工控设备做高精度采集时最容易忽略的细节。时钟系统是这芯片最复杂的部分之一。它内部有IRC振荡器精度一般上电默认走内部时钟。但你要跑满480MHz必须使用外部25MHz晶振经过PLL倍频上去。我在实验板上用的25MHz无源晶振匹配电容取10pF左右实测起振稳定。如果你使用的是其他频率的晶振比如8MHz或者12MHz需要仔细修改时钟配置代码否则系统时钟频率不对外设时序全乱。这里有一个关键点GD32H759的时钟树配置代码和STM32风格很像但寄存器偏移有差异不能直接照搬HAL库的代码。后面讲RT-Thread工程配置的时候我会单独说明。3. 开发工具链搭建MDK环境与器件支持包环境搭建这一步说简单也简单说麻烦也麻烦。很多人在这一步卡住并不是操作多难而是对工具链之间的关系不清楚。简单讲开发GD32H759需要三个层面的软件配合IDE负责编写和调试代码、编译器把C代码变成机器码、器件支持包让IDE认识这颗具体的芯片。3.1 选择什么IDE和编译器组合目前GD32H759的主流开发方式有三种组合方案适用场景体验评价MDK Keil AC6编译器中小项目、习惯Keil的人上手快调试方便IAR EWARM对代码体积要求高的项目编译器优化做得好RT-Thread Studio GCC深度使用RT-Thread生态工程配置自动化程度高我最终选择的是MDK Keil加AC6编译器。原因是这个系列文章要一步步带大家做实验MDK在单步调试、寄存器查看、外设观察窗口方面对新手最友好而且AC6编译器对Cortex-M7的指令集支持比较完善能自动使用DSP指令和浮点加速指令。MDK版本建议用5.36以上老版本对新器件支持不好。安装路径尽量不要带中文和空格虽然新版MDK对中文路径的兼容性好了很多但编译器底层工具链偶尔还会出幺蛾子。3.2 安装GD32H759器件支持包打开MDK后需要安装GD32H759的器件支持包。有两条路可以走第一条是通过Keil官方的Pack Installer直接搜索GigaDevice但这种方式的缺点是官方Pack仓库里的版本可能滞后新出的型号不一定能及时收录。第二条是去兆易创新官网下载对应的Pack安装包直接双击安装。官网根据芯片系列分类很清楚找到GD32H7系列下载即可。安装完成后在MDK的Device选择界面就能看到GD32H759的型号。我建议用第二条路线因为官网的Pack版本通常比仓库里的新而且会附带设备头文件和启动文件方便后面建工程。3.3 新建工程的完整流程在MDK中新建工程的步骤看起来简单但有几个关键点容易出错。我先说核心流程再讲特别注意的事项。第一步Project菜单下选择New Uvision Project保存工程文件。保存路径单独建立一个文件夹最好命名为工程名加日期方便后续版本管理。第二步弹窗选择芯片型号搜索GD32H759选中对应型号点击OK。此时会弹出Manage Run-Time Environment窗口这个窗口可以不用勾选任何东西因为RT-Thread的启动文件已经有完整的向量表和系统初始化代码。第三步工程建好后手动添加启动文件startup_gd32h759.s、系统初始化文件system_gd32h759.c和其他基础源文件。这些文件在官方固件库的Firmware文件夹里都能找到。第四步在Options for Target的C/C选项卡里需要设置Define宏。这里有一个常见的坑很多人漏掉这个宏定义导致编译报错。根据你使用的是哪个系列需要定义GD32H759这个宏同时根据是否使用RT-Thread可能还要添加RT_USING_LIBC这样的宏。第五步Debug选项卡选择调试器类型并做基础配置。建工程的过程不需要照着抄后面用RT-Thread Studio自动生成工程后MDK工程可以由工具自动生成不需要纯手动搭建。我这个手把手建MDK工程的流程是为了让大家理解工程结构后面遇到手动移植时不至于无从下手。3.4 固件库和头文件的版本匹配GD32官方固件库分Firmware和Library两层Firmware里是源码Library里是封装好的驱动库API。初次接触的人容易懵的是官方库里的例程结构Performance和Peripheral两个文件夹各管一半。我要特别提醒一个问题GD32H759的固件库版本更新比较快不同版本之间的API可能有细微差别。比如早期版本的ADC初始化函数参数个数到了新版本可能会增加通道配置参数。所以下载固件库的时候留意版本号尽量使用当前最新版本同时注意和RT-Thread的BSP版本兼容。我写这篇文章用的固件库版本是1.0.3RT-Thread用的5.x版本两者配合没有冲突。4. RT-Thread环境准备与工程生成裸机点灯是单片机的Hello World但在工控实战里我们最终要跑RTOS所以直接从RT-Thread的工程结构开始搭建更高效。RT-Thread本身提供了非常完善的BSP框架针对不同芯片有对应的board工程直接使用比手动移植要可靠得多。4.1 RT-Thread源码获取与工具链准备RT-Thread源码可以直接从官方GitHub仓库拉取也可以用RT-Thread Studio内置的源码管理功能。个人建议直接用RT-Thread Studio它的便利性远超你的想象。RT-Thread Studio是RT-Thread官方推出的IDE底层基于Eclipse但做了大量定制优化。它最大的好处是把芯片支持包、源码、编译器、调试工具、工程模板全部整合在一起不用自己手动去配环境变量、装交叉编译器。对于一个还在起步阶段的嵌入式工程师来说这能省下大量时间。在RT-Thread Studio中新建工程时选择目标芯片为GigaDevice下的GD32H759系列工具链选择GCC调试器选择你手头的型号。Studio会自动下载对应版本的RT-Thread源码和GD32的BSP支持包生成一个可直接编译运行的工程。4.2 工程结构解读生成出来的RT-Thread工程有一个标准目录结构搞清楚每个目录的作用对后面开发至关重要applications文件夹存放应用层代码我们的点灯逻辑就放在这里board文件夹板级支持代码包括时钟初始化、GPIO初始化、内存堆初始化drivers文件夹外设驱动框架RT-Thread的设备驱动模型rt-thread文件夹RT-Thread内核源码和组件源码Linker文件夹链接脚本定义了Flash和RAM的分配很多初学者一看到这么多目录就头大我一开始也是。但实际用下来90%的时间只需要改applications和board真正的业务代码都在这两个目录下面。内核源码基本不需要改动除非做深度定制。4.3 调试下载配置在RT-Thread Studio里配置调试器需要做两件事。第一件是选择调试器类型。以J-Link为例在Run/Debug Configurations里选择GDB SEGGER J-Link Debugging然后设置设备型号。很多人在这里会卡一下因为GD32H759的设备代号在J-Link里不一定显示为GD32H759可能显示为Cortex-M7。选择Cortex-M7即可J-Link通过SWD协议识别内核类型可以正常连接。第二件是配置下载算法。MDK环境里加载算法是自动完成的但RT-Thread Studio的GCC工具链环境下需要指定Flash下载算法文件。Studio 5.x版本对GD32H7系列的支持比较完善它提供的下载算法文件在Debugger的Flash Download选项卡里选择GD32H7系列的算法一般能自动匹配。如果下载报错检查算法文件是否匹配或者把下载速度从5MHz降到1MHz试试这个能解决很多疑难问题。4.4 时钟树配置的特别注意事项GD32H759的主频要跑到480MHz从25MHz外部晶振倍频上去PLL的配置参数需要精确计算。RT-Thread的board文件夹下有system_gd32h759.c文件里面实现了SystemClock_Config函数。默认配置应该是480MHz但你需要检查几个参数是否正确。PLL的倍频系数是分频加倍的25MHz晶振经过PREDIV分频后作为PLL输入再乘以倍频系数N达到目标频率。具体参数PREDIV选择5分频PLL输入变成5MHz然后倍频系数96得到480MHz。如果PREDIV是6分频或者其他值得到的频率就不是480MHz。这个参数算错会导致系统时钟不对比较隐蔽的症状是串口输出乱码、定时器周期不对、PWM频率偏差很大。排查方法是在SystemClock_Config函数初始化完成后读取实际PLL锁定标志在调试器中观察寄存器的值确认频率是否达到预期。5. 点灯实验GPIO驱动与RT-Thread线程点灯是整个嵌入式开发里最简单的功能但简单功能在不同框架下实现的路径完全不同。在裸机上就是几行寄存器操作在RT-Thread里则涉及到驱动模型、设备注册、线程创建等一系列概念。把点灯搞透彻了RT-Thread的开发模式也就理解了一半。5.1 GPIO硬件连接确认动手之前先看一眼板子的原理图。我用的GD32H759开发板上LED灯的连接方式不一样有的是低电平点亮有的是高电平点亮。我手上这块板子的几个LED分别接到了PA0、PA1、PB2等引脚且都是低电平点亮也就是GPIO输出低的时候LED亮。这个细节非常重要。如果你的板子LED连接方式和我的不一样点灯代码的逻辑就要反过来。有的教程里代码写得想当然没有说清楚这部分很多人在自己的板子上跑不出来就是这个原因。看原理图时重点确认两件事LED接在哪个引脚上以及高电平有效还是低电平有效。5.2 驱动框架的选择思路RT-Thread的GPIO驱动有两种使用方式。一种是直接操作寄存器或者调用标准外设库的GPIO函数这种方式最简单直接在点灯实验中代码量最少也最容易理解。另一种是使用RT-Thread的PIN设备框架通过rt_pin_mode和rt_pin_write这样的统一接口操作GPIO好处是应用层代码与具体芯片解耦换平台时不需要改应用层逻辑。两种方式没有绝对的好坏。如果只是快速验证一个功能直接操作寄存器更快如果项目要在多个硬件平台间移植PIN设备框架的抽象价值就体现出来了。我个人建议初学者把两种方式都跑通一遍。先直接操作寄存器点亮LED理解GD32H759的GPIO寄存器配置和时钟使能细节再切换到PIN设备框架感受一下RT-Thread的设备模型给开发体验带来的变化。5.3 直接操作寄存器的点灯代码分析GD32H759的GPIO操作首先要使能对应GPIO端口的时钟。该芯片的GPIO时钟挂在AHB总线上需要操作RCUReset and Clock Unit寄存器。对应的库函数是rcu_periph_clock_enable(RCU_GPIOA)确保GPIOA外设的时钟被打开。然后配置引脚模式。GD32的GPIO引脚模式配置比STM32要复杂一点需要设置输出模式、推挽类型、上拉下拉、输出速度等多组参数。函数gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0)设置引脚为输出模式且无上下拉gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0)设置推挽输出、速度50MHz。配置完成后写电平用gpio_bit_write(GPIOA, GPIO_PIN_0, SET)或者gpio_bit_reset。#include gd32h7xx.h void led_gpio_init(void) { rcu_periph_clock_enable(RCU_GPIOA); gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); gpio_bit_reset(GPIOA, GPIO_PIN_0); }如果LED是低电平点亮gpio_bit_reset把引脚拉低LED就亮了。这个代码看起来简单但背后有两个关键点值钱第一个是为什么要把速度设置为50MHzGPIO的输出速度并不是越快越好在不需要高速翻转的应用场景下设置过高的输出速度反而会引起信号振铃和EMI问题。点LED这种低频应用25MHz甚至更低的速度就够了。第二个是为什么初始化的时候先要把LED熄灭避免系统上电瞬间引脚处于不确定状态导致LED误亮一下这在工业设备上是产品级的细节要求。5.4 使用RT-Thread PIN设备框架的代码分析再来看PIN设备框架的写法。RT-Thread里使用PIN驱动需要包含头文件rtdevice.h。代码逻辑是调用rt_pin_mode设置引脚模式再调用rt_pin_write写电平。#include rtthread.h #include rtdevice.h #define LED_PIN GET_PIN(A, 0) void led_init(void) { rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); rt_pin_write(LED_PIN, PIN_LOW); }GET_PIN(A, 0)这个宏是RT-Thread对引脚号的标准化定义底层根据BSP的GPIO配置转换成芯片对应的引脚编号。这里有一个很重要的点RT-Thread的PIN设备编号与具体的芯片引脚编号不是一回事需要经过BSP的转换函数。如果你去阅读这个转换函数源码你会发现它实际上是把端口号 引脚号做了一个二维映射最终返回一个在驱动层注册的device number。在点灯实验中PIN框架比直接操作寄存器多了一层代码但这层抽象的意义在于当你从GD32H759迁移到STM32H7时应用层只需要改GET_PIN的宏定义其他代码完全不用动。5.5 创建RT-Thread线程实现LED闪烁点灯实验最核心的部分是用RT-Thread线程来实现LED闪烁这是理解RTOS任务调度的第一步。裸机实现LED闪烁需要写一个延时函数然后在一个while死循环里翻转电平。但在RT-Thread里做法完全不同。创建一个线程在线程函数里循环翻转LED并调用rt_thread_mdelay进行线程睡眠把CPU让给其他任务。#include rtthread.h #include rtdevice.h #define LED_PIN GET_PIN(A, 0) #define THREAD_PRIO 25 #define THREAD_STACK_SIZE 512 #define THREAD_TIMESLICE 5 static rt_thread_t led_thread RT_NULL; static void led_thread_entry(void *parameter) { rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); while (1) { rt_pin_write(LED_PIN, PIN_LOW); rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_HIGH); rt_thread_mdelay(500); } } int led_thread_init(void) { led_thread rt_thread_create(led, led_thread_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIO, THREAD_TIMESLICE); if (led_thread ! RT_NULL) { rt_thread_startup(led_thread); return 0; } return -1; } INIT_APP_EXPORT(led_thread_init);这段代码里有两个值得深度理解的地方。第一个是优先级选择。RT-Thread默认支持256个优先级0是最高优先级255是最低优先级。一般应用层线程优先级在20到30之间比较合适不要低于10因为RT-Thread内部很多关键服务比如定时器线程在较高优先级运行你把自己创建的线程优先级设得太高可能会抢了系统的资源。第二个是栈大小。点灯线程代码简单512字节栈完全够用。但在实际工控项目中线程栈大小需要根据函数调用深度和局部变量使用量来估算栈给小了会导致系统崩溃或者运行到一半突然死机而且这种问题非常难排查。RT-Thread提供了线程栈溢出检测功能可以在FinSH控制台里查看每个线程的栈使用情况开发调试阶段务必打开这个功能。5.6 通过FinSH控制台验证RT-Thread最吸引人的功能之一是FinSH控制台可以理解成嵌入式系统的命令行。你可以在终端里输入命令查看系统信息、调用函数、调试设备。点灯实验跑起来后打开串口终端波特率通常设置为115200进入FinSH控制台输入list_thread命令就能看到当前系统里所有线程的状态。led线程应该显示为ready状态或running状态每隔500ms执行一次。再输入list_device可以看到pin设备已经注册成功。这一步的作用是帮你确认系统真的在正常调度而不是碰巧跑了代码。如果线程列表里看不到led线程说明线程创建失败大概率是内存不足或者优先级设置冲突。6. 编译下载调试中的常见坑与排查思路环境搭好、代码写好后编译下载这最后一公里其实最容易出问题。很多人代码逻辑完全正确但就是编译不过、下载失败或者运行异常卡在这里非常磨人。我把T开发板和GD32H759调试过程中实际踩过的坑列出来希望对大家有所帮助。6.1 编译错误与AC6编译器差异使用MDK的AC6编译器时有一个非常容易踩的坑旧的C语言标准语法兼容。AC6默认使用C11标准对C90的隐式函数声明和缺失头文件检查得非常严格以前在AC5下能编译通过的代码放到AC6上可能报一堆错误。解决方案有两种。第一种是把代码写得规范一些所有函数都添加原型声明包含必要的头文件。第二种是在编译选项里添加-mno-unaligned-access之类的兼容参数或者把C语言标准改成GNU99。个人建议第一种代码规范是长期受益的事。另外GD32官方固件库在AC6编译器下编译的时候有时会报VFP设置相关的警告这是因为M7内核默认有硬件浮点单元需要在编译选项中启用FPU的选项否则系统进入HardFault或者浮点运算混乱。在MDK的Options for Target里Target选项卡的Floating Point Hardware选择Single Precision即可。6.2 下载失败的两类典型场景下载失败是出镜率最高的问题基本可以分成两类。第一类是Flash Download failed报错。这通常是下载算法不对或者芯片连接不稳定。在J-Link设置里把Flash下载算法改成GD32H7系列对应的算法文件然后把连接速度降到1MHz大概率能解决。第二类是Connection refused或Unable to connect。接线没接好、SWDIO和SWCLK接反了、芯片被锁死这三类原因占比最高。如果是芯片被锁死最常用的解锁方法是按住复位键不放点击下载在下载启动瞬间松开复位键就能掐死复位窗口把程序烧录进去。这个方法百试百灵。6.3 系统启动后LED不亮的排查链路如果编译下载都成功但LED就是不亮不要慌按照下面的顺序排查第一步确认系统是否运行。在调试器里挂起程序查看PC寄存器当前停在什么位置。如果PC指针停在HardFault_Handler或者某个死循环里说明系统启动就出了问题。第二步确认时钟是否正确。在调试器里查看RCU寄存器的值确认PLL锁定标志位是否置位系统时钟频率是否等于480MHz。如果时钟起不来或者频率不对外设时钟全部受影响。第三步确认GPIO时钟是否使能。在调试器里可以直接查看RCU寄存器中GPIOA时钟使能位是否为1。第四步确认引脚复用功能设置。如果这个引脚默认是复用功能可能在芯片上电时被默认分配给了外设而不是GPIO需要在GPIO初始化前先切换到GPIO功能。按照这个链路排查90%以上的LED不亮问题都能定位到具体原因。剩下10%可能是板子硬件问题比如LED烧坏了或者虚焊用万用表量一下就能确认。6.4 RT-Thread系统崩溃的定位方法运行RT-Thread时程序突然崩溃大多数情况是栈溢出、内存访问越界或者断言失败。终端的打印信息里会提示具体是哪个断言失败然后按照提示定位代码。内存不足问题在格式化打印时也容易出现特别是调用了rt_kprintf输出大量调试信息时。RT-Thread默认使用内部堆管理如果堆内存不足线程创建会返回空指针此时需要检查堆大小配置。还有一个很隐蔽的问题是中断服务函数里调用了会导致阻塞的API比如rt_thread_mdelay。RT-Thread几乎不允许在中断上下文执行阻塞操作这可能导致系统死锁。在中断里要做的事情仅仅是置标志位把耗时操作放到线程里去完成这是RT-Thread开发的基本原则。7. 点灯实验完成后的下一步思考点灯跑通的那一刻你已经完成了从裸机思维到RTOS思维的第一次转变。接下来这个开发环境完全可以支撑更复杂的工控项目后续我会在这个基础上持续输出一系列实战内容。硬件层面下一步值得尝试的是让那颗M4协处理器动起来跑一个独立的小任务和M7做邮箱通信。这种异构多核的开发模式和单核差别很大但GD32H759的硬件邮箱机制做得还算直观。外设层面工控场景绕不开ADC采样、定时器PWM输出、编码器接口和CAN通信这几个外设配合RT-Thread的驱动框架做一套完整的电机控制方案是非常理想的进阶路径。串口或者以太网接一个Modbus协议栈做一个完整的工控从站设备也是很多行业客户的实际需求。软件层面RT-Thread的软件包生态里有不少和工控相关的组件值得深挖。比如AT命令框架、Modbus组件、传感器驱动包、图形界面组件这些组件能让你在业务开发时专注于应用逻辑而不是底层驱动。最后分享一个小建议不管你是用MDK还是RT-Thread Studio在动手写业务代码之前花点时间把调试器的每项功能摸透。硬件开发中很大一部分时间都花在找问题上调试工具用得顺手定位问题的速度快上一倍不止。尤其是RT-Thread的线程调试功能在Cortex-M7的双核环境下你需要在调试器里手动切换查看两个内核的状态这个技巧后面实操时还会用到。这一篇先到这里环境已经就绪灯已经点亮后面一步步往前走。
返回列表