0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于RT-Thread“数码小精灵”设计与实现

RTThread物联网操作系统 来源:RTThread物联网操作系统 作者:赵俊涛 2020-10-27 09:22 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:赵俊涛

一、概述

随着近年来智能化设备的不断增长,平板电脑、智能数字音视频播放器、移动数码相机等各类数码产品,正越来越受到城乡居民欢迎。特别是“云生活”让人们对数码产品有了更多需求,加上互联网技术、5G 技术、智能化新产品、新型分期消费模式等的出现,让数码产品消费热潮涌动。

本设计为基于 RT-Thread 的“数码小精灵”设计,硬件采用了以 BK7252 为主控芯片的麻雀一号开发板开发。BK7252 , 是一款高性能 WiFi 模块,采用高集成的无线射频芯片,内部集成 2.4GHz Wi-Fi 1T1R 先进技术,支持摄像头图像输出,拥有最佳的功耗性能、射频性能、稳定性、通用性和可靠性,适用于各种应用和不同产品需求。模块内部拥有 512KB 内嵌 RAM 和 4Mbyte Flash 空间,CPU 主频高达 180Mhz。

本设计在此基础上主要实现了以下功能,包括天气和疫情数据更新显示、MP3 音乐播放器以及数码拍照相机的功能。其中 MP3 播放器具有音量调节,播放/停止控制和歌曲切换的功能;数码相机将拍照图片进行 LCD 屏显示,同 时具有 SD 卡存储和 OneNet 云平台存储功能。该产品可以充当家庭数码助理的角色,因此取名“数码小精灵”。同时本作品完成的过程中参考了部分网络资料和网友的思路,在此一并表示感谢。

二、RT-Thread 使用情况概述

本设计基于麻雀一号开发板 SDK 进行开发,其 RT-Thread 为 3.1.0 版本。

图 1 RT-Thread 版本

在 RT-Thread 系统上的设备注册列表,其中主要使用了 rtc,sd0,w0,sound,uart1 等设备。使用到的 RT-Thread 组件包括了 FinSH 控制台,虚拟文件系统,POSIX 接口。在软件包上面涉及到网络工具及 NetUtils,WebClient,cJSON,EasyFlash,rt_ota,TJpgDec,Player 等。

图2设备注册列表

三、硬件框架


麻雀一号开发板外设资源丰富,但资源相当丰富,集成 WiFi、BLE、摄像头、音频扬声器、MIC 录音、TF 卡座、五向按键、还有一个 1.44 寸的 LCD 屏,使用常见的 TypeC 接口作为供电和调试串口,预留支持锂电池供电接口。

本设计的人机交互部分主要利用了开发板的五向按键和 LCD 显示屏,其中按键用于功能选择,数据刷新以及音乐播放控制功能。

普通模式下:“←”:音乐播放 、“”:天气和疫情数据刷新 、“→”:相机拍照

音乐播放模式下:“↑”:音量加、“↓”:音量减 、“←”:下一曲 、“”:停止播放

设备联网采用 WIFI 连接,上电自动连接网络。数据显示 LCD 进行显示,同时设备接有 SD 进行相机拍照的存储。此外照片同时可以通过 WIFI 上传至OneNet 云平台,进行远端网页或者手机等智能终端进行查看。

四、软件框架说明

系统软件流程框图如下图所示,设备上电后启动 RT-Thread 操作系统,同 时进行相关硬件设备的初始化操作,如 LCD 显示屏,音频扬声器,以及挂在SD 卡到文件系统等操作,之后进行设备的网络连接。网络连接后输入应用程序启动命令进行程序启动,LCD 显示欢迎界面,接下来用户可以通过五向按键进 行功能选择,主要是天气疫情数据更新显示、MP3 播放器功能以及数码相机的功能。相机拍照后会进行本地 SD 卡数据存储以及 OneNet 云端存储。

五、软件模块说明

1. 设备联网

设备联网主要使用到了 RT-Thread 组件中的 wlan 驱动程序实现,上电初始化完成后在主程序中查询 wlan 无线设备,并根据用户配置的 SSID 和PASSWORD 进行 WIFI 网络的连接。该部分的具体代码实现如下所示:

