资讯详情

AB32VG1开发环境搭建:RT-Thread与RISC-V工具链实践

📅 2026/10/24 3:08:11 | 华诺云谱 👁 阅读
AB32VG1开发环境搭建:RT-Thread与RISC-V工具链实践
简介面向TWS蓝牙耳机及嵌入式开发者的中科蓝讯AB32VG1实践指南围绕RISC-V评估板原生搭载的RT-Thread物联网操作系统展开。文档从开发环境搭建讲起系统覆盖UART、GPIO、I2C、SPI、Timer、ADC、PWM、WDT、RTC、SDIO、Flash、SD、IRDA、Audio、麦克风及Wi-Fi模块等十余种片上外设的配置与编程方法并结合智慧门禁、遥控台灯、智能灯控、WAV音频播放等真实项目演示完整开发流程帮助开发者快速上手TWS蓝牙耳机及周边应用开发。资源为单个docx文档共1个文件压缩包大小32.21MB内容编排细致、章节清晰适合具备基础嵌入式知识、希望借助RT-Thread Studio高效搭建项目的工程师参考。已有5121人学习下载得到社区开发者认可。1. 搭建 AB32VG1 开发环境不是所有 RISC-V 板子都能开箱即用想拿中科蓝讯 AB32VG1 做 TWS 蓝牙耳机相关的原型验证或者只是把这颗 RISC-V 内核的 32 位 MCU 上的 UART、GPIO、I2C 外设逐个点亮最怕的不是芯片本身而是环境搭到一半卡住。串口驱动不匹配、riscv 工具链没装、编译出来的 .dcf 固件找不到这三座大山几乎每个新手都会遇到一次。这篇笔记按照我自己实际装环境的顺序来写先列硬件和文档版本再装 RT-Thread Studio、BSP 与 RISC-V 工具链接着配 Downloader 固件下载最后用 UART 和 GPIO 两个例程把板子跑通。适合刚拿到 AB32VG1-AB-PROUGEN 评估板、准备做蓝牙耳机或 TWS 相关开发的开发者。2. 环境准备RT-Thread Studio、SDK 管理器与 RISC-V 工具链2.1 硬件底子先搞清楚手里是哪种板型AB32VG1 是中科蓝讯面向通用市场发布的 RISC-V 32 位 MCU主频 120MHz片上集成 RAM 192KFlash 官方发布口径为 8Mbit早期评估板文档里也出现过 4Mbit 的标注收货后建议以官方仓库里对应批次硬件手册为准。这条我先写出来是因为有人照着文档核对容量发现对不上白紧张一场。芯片外设带 ADC、PWM、USB、UART、IIC评估板又把蓝牙模块、FM 模块、TF Card、音频接口美标 CTIA、IRDA 红外接收、六路 ADC 引脚、六路 PWM 引脚、RGB 全彩 LED 都引了出来I/O 口用 2.54mm 标准间距引出并兼容 Arduino Uno 扩展接口。资源项说明CPUAB32VG1LQFP48 封装RISC-V 内核主频 120M片内存储RAM 192KFlash 8Mbit个别文档标 4Mbit以批次手册为准板载模块蓝牙、FM、TF Card 接口、USB 接口、IIC 接口、音频接口CTIA、IRDA、RGB 全彩 LED引脚引出六路 ADC、六路 PWM2.54mm 标准间距兼容 Arduino Uno按键与指示Reset 按键 三个功能按键通用版两个电源灯 三个烧录指示灯板型名AB32VG1-AB-PROUGEN尺寸 6cm * 9cm注意板型名 AB32VG1-AB-PROUGEN 这一串字符后面在 RT-Thread Studio 新建工程时要一字不差地选它选错 BSP 引脚映射全乱。TWS 蓝牙耳机开发里这颗芯片的定位可以是主控也可以是协议协处理器跑 RT-Thread 的好处是外设驱动不用从头写打开设备就能用hard fault 的概率比裸机小很多。2.2 安装 RT-Thread Studio 与 SDK 管理器开发环境不需要手工搭命令行交叉编译链官方把整套 SDK 集成在 RT-Thread Studio 的 SDK 管理器里。先装 RT-Thread Studio安装路径别带中文和空格Windows 下放到 D:\RT-ThreadStudio 这类纯英文路径更省心。装完打开工具栏找到 SDK 管理器点开后能看到板级支持包和工具链两个大类。SDK Manager ├─ Board_Support_Packages │ └─ Bluetrum_AB32VG1-ab-prougen # 勾选安装板级支持包 └─ Tool_Chain └─ riscv-none-embed-gcc # 勾选安装 RISC-V 工具链SDK 管理器里有两件事必须干一是装板级支持包BSP二是装 RISC-V 工具链。很多人只装了 BSP 就跑去点编译结果报错找不到编译器绕了一大圈才回来补工具链。BSP 包名是 Bluetrum_AB32VG1-ab-prougen对应 AB32VG1-AB-PROUGEN 开发板工具链是 riscv-none-embed-gcc这是 RT-Thread 仓库配套的版本。这里特别提醒不要自己去系统里另装一套 riscv gcc版本不一致会导致 SDK 管理器生成的链接脚本和你手动指定的路径对不上出一些莫名其妙的段错误和链接失败。2.3 锁定 BSP 1.0.8 并验证编译链装完先别急着写业务代码让编译链空转一圈。在 RT-Thread Studio 里新建工程选“基于开发板”板型选 AB32VG1-AB-PROUGENBSP 版本选 1.0.8。这个 1.0.8 是实践指南编写时锁定的版本串口驱动在这一版做过升级UART 设备的使用方式比旧版顺手很多。工程名建议英文小写加下划线例如 ab32_demo不要用中文工程名Windows 下的构建脚本对中文路径支持时好时坏。建完工程直接点编译第一次编译要等一阵子工具链首次加载和 SDK 自动生成都在这个阶段完成。编译通过后工程 Debug 目录下会多出一个 .dcf 文件这就是后面 Downloader 要用的固件。这里多解释一句为什么锁定 BSP 1.0.8实践指南的更新日志里1.0.1 版本专门更新了 UART、RTC 文档并新增 WIFI 模块配置文档这些内容对应的 BSP 就是 1.0.8。如果你选了别的 BSP 版本drv_usart.c 的默认波特率行为和串口设备名可能都不一样例程未必能直接粘着用。3. 固件下载环境Downloader 与 USB 转串口驱动的配对3.1 固件产物 .dcf 与 Downloader 的角色AB32VG1 的编译产物不是 hex 也不是 bin而是 .dcf这个文件每次编译后刷新在工程 Debug 目录下。烧录工具是中科蓝讯的 Downloader它通过 USB 转串口把 .dcf 写进芯片 Flash。注意 Downloader 不是 RT-Thread Studio 内置插件需要单独安装装完还得有对应的 USB 转串口驱动否则打开就是黑匣子串口列表一片空白。固件下载链路是“RT-Thread Studio 编译 - Debug/*.dcf - Downloader 选择串口和固件 - 烧录”。编译和烧录是两回事新手最容易把 Downloader 当成编译按钮到处找实际上它在 IDE 外面是独立进程。下载接口用的是板载 USB 转串口调试串口也是这一路所以烧录完先别拔线后面看 log 还要靠它。烧录链路说明编译产物.dcf位于工程 Debug 目录每次编译后刷新下载工具Downloader.exe中科蓝讯提供独立安装下载接口USB 转串口V1 板 CP2102 / V2 板 CH340驱动策略V1 板需手动切换配套驱动V2 板系统自动装 CH340 驱动3.2 V1 与 V2 板型CP2102 与 CH340 的驱动差异开发板有两个常见版本。V2 版用的串口芯片是 CH340Windows 10/11 一般自动装好驱动插上就能在设备管理器里看到 COM 口基本不用管。V1 版用的串口芯片是 CP2102系统可能自动装了新版驱动但 Downloader 不一定认现象是打开软件报驱动不匹配或者串口下拉框里看不到任何设备。V1 板的解决方式是到设备管理器里把 CP2102 的驱动手动切换成配套版本。实操步骤右键这个 COM 口选更新驱动程序选浏览我的电脑查找驱动再选从磁盘安装指向配套驱动目录安装完成后重新插拔 USB。这一步做完Downloader 里才能正常枚举出串口。如果手里是 V2 板CH340 直接使用系统驱动不用折腾这也是我后来更愿意用 V2 板做调试的原因少一个变量。3.3 配置编译后自动下载手动下载的流程是每次编译后打开 Downloader自己选 .dcf 路径再点下载。次数多了很烦我一般直接在 Downloader 的下载下拉窗里选“自动”。选完后只要在 RT-Thread Studio 里点击下载按钮IDE 会调起 Downloader 完成烧录不用每次手动挑文件编译和烧录的衔接会顺很多。自动下载前置条件有两个一是串口驱动匹配V1 板没切驱动前千万别开自动会卡在打开串口那一步反复报错二是 .dcf 路径要稳定工程 Debug 目录不要手动改输出路径否则 Downloader 找不到固件会一直停在等待文件的假死状态。下载完成后板子会自动复位运行这时打开串口终端应该能看到 RT-Thread 的启动日志和 msh 命令行提示符看到 msh 才算真正和环境握手成功。4. 新建工程与外设配置从 BSP 1.0.8 到 UART/GPIO 跑通4.1 新建 RT-Thread 工程的选项匹配打开 RT-Thread Studio文件 - 新建 - RT-Thread 项目。项目类型选“基于开发板”开发板列表里找 AB32VG1-AB-PROUGENBSP 版本选 1.0.8工程名填英文小写。点完成后 IDE 会拉取板级支持包并生成基础工程这个过程取决于网络和 SDK 缓存稍等片刻。ab32_demo ├─ applications │ ├─ main.c # 应用入口 │ └─ task.c # 本章新增外设测试文件 ├─ libraries │ └─ hal_drivers │ └─ drv_usart.c # UART 驱动波特率默认值在这里 └─ Debug └─ ab32_demo.dcf # 编译产物applications 目录放用户代码我们自己新建的 task.c 就放在这里libraries/hal_drivers 是 BSP 自带的驱动层改驱动要认准这个目录别改错文件Debug 是编译输出目录固件下载直接指到这里即可。工程结构搞清楚后面找 .dcf、改波特率、加测试命令都不会迷路。4.2 UART1 例程设备查找、信号量与逐字节回显串口 0 被系统调试占用用户通讯用串口 1引脚是 PA3 和 PA4。在 applications 下新建 task.c把 UART 例程代码写进去。这个例程先在串口输出hello RT-Thread!然后进入回环模式每收到一个字符就把 ASCII 值加一返回。#include rtthread.h #define SAMPLE_UART_NAME uart1 static struct rt_semaphore rx_sem; static rt_device_t serial; /* 串口接收回调收到数据就释放信号量 */ static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { rt_sem_release(rx_sem); return RT_EOK; } static void serial_thread_entry(void *parameter) { char ch; while (1) { /* 读取一个字节读不到就等信号量 */ while (rt_device_read(serial, -1, ch, 1) ! 1) { rt_sem_take(rx_sem, RT_WAITING_FOREVER); } /* 错位输出收到的字符 ASCII 加 1 后写回 */ ch ch 1; rt_device_write(serial, 0, ch, 1); } } static int uart_sample(int argc, char *argv[]) { rt_err_t ret RT_EOK; char uart_name[RT_NAME_MAX]; char str[] hello RT-Thread!\r\n; /* 支持命令行传参指定串口默认 uart1 */ if (argc 2) { rt_strncpy(uart_name, argv[1], RT_NAME_MAX); } else { rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX); } /* 查找系统中的串口设备 */ serial rt_device_find(uart_name); if (!serial) { rt_kprintf(find %s failed!\n, uart_name); return RT_ERROR; } /* 初始化信号量 */ rt_sem_init(rx_sem, rx_sem, 0, RT_IPC_FLAG_FIFO); /* 以中断接收模式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); /* 设置接收回调函数 */ rt_device_set_rx_indicate(serial, uart_input); /* 发送开场字符串 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); /* 创建串口接收线程 */ rt_thread_t thread rt_thread_create(serial, serial_thread_entry, RT_NULL, 1024, 25, 10); if (thread ! RT_NULL) { rt_thread_startup(thread); } else { ret RT_ERROR; } return ret; } /* 导出到 msh 命令列表 */ MSH_CMD_EXPORT(uart_sample, uart device sample);逻辑上这段代码走的是标准设备模型rt_device_find按名字找设备找到的serial句柄后面所有读写都走它rt_sem_init初始化信号量初值 0 表示一开始没有数据可读rt_device_open第二个参数必须带RT_DEVICE_FLAG_INT_RX这样接收走中断回调而不是轮询否则uart_input永远不会被触发接收线程里rt_sem_take会阻塞等待直到回调函数释放信号量才继续往下读。参数说明RT_WAITING_FOREVER是永久等待串口没数据时线程挂起不占 CPU线程栈 1024 字节、优先级 25、时间片 10 是 RT-Thread 例程的通用参数跑这个 demo 足够。如果发现接收回调不触发先查rt_device_open的标志位是不是漏了RT_DEVICE_FLAG_INT_RX这是最常见的翻车点。4.3 波特率 1500000drv_usart.c 里的默认值陷阱UART 初始化默认波特率是 1500000不是常规的 115200。这个值配合 Downloader 下载没问题但你要用 UART1 外接蓝牙透传模块、调试音频板或其他 TWS 模组时对方设备多半跑 115200 或 9600波特率对不上就是满屏乱码。做蓝牙耳机相关调试时串口外接模块最常见的写法和设备参数就是 115200所以建议直接把 UART1 改掉。int rt_hw_usart_init(void) { rt_size_t obj_num sizeof(uart_obj) / sizeof(struct ab32_uart); struct serial_configure config RT_SERIAL_CONFIG_DEFAULT; rt_err_t result 0; rt_hw_interrupt_install(IRQ_UART0_2_VECTOR, uart_isr, RT_NULL, ut_isr); for (int i 0; i obj_num; i) { uart_obj[i].serial.config config; uart_obj[i].serial.config.baud_rate 1500000; /* 串口 1 单独覆盖为 115200匹配外部设备 */ if (i 1) { uart_obj[i].serial.config.baud_rate 115200; } /* 其余初始化代码保持不变 */ } return result; }这段代码在libraries/hal_drivers/drv_usart.c里RT_SERIAL_CONFIG_DEFAULT宏展开后波特率就是 1500000先把统一值赋给所有串口再对i 1也就是 UART1 单独覆盖成 115200。改完保存重新编译Debug 下的 .dcf 会刷新。这里有个取舍UART0 的 1500000 建议保留它是调试串口Downloader 下载和 finSH 终端都依赖这路改成 115200 后反而可能出现下载超时或终端波特率不匹配的连锁问题。4.4 GPIO 控制 RGB 彩灯GPIO 实践章节以板载 RGB 全彩 LED 为对象三色灯可以拆成红绿蓝三路控制。RT-Thread 的 pin 框架把引脚操作统一成rt_pin_mode和rt_pin_write不用直接摸寄存器比原生 GPIO 寄存器操作安全很多。具体引脚号必须按开发板原理图确认下面代码中的引脚宏是占位示例抄的时候要替换成自己板子的实际引脚。#include rtthread.h #include rtdevice.h /* 示例引脚宏红色/绿色/蓝色通道实际引脚号以原理图和 board.h 为准 */ #define PIN_LED_R GET_PIN(B, 2) #define PIN_LED_G GET_PIN(B, 3) #define PIN_LED_B GET_PIN(B, 4) static void led_sample(void) { rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT); rt_pin_mode(PIN_LED_G, PIN_MODE_OUTPUT); rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT); for (int i 0; i 5; i) { /* 低电平点亮红色通道 */ rt_pin_write(PIN_LED_R, PIN_LOW); rt_thread_mdelay(300); rt_pin_write(PIN_LED_R, PIN_HIGH); /* 低电平点亮绿色通道 */ rt_pin_write(PIN_LED_G, PIN_LOW); rt_thread_mdelay(300); rt_pin_write(PIN_LED_G, PIN_HIGH); /* 低电平点亮蓝色通道 */ rt_pin_write(PIN_LED_B, PIN_LOW); rt_thread_mdelay(300); rt_pin_write(PIN_LED_B, PIN_HIGH); } } MSH_CMD_EXPORT(led_sample, rgb led sample);GET_PIN的第一个参数是端口号第二个参数是端口内引脚号具体取值要去 BSP 的 board.h 和原理图里查直接抄通用示例的 B2/B3/B4 大概率灯不亮。这段代码循环五次红绿蓝切换每次间隔 300ms足够肉眼确认引脚映射对不对。如果灯不亮但程序在跑先查极性PIN_LOW点亮还是PIN_HIGH点亮取决于 LED 公共端接法把电平反过来再试一次是最快的排查方式。5. 避坑与常见问题驱动报错、波特率异常与编译失败5.1 Downloader 报 USB 转串口驱动不匹配现象打开 Downloader 后串口列表为空或者选择串口后提示驱动不匹配无法连接。原因V1 板的 CP2102 被系统自动装成了新版驱动Downloader 只识别配套驱动版本两边握手失败。解决设备管理器里手动把 COM 口驱动切换为配套版本路径指向 Downloader 安装目录下的 driver 文件夹切换后重新插拔 USB。V2 板的 CH340 直接用系统驱动不需要处理。我一般会在板子背面贴一张标签标注版本避免 V1/V2 驱动策略混用后浪费时间。5.2 串口乱码默认波特率 1500000 在捣乱现象用 115200 打开调试串口看到乱码或者 UART1 外接设备收发全是错字符。原因drv_usart.c 里全局默认波特率是 1500000UART1 没改也是 1500000你的终端助手设 115200两边对不上。解决一种是把调试助手波特率改成 1500000立竿见影另一种是改 drv_usart.c把i 1的波特率覆盖为 115200。做蓝牙耳机相关调试时外接模块大多是 115200我习惯直接把 UART1 改掉一劳永逸。注意 UART0 别动下载和 finSH 都靠它。5.3 编译报错找不到 riscv 工具链现象编译输出riscv-none-embed-gcc not found或者提示无法启动编译程序。原因SDK 管理器里只装了 BSP没装 RISC-V 工具链或者工具链安装过程被中断。解决回到 SDK 管理器Tool_Chain 分组下勾选 riscv-none-embed-gcc装完重启 RT-Thread Studio。检查 IDE 安装目录下的 toolchain 路径是否存在不要手动设置环境变量去覆盖 IDE 内置链版本不一致会出现诡异的链接错误。5.4 Debug 目录下找不到 .dcf 文件现象编译提示成功但 Debug 目录是空的或只有 .elf 没有 .dcf。原因编译并没有真正完成或者工程输出路径被手动改过或者当前编译的是 release 配置而下载工具默认找 Debug。解决先看控制台有没有红色报错排除语法问题确认当前编译的是 Debug 配置不要手工修改输出目录。如果 .elf 存在而 .dcf 缺失多半是链接后处理脚本没执行清理工程后重新编译一遍比到处翻设置省时间。5.5 烧录成功但 finSH 终端无输出现象Downloader 提示烧录成功板子也复位了但串口终端一片空白什么都看不到。原因终端连错了 COM 口或者波特率不是 1500000或者 V1 板驱动切换后 COM 口号变了但终端里还是旧号。解决重新打开设备管理器确认当前 COM 口号把终端波特率设为 1500000重新打开串口再复位板子。如果还是空白先检查 USB 线是否只是充电线没有数据引脚这种线在嵌入式调试里出现的频率比你想象的高会让人误以为板子烧了。6. 验证跑通从 uart_sample 到 GPIO 点灯6.1 三步验证法烧录、看提示符、跑命令编译下载完之后先别急着接外设。第一步确认 Downloader 提示烧录成功板子自动复位第二步串口终端连 UART0波特率用 1500000 或你改过的值看到 msh 提示符说明系统正常第三步在 msh 终端输入 help能看到 uart_sample 和 led_sample 出现在命令列表里说明例程已经成功导出到命令表。6.2 UART 回环与 RGB 灯两分钟确认外设健康接着验证 UART1在 msh 输入uart_sample uart1终端会先打印hello RT-Thread!。然后用另一路 USB 转串口接到 UART1 的 PA3/PA4打开串口助手发送字母 A板子应返回 B发 0 返回 1这就是例程里“错位输出”的行为。收到正确回显说明串口驱动、中断接收、信号量线程整条链路都是通的。GPIO 验证更直观在 msh 输入led_sampleRGB 灯红绿蓝循环闪烁五次。如果灯不亮优先检查 GET_PIN 引脚号是否与原理图一致以及高低电平极性是否反了。这两条验证做完编译链、下载链、外设驱动就都有了可信结论。验证项操作预期结果系统烧录Downloader 烧录并复位提示烧录成功板子自动运行系统启动串口终端连 UART0出现 RT-Thread 启动日志与 msh 提示符命令导出msh 输入 help看到 uart_sample、led_sample 命令UART1 回显msh 输入 uart_sample uart1输出 hello RT-Thread!串口助手发 A 收 BGPIO 彩灯msh 输入 led_sampleRGB 灯红绿蓝循环闪五次从那以后我每次拿到一块新板子都会强制自己先走一遍“编译一个空工程、烧录、看到 msh 提示符”这三步再碰具体外设。这套流程顺不顺直接决定后面调蓝牙耳机音频链路、接外设传感器时会不会被环境问题打断。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