1staticintiot_station_connect(char*ssid,char*passwd){ 2rt_err_tresult=RT_EOK; 3structrt_wlan_infoinfo; 4structrt_wlan_device*wlan; 5rt_tick_ttick=0; 6wlan=(structrt_wlan_device*)rt_device_find(WIFI_DEVICE_STA 7_NAME); 8if(!wlan) 9{ 10rt_kprintf("nowlan:%sdevice ",WIFI_DEVICE_STA_NAME); 11return-1;} 12result=rt_wlan_init(wlan,WIFI_STATION); 13rt_wlan_register_event_handler(wlan,WIFI_EVT_STA_CONNECTED,i 14ot_wlan_sta_connected_event); 15rt_wlan_register_event_handler(wlan,WIFI_EVT_STA_DISCONNECTED 16,iot_wlan_sta_disconnected_event); 17rt_wlan_info_init(&info,WIFI_STATION,SECURITY_WPA2_AES_PSK, 18ssid); 19result=rt_wlan_connect(wlan,&info,passwd); 20rt_wlan_info_deinit(&info); 21returnresult; 22}

2. NTP 网络时间同步

网络时间同步主要思路就是通过调用网络工具包中的 ntp 同步函数来实现,通过创建独立时间同步线程,达到定时同步网络时间的目的。该部分使用时需要启用 RT-Thread 中的 RTC 功能。相关代码如下:

1{ 2time_tcur_time=ntp_sync_to_rtc(); 3if(cur_time) 4{ 5rt_kprintf("GetlocaltimefromNTPserver:%s",ctime((constt 6ime_t*)&cur_time)); 7rt_kprintf("Thesystemtimeisupdated.Timezoneis%d. ",NTP 8_TIMEZONE); 9}} 10staticrt_thread_ttid1=RT_NULL; 11staticvoidntcthread1_entry(void*parameter){ 12while((1)) 13{ 14time_tcur_time=ntp_sync_to_rtc(); 15if(cur_time) 16{ 17rt_kprintf("GetlocaltimefromNTPserver:%s",ctime((consttim 18e_t*)&cur_time)); 19rt_kprintf("Thesystemtimeisupdated.Timezoneis%d. ",NTP_T 20IMEZONE); 21break;} 22else 23{ 24rt_thread_mdelay(1000); 25}}} 26voidNTCThreadInit(void){ 27if(tid1!=RT_NULL) 28{ 29rt_kprintf("ntcthreadstillrun "); 30return;} 31rt_kprintf("NTCthreadinit "); 32tid1=rt_thread_create("NTC", 33ntcthread1_entry,RT_NULL, 34THREAD_STACK_SIZE, 35THREAD_PRIORITY,THREAD_TIMESLICE); 36if(tid1!=RT_NULL) 37rt_thread_startup(tid1); 38}3. 天气疫情数据更新

该部分主要是利用了 webclient 工具包的功能,通过调用天气和疫情数据API 接口获取相关 Json 数据,并利用 CJson 工具包进行返回 Json 数据的解析。最后通过 LCD 进行数据显示。相关代码如下:

1#defineGET_URI"http://www.weather.com.cn/data/sk/%s.html"// 2获取天气的API 3#defineGET_FY2020_URI"http://www.dzyong.top:3005/yiqing/total"//疫情 4数据API 5voidget_weather(intargc,char**argv){ 6rt_uint8_t*buffer=RT_NULL; 7intresp_status; 8structwebclient_session*session=RT_NULL; 9char*weather_url=RT_NULL; 10intcontent_length=-1,bytes_read=0; 11intcontent_pos=0; 12char*city_name=rt_calloc(1,255); 13/*为weather_url分配空间*/ 14weather_url=rt_calloc(1,GET_URL_LEN_MAX); 15if(weather_url==RT_NULL) 16{ 17rt_kprintf("Nomemoryforweather_url! "); 18goto__exit; 19} 20if(argc==1){ 21strcpy(city_name,AREA_ID); 22} 23elseif(argc==2){ 24strcpy(city_name,argv[1]); 25} 26/*拼接GET网址*/ 27rt_snprintf(weather_url,GET_URL_LEN_MAX,GET_URI,city_name); 28/*创建会话并且设置响应的大小*/ 29session=webclient_session_create(GET_HEADER_BUFSZ); 30if(session==RT_NULL) 31{ 32rt_kprintf("Nomemoryforgetheader! "); 33goto__exit; 34} 35/*发送GET请求使用默认的头部*/ 36if((resp_status=webclient_get(session,weather_url))!=200){ 37rt_kprintf("webclientGETrequestfailed,response(%d)error. ",resp_ 38status); 39goto__exit; 40} 41/*分配用于存放接收数据的缓冲*/ 42buffer=rt_calloc(1,GET_RESP_BUFSZ); 43if(buffer==RT_NULL) 44{ 45rt_kprintf("Nomemoryfordatareceivebuffer! "); 46goto__exit; 47} 48content_length=webclient_content_length_get(session); 49if(content_length< 0) { 50/* 返回的数据是分块传输的. */ 51do 52{ 53bytes_read = webclient_read(session, buffer, GET_RESP_BUFSZ); 54if (bytes_read <= 0) { 55break; } }while (1); } 56else 57{ 58do 59{ 60bytes_read = webclient_read(session, buffer, 61content_length - content_pos >GET_RESP 62_BUFSZ? 63GET_RESP_BUFSZ:content_length-conte 64nt_pos); 65if(bytes_read<= 0) { 66break; } 67content_pos += bytes_read; 68}while (content_pos < content_length); 69} 70/* 天气数据解析 */ 71weather_data_parse(buffer); 72__exit: 73

/*释放网址空间*/

74if(weather_url!=RT_NULL) 75rt_free(weather_url); 76/*关闭会话*/ 77if(session!=RT_NULL) 78webclient_close(session); 79/*释放缓冲区空间*/ 80if(buffer!=RT_NULL) 81rt_free(buffer); 82if(city_name!=RT_NULL) 83rt_free(city_name); 84} 85/*天气数据解析*/ 86voidweather_data_parse(rt_uint8_t*data){ 87uint8_ttemp[100]; 88cJSON*root=RT_NULL,*object=RT_NULL,*item=RT_NULL; 89root=cJSON_Parse((constchar*)data); 90if(!root) 91{ 92rt_kprintf("NomemoryforcJSONroot! "); 93return;} 94object=cJSON_GetObjectItem(root,"weatherinfo"); 95item=cJSON_GetObjectItem(object,"city"); 96rt_kprintf(" city:%s",item->valuestring); 97lcd_clear(BLACK); 98item=cJSON_GetObjectItem(object,"temp"); 99rt_kprintf(" temp:%s",item->valuestring); 100rt_sprintf(temp,"温度:%s",item->valuestring); 101lcd_disp_str_en_ch(0,20,temp,BLACK,WHITE); 102item=cJSON_GetObjectItem(object,"WD"); 103rt_kprintf(" wd:%s",item->valuestring); 104item=cJSON_GetObjectItem(object,"WS"); 105rt_kprintf(" ws:%s",item->valuestring); 106item=cJSON_GetObjectItem(object,"SD"); 107rt_kprintf(" sd:%s",item->valuestring); 108rt_sprintf(temp,"湿度:%s",item->valuestring); 109lcd_disp_str_en_ch(0,40,temp,BLACK,WHITE); 110item=cJSON_GetObjectItem(object,"time"); 111rt_kprintf(" time:%s ",item->valuestring); 112item=cJSON_GetObjectItem(object,"AP"); 113rt_kprintf(" ap:%s",item->valuestring); 114rt_sprintf(temp,"气压:%s",item->valuestring); 115lcd_disp_str_en_ch(0,60,temp,BLACK,WHITE); 116item=cJSON_GetObjectItem(object,"WSE"); 117rt_kprintf(" wse:%s",item->valuestring); 118rt_sprintf(temp,"风力:%s",item->valuestring); 119lcd_disp_str_en_ch(0,80,temp,BLACK,WHITE); 120if(root!=RT_NULL) 121cJSON_Delete(root); 122} 123/*疫情数据解析*/

124voidfy2020_data_parse(rt_uint8_t*data){ 125uint8_ttemp[100]; 126cJSON*root=RT_NULL,*object=RT_NULL,*item=RT_NULL; 127root=cJSON_Parse((constchar*)data); 128if(!root) 129{ 130rt_kprintf("NomemoryforcJSONroot! "); 131return;} 1324.音乐播放模块 133该部分的功能主要通过使用player软件包的接口函数实现,包括音乐播 134放,停止,歌曲切换以及音量控制等功能。该部分的部分代码如下图所示: 135cJSON*dataArray=cJSON_GetObjectItem(root,"data");//取数组 136intarraySize=cJSON_GetArraySize(dataArray);//取数组大小 137cJSON*dataList=dataArray->child; 138while(dataList!=RT_NULL) 139{ 140rt_kprintf(" diagnosed:%d ",cJSON_GetObjectItem(dataList,"diagn 141osed")->valueint); 142rt_kprintf(" death:%d ",cJSON_GetObjectItem(dataList,"death")-> 143valueint); 144rt_kprintf(" cured:%d ",cJSON_GetObjectItem(dataList,"cured")-> 145valueint); 146rt_kprintf(" date:%s ",cJSON_GetObjectItem(dataList,"date")->va 147luestring); 148//LCD屏打印信息 149rt_sprintf(temp,"累计确 150诊:%d",cJSON_GetObjectItem(dataList,"diagnosed")->valueint); 151lcd_disp_str_en_ch(0,120,temp,BLACK,WHITE); 152rt_sprintf(temp,"累计死 153亡:%d",cJSON_GetObjectItem(dataList,"death")->valueint); 154lcd_disp_str_en_ch(0,140,temp,BLACK,WHITE); 155rt_sprintf(temp,"累计治 156愈:%d",cJSON_GetObjectItem(dataList,"cured")->valueint); 157lcd_disp_str_en_ch(0,160,temp,BLACK,WHITE); 158rt_sprintf(temp,"更新时 159间:%s",cJSON_GetObjectItem(dataList,"date")->valuestring); 160lcd_disp_str_en_ch(0,180,temp,BLACK,WHITE); 161dataList=dataList->next; 162}

4. 音乐播放模块

该部分的功能主要通过使用 player 软件包的接口函数实现,包括音乐播放,停止,歌曲切换以及音量控制等功能。该部分的部分代码如下图所示:

1LCDShowMusic(); 2rt_sprintf(music,"/sd/music/%d.mp3",count); 3rt_kprintf("keyleftispress... "); 4rt_kprintf("////////////////////////////player_play "); 5player_stop(); 6player_set_uri(music); 7player_play(); 8player_status=1; 9count++; 10if(count>=8) 11count=0; 12rt_kprintf("////////////////////////////player_playend ");5. 相机功能实现

该部分主要通过 IPC 事件获取相机采集图像数据,并将采集到的图像数据经过 TJpgDec 软件包进行解码后在 LCD 进行显示,同时会将相机数据通过写文件的形式存储到 SD 卡,通过 HTTP 协议推送到 OneNet 云平台。

1voidtake_photo(void)//手动拍照 2{ 3//创建摄像头接收一帧图片的事件 4session.event=rt_event_create("vt_event",RT_IPC_FLAG_FIFO); 5camera_start();//开启摄像头传输照片 6tvideo_capture(1); 7rt_event_recv(session.event,SEND_FRAME_EVENT,RT_EVENT_FLAG_OR|RT_EVE 8NT_FLAG_CLEAR,RT_WAITING_FOREVER,RT_NULL); 9intfd,res; 10time_tcur_time; 11structtm*cur_tm; 12chartime_now[50];//保存文件到sd卡指定路径 13/*outputcurrenttime*/ 14cur_time=time(RT_NULL); 15cur_tm=localtime(&cur_time); 16rt_sprintf(time_now,"%04d-%02d-%02d-%02d-%02d-%02d",cur_tm->tm_year+19 1700,cur_tm->tm_mon+1,cur_tm->tm_mday,cur_tm->tm_hour,cur_tm->tm_min,cur 18_tm->tm_sec); 19rt_sprintf(file_name,"/sd/images/%s.jpg",time_now); 20rt_kprintf("name=%s ",file_name); 21fd=open(file_name,O_WRONLY|O_CREAT); 22if(fd>=0){ 23write(fd,session.buf,session.total_len); 24close(fd); 25rt_kprintf("save%sok!!! ",file_name); 26res=Decode_Jpg(file_name); 27rt_kprintf("res=%d ",res); 28} 29else 30{ 31rt_kprintf("savepicfailed!!! "); 32} 33//拍照数据上传 34webclient_post_pic(session.buf,session.total_len); 35tvideo_capture(0); 36} 37MSH_CMD_EXPORT(take_photo,take_photo);

六、演示效果

原文标题:【RT-Thread 开源作品秀】基于 RT-Thread 的“数码小精灵”设计与实现

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开源
    +关注

    关注

    3

    文章

    4032

    浏览量

    45569
  • 5G
    5G
    +关注

    关注

    1366

    文章

    49069

    浏览量

    590108
  • RT-Thread
    +关注

    关注

    32

    文章

    1540

    浏览量

    44286

原文标题:【RT-Thread 开源作品秀】基于 RT-Thread 的“数码小精灵”设计与实现

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    首搭RT-Thread程翧车控平台| RT-Thread程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    在智能汽车迈向高集成与高安全的时代,VCU/ECU开发正面临效率与可靠性的双重考验。依赖单一硬件或拼凑软件方案的传统模式,已成为制约创新的瓶颈。为此,RT-Thread带来里程碑式的解决方案
    的头像 发表于 10-31 11:53 491次阅读
    首搭<b class='flag-5'>RT-Thread</b>程翧车控平台| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    2025年RT-Thread开发者巡回培训报名正式启动!

    亲爱的RT-Thread社区成员们:新程再启,共赴热爱!2025年RT-Thread开发者巡回培训正式启动报名!今年,我们选择了西安、武汉、北京、杭州、深圳、上海、成都这7座城市,为大家带来
    的头像 发表于 09-27 10:39 1142次阅读
    2025年<b class='flag-5'>RT-Thread</b>开发者巡回培训报名正式启动!

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    rt-thread studio2.2.9如何使用最新的RT-Thread v5.2.0 released? 原先以为修改index_all.json,发现联网的时候,会自动覆盖 另lastet版本
    发表于 09-16 06:06

    在Ubuntu上开发基于先楫MCU的RT-Thread应用指南

    1、前言RT-ThreadEnv是RT-Thread推出的开发辅助工具,针对基于RT-Thread操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。其内置的menuconfig
    的头像 发表于 08-29 12:22 1231次阅读
    在Ubuntu上开发基于先楫MCU的<b class='flag-5'>RT-Thread</b>应用指南

    【好书推荐】RT-Thread第20本相关书籍!《嵌入式实时操作系统RT-Thread原理与应用》| 技术集结

    01内容简介ContentSummary本书为读者提供了一个全面、系统的RT-Thread学习指南,旨在帮助初学者及有经验的开发者掌握RT-Thread实时操作系统和STM32嵌入式微控制器的核心
    的头像 发表于 08-24 10:05 689次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>第20本相关书籍!《嵌入式实时操作系统<b class='flag-5'>RT-Thread</b>原理与应用》| 技术集结

    RT-Thread 遇上 Rust:安全内核 RusT-Thread 的诞生

    大家好,我们是中国科学技术大学操作系统原理与设计(H)课oooooS小组。这个项目是我们的课程大作业:参考RT-Thread架构,使用Rust搭建一个原生的嵌入式操作系统内核。初识Rust是因为xk
    的头像 发表于 08-02 11:03 3209次阅读
    <b class='flag-5'>RT-Thread</b> 遇上 Rust:安全内核 RusT-<b class='flag-5'>Thread</b> 的诞生

    用SPI玩转WiFi,RT-Thread ESP-Hosted驱动深度适配指南 | 技术集结

    还在为MCU的WiFi连接方案发愁?RT-Thread社区开源ESP-Hosted驱动,通过标准SPI接口即可实现,并且该仓库已整理成RT-Thread软件包。RT
    的头像 发表于 07-09 19:03 1118次阅读
    用SPI玩转WiFi,<b class='flag-5'>RT-Thread</b> ESP-Hosted驱动深度适配指南 | 技术集结

    RT-Thread荣获2025优秀开源项目 | 新闻速递

    6月底,RT-Thread睿赛德受邀参与由上海开源信息技术协会主办的2025上海开源创新精英荟。上海市商委副主任张杰出席会议并致辞。RT-Thread嵌入式操作系统项目凭借其卓越的技术创新与开源生态
    的头像 发表于 07-04 09:04 2432次阅读
    <b class='flag-5'>RT-Thread</b>荣获2025优秀开源项目 | 新闻速递

    深度剖析 RT-Thread 线程调度流程

    RT-Thread调度第一个线程的主要流程分如下:rtthread_startup:RTT的启动函数,主要负责板级驱动,调度器,系统线程初始化,启动调度的工作
    的头像 发表于 06-25 18:24 1438次阅读
    深度剖析 <b class='flag-5'>RT-Thread</b> 线程调度流程

    揭秘RT-Thread上的AUTOSAR CP系统

    标准,同时保留RT-Thread的POSIX支持与可裁剪性,实现了通信隔离、诊断模块集成等关键技术突破,为车载系统提供高安全、可扩展的解决方案。车载电子系统与传统
    的头像 发表于 06-23 20:22 2945次阅读
    揭秘<b class='flag-5'>RT-Thread</b>上的AUTOSAR CP系统

    2025 RT-Thread全球技术大会议程正式发布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技术大会)是聚焦基础软件技术创新与实践的嵌入式技术盛会,持续推动技术价值转化
    的头像 发表于 05-27 19:28 1072次阅读
    2025 <b class='flag-5'>RT-Thread</b>全球技术大会议程正式发布!

    RT-Thread 上如何实现 SLAAC?

    大佬们,本菜鸟有一些网络上的问题需要帮助: RT-Thread 上如何实现 SLAAC(无状态地址自动分配),给连接到我的板子的设备分配 IPv6 地址; RT-Thread 如何发送以太网报文,要求从报文头开始都是我自己组,
    发表于 05-27 07:21

    RT-Thread审核团招募: 深度参与开源RTOS社区治理与演进

    全球开发者招募:RT-Thread审核团(ReviewTeam)正式开放申请!在开源的世界里,代码审查(CodeReview)是保证软件质量、促进技术交流的关键环节。RT-Thread作为全球领先
    的头像 发表于 05-21 18:02 1066次阅读
    <b class='flag-5'>RT-Thread</b>审核团招募: 深度参与开源RTOS社区治理与演进

    如何将RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默认支持的IDE只有IAR 和 Keil, 那如何将RT-Thread移植到NXP MCUXPressoIDE上呢?本文内容比较简单但稍有琐碎,希望对有需要的小伙伴有所帮助。
    的头像 发表于 02-13 10:37 2440次阅读
    如何将<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上

    Deepseek上单片机?RT-Thread上跑通大语言模型

    前言单片机也能聊天?RT-Thread上跑通大语言模型在RT-Thread论坛上忽然看到了单片机和大模型对话的文章,想着春节期间看到大语言模型的热度持续攀升,恰巧手头有块RA8D1VisionBoard开发板,于是尝试着在VisionBoard上对接下大语言模型的API,
    的头像 发表于 02-07 18:59 2366次阅读
    Deepseek上单片机?<b class='flag-5'>RT-Thread</b>上跑通大语言模型