作者ID:jf_81113435
匠芯創(chuàng)D133CBS做工相當(dāng)不錯(cuò),驚艷我了,接口非常多,還有觸摸屏,同時(shí)還可以接DVP攝像頭、喇叭、TF卡等重要外設(shè)。
開(kāi)箱及搭建VSCode開(kāi)發(fā)環(huán)境
外觀檢查:PCB無(wú)彎曲變形
所有接口無(wú)氧化或損壞;
元器件無(wú)松動(dòng)或脫落。

上電測(cè)試
電源指示燈立即亮起(綠色);
通過(guò)數(shù)字示波器觀察供電電壓是否正常。

通過(guò)示波器觀察到供電電壓5V,MCU供電電壓3.3V,1.1V供MCU CORE使用均正常。
開(kāi)發(fā)流程:開(kāi)發(fā)環(huán)境搭建流程
安裝Luban-Lite SDK;
訪問(wèn)匠芯創(chuàng)官方資源中心(https://gitee.com/artinchip/luban-lite);
下載Luban-Lite SDK后壓縮到D盤(pán);
在VSCode下載插件Luban-Lite;

把壓縮的文件夾在VSCODE打開(kāi)可以自動(dòng)激活插件,選擇匠芯創(chuàng)的圖標(biāo);
點(diǎn)擊【open project】,可以選擇示例demo;

點(diǎn)擊側(cè)邊欄的【Config Project】圖標(biāo)進(jìn)行Menuconfig配置;

修改完成后,須點(diǎn)擊【Save】保存配置后再點(diǎn)擊【Close】;
點(diǎn)擊側(cè)邊欄的【Build Project】圖標(biāo)進(jìn)行編譯,隨后可以進(jìn)行燒錄SDK。
Luban-Lite SDK使用
編譯固件并燒錄
通過(guò)VSCode進(jìn)行Luban-Lite SDK的編譯,第一次編譯過(guò)慢,請(qǐng)耐心等待。

只有顯示Luban-Liteis built successful才是編譯成功,過(guò)程較慢請(qǐng)耐心等待,編譯完成后可以同VSCode進(jìn)行燒錄,但是我沒(méi)有使用,我用另一種方式,采用AIburn軟件進(jìn)行軟件燒錄,這個(gè)軟件也可在匠芯創(chuàng)官網(wǎng)下載,這里主要講燒錄方式,這是軟件界面。

通過(guò)文件圖標(biāo)可以選擇鏡像文件。
最后面這個(gè)img后綴文件就是鏡像文件。
首先我們【按住】開(kāi)發(fā)板上面的【BOOT按鍵】和【RST按鍵】,然后我們松開(kāi)【RST按鍵】,一秒之后再松開(kāi)【BOOT按鍵】,就能進(jìn)入燒錄模式!

這樣就可以燒錄了,等待燒錄完成,系統(tǒng)自動(dòng)進(jìn)入。

這是系統(tǒng)的所有頁(yè)面,也是非常流暢,采用RTT實(shí)時(shí)操作系統(tǒng),非常好的一個(gè)板子。
LVGL GPIO 按鍵
音頻測(cè)試
板子有許多資源可以使用,通過(guò)閱讀原理圖可以使用這些硬件做項(xiàng)目。
通過(guò)這些電路結(jié)合實(shí)物,以下是這些demo進(jìn)行演示圖片。
這些都是LVGL demo演示,可以觀察到這些demo的響應(yīng)都非常及時(shí),也說(shuō)明了這款cpu的性能如何,這個(gè)板子也提供相當(dāng)多的資料與示例demo可供開(kāi)發(fā)者迅速上手開(kāi)發(fā),可以應(yīng)用相當(dāng)多領(lǐng)域,接下來(lái)我給硬件接上喇叭。

通過(guò)1.25mm端子喇叭接入可以選擇4歐或者8歐,接下來(lái)使用按鍵來(lái)開(kāi)控制led等的亮滅。

通過(guò)這兩個(gè)圖片我們可以看到,當(dāng)按鍵按下LED亮起,手拿開(kāi)LED滅。音質(zhì)也是非常悅耳,沒(méi)有任何卡頓沒(méi)有任何卡頓,這個(gè)板子也是相當(dāng)強(qiáng)大了。
串口使用
實(shí)驗(yàn)簡(jiǎn)介
我們使用USB-TTL模塊連接【PD.4】和【PD.5】?jī)蓚€(gè)引腳,將引腳復(fù)用為【UART2】的功能,實(shí)現(xiàn)串口雙向的收發(fā)不定長(zhǎng)數(shù)據(jù)!
需要準(zhǔn)備兩個(gè)串口調(diào)試工具,創(chuàng)建相關(guān)代碼文件夾,我們先要在【\\\\luban-lite\\\\application\\\\rt-thread\\\\helloworld\\\\】這個(gè)文件夾中創(chuàng)建一個(gè)【user_uart】文件夾!需要添加這個(gè)文件。

所以我們?cè)凇緐ser_uart】文件夾中的【SConscript】文件寫(xiě)入以下代碼:
Import('AIC_ROOT') # 導(dǎo)入AIC_ROOT變量,通常用于表示項(xiàng)目根目錄Import('rtconfig') # 導(dǎo)入rtconfig變量,通常包含項(xiàng)目的配置信息import rtconfig # 導(dǎo)入rtconfig模塊,以便直接使用其中的配置frombuilding import * # 從building模塊導(dǎo)入所有內(nèi)容,可能包含自定義的構(gòu)建函數(shù)和變量cwd = GetCurrentDir() # 獲取當(dāng)前SConscript文件所在的目錄路徑CPPPATH = [cwd] # 將當(dāng)前目錄添加到編譯器的頭文件搜索路徑中列表src = [] # 創(chuàng)建一個(gè)空列表,用于存放源文件ifGetDepend('USER_UART3_TEST_ON')andGetDepend('AIC_USING_UART3'):src = Glob(os.path.join(cwd,'*.c')) # 使用Glob函數(shù)查找當(dāng)前目錄下所有的.c文件,并將它們添加到src列表中g(shù)roup= DefineGroup('lckfb-user-uart3-test', src, depend = [''], CPPPATH = CPPPATH) #源文件Return('group') # 將定義的構(gòu)建組作為返回值,這樣其他SConscript文件可以引用這個(gè)組
通過(guò)以上代碼構(gòu)建程序框架,編寫(xiě)UART2驅(qū)動(dòng)代碼,我們?cè)凇緐art_test.c】文件中添加一下代碼。
#include#include#include#include#include#include#include"hal_adcim.h"#include"rtdevice.h"#include"aic_log.h"#include"hal_gpai.h"#include#include"aic_hal_gpio.h"#defineSAMPLE_UART_NAME "uart2" // 串口設(shè)備名稱#defineRCV_BUFF_SIZE_MAX 1024 // 接收最大字節(jié)長(zhǎng)度staticstructrt_semaphore rx_sem; // 用于接收消息的信號(hào)量staticrt_device_t serial; // 串口設(shè)備句柄staticrt_thread_t serial_recv_thread; // 串口接收線程句柄staticcharserial_recv_buff[RCV_BUFF_SIZE_MAX]; // 串口接收緩存區(qū)staticcharserial_recv_flag; // 串口接收標(biāo)志staticint serial_recv_length; // 接收字節(jié)長(zhǎng)度/* ====================串口發(fā)送和打印線程=================== */#defineTHREAD_PRIORITY 25 // 線程優(yōu)先級(jí)#defineTHREAD_STACK_SIZE 4096 // 線程大小#defineTHREAD_TIMESLICE 20 // 時(shí)間片staticrt_thread_t serial_thread = RT_NULL; // 線程控制塊// 中斷接收回調(diào)函數(shù)staticrt_err_t uart_input(rt_device_t dev, rt_size_t size){/* 串口有數(shù)據(jù)傳入后產(chǎn)生中斷,調(diào)用此回調(diào)函數(shù),釋放信號(hào)量 */if(size >0)rt_sem_release(&rx_sem);returnRT_EOK;}// 串口接收線程入口函數(shù)staticvoidserial_recv_thread_entry(void*param){rt_kprintf("\\nserial_recv_thread_entry run ......\\n");while(1){ chartemp_recv_buff =0;// 接收臨時(shí)緩存區(qū) intret = rt_device_read(serial,0, &temp_recv_buff,1);
if(ret 0)?// 出現(xiàn)了錯(cuò)誤? ? {? ? ? ? pr_debug("read() return [%ld] %s\\\\n", rt_get_errno(), rt_strerror(rt_get_errno()));? ? }
if(ret ==0)// 未接到數(shù)據(jù) { // 重置信號(hào)量 rt_sem_control(&rx_sem, RT_IPC_CMD_RESET, RT_NULL);
// 獲取信號(hào)量,如果沒(méi)有獲取得到則阻塞在這里永遠(yuǎn)等待。 rt_sem_take(&rx_sem, RT_WAITING_FOREVER); }
if(ret ==1)// 接收到1字節(jié)的數(shù)據(jù) { // 防止數(shù)據(jù)超出緩存區(qū)的大小 if(serial_recv_length < RCV_BUFF_SIZE_MAX -?1)? ? ? ? {? ? ? ? ? ? // 存入接收緩存區(qū)并遞增長(zhǎng)度? ? ? ? ? ? serial_recv_buff[serial_recv_length++] = temp_recv_buff;? ? ? ? ? ? // rt_kprintf("%x\\\\n", temp_recv_buff); // 打印接收到的字節(jié),用于調(diào)試? ? ? ? }? ? ? ? else? ? ? ? {? ? ? ? ? ? // 如果緩沖區(qū)已滿,則從0開(kāi)始覆蓋舊數(shù)據(jù)? ? ? ? ? ? serial_recv_length =?0;? ? ? ? ? ? serial_recv_buff[serial_recv_length++] = temp_recv_buff;? ? ? ? }
// 為接收緩存區(qū)最后添加 '\\\\0' serial_recv_buff[serial_recv_length] ='\\\\0';
// 設(shè)置串口接收完成標(biāo)志 serial_recv_flag =1; }}}/************************************************函數(shù)名稱 : Clear_recv_buff功 能 : 清空串口接收緩存區(qū)參 數(shù) : 無(wú)返 回 值 :static void Clear_recv_buff(void){// 清空接收緩存區(qū)rt_memset(serial_recv_buff, 0, sizeof(serial_recv_buff));// 清空標(biāo)志位serial_recv_flag = 0;// 清空緩存區(qū)長(zhǎng)度計(jì)量serial_recv_length = 0;}/************************************************函數(shù)名稱 : serial_send_byte功 能 : 串口發(fā)送一個(gè)字節(jié)參 數(shù) : 發(fā)送的數(shù)據(jù)返 回 值 : RT_EOK成功 -RT_ERROR失敗static int Serial_Send_Byte(uint8_t dat){int ret = rt_device_write(serial, 0, &dat, 1);if(ret != 1){LOG_E("Failed to [Serial_Send_Byte] code[%d] !!!", ret);return -RT_ERROR;}return RT_EOK;}/************************************************函數(shù)名稱 : Serial_Send_String功 能 : 串口發(fā)送字符串參 數(shù) : data_buff緩存區(qū)地址返 回 值 : RT_EOK成功 -RT_ERROR失敗static int Serial_Send_String(uint8_t *data_buff){int err_count = 0;/* 地址為空 或者 值為空 跳出 */while(data_buff && *data_buff){ if(RT_EOK != Serial_Send_Byte(*data_buff++)) { err_count++; continue; }}/* 如果err_count不為0,則說(shuō)明發(fā)送的時(shí)候有錯(cuò)誤!?。?*/if(err_count){ LOG_E("serial_send_string failed !!!"); return-RT_ERROR;}returnRT_EOK;}/******************************************************************* 函 數(shù) 名 稱:Serial_Recv_DATA* 函 數(shù) 說(shuō) 明:接串口的數(shù)據(jù)* 函 數(shù) 形 參:data_buff數(shù)據(jù)緩存區(qū)* 函 數(shù) 返 回: 0: 未接收到數(shù)據(jù)* 其他: 接收到的數(shù)據(jù)長(zhǎng)度* 作 者:LCKFB* 備 注:無(wú) ******************************************************************/ intSerial_Recv_DATA(uint8_t *data_buff) { inti;
/* 判斷是否接到了數(shù)據(jù) */ if((serial_recv_flag !=1) || (serial_recv_length ==0)) { /* 未接到 */ return0; }
/* 將數(shù)據(jù)轉(zhuǎn)存到指針指向的地址中 */ for(i =0; i < serial_recv_length; i++)? {? data_buff[i] = serial_recv_buff[i];? }
/* 加入字符串結(jié)尾 */ data_buff[i] ='\\0';
/* 清除接收的數(shù)據(jù)、標(biāo)志位和數(shù)據(jù)長(zhǎng)度。 */ Clear_recv_buff();
returni;// 返回接收到的數(shù)據(jù)長(zhǎng)度 }/************************************************函數(shù)名稱 : UART_Init功 能 : 串口初始化參 數(shù) : 無(wú)返 回 值 : RT_EOK成功 -RT_ERROR失敗static int UART_Init(void){int ret = 0;// 清空接收緩存區(qū)rt_memset(serial_recv_buff,0,sizeof(serial_recv_buff));// 清空標(biāo)志位serial_recv_flag = 0;// 清空緩存區(qū)長(zhǎng)度計(jì)量serial_recv_length = 0;rt_kprintf("Try to open(%s)\\\\n", SAMPLE_UART_NAME);// 獲取串口句柄serial = rt_device_find(SAMPLE_UART_NAME);if (!serial){ LOG_E("find %s failed!\\\\n", SAMPLE_UART_NAME); return -RT_ERROR;}// 初始化信號(hào)量ret = rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);if (ret != RT_EOK){ LOG_E("failed to rt_sem_init !\\\\n"); return -RT_ERROR;}// 打開(kāi)串口設(shè)備ret = rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);if (ret != RT_EOK){ LOG_E("open %s failed : %d !\\\\n", SAMPLE_UART_NAME, ret); return -RT_ERROR;}// 設(shè)置接收回調(diào)函數(shù)rt_device_set_rx_indicate(serial, uart_input);// 創(chuàng)建串口數(shù)據(jù)接收線程serial_recv_thread = rt_thread_create("serial", serial_recv_thread_entry, RT_NULL, 1024*2, 15, 20);if (serial_recv_thread != RT_NULL){ // 啟動(dòng)線程 rt_thread_startup(serial_recv_thread);}else{ rt_device_close(serial); LOG_E("Failed to [rt_thread_create] !!!"); return -RT_ERROR;}return RT_EOK;}// 線程入口函數(shù)static void serial2_thread_entry(void *param){rt_kprintf("Start serial2_thread_entry...\\n");while(1){ int count = 0; /* 接收緩存區(qū) */ uint8_t recv_buff[128] = {0}; /* 獲取接收到的數(shù)據(jù)長(zhǎng)度 */ count = Serial_Recv_DATA(recv_buff); /* 確保 count 不超過(guò) recv_buff 大小,避免越界訪問(wèn) */ if(count >sizeof(recv_buff)) { LOG_E("Error: Received data exceeds buffer size! count = %d",count); count =sizeof(recv_buff); // 限制數(shù)據(jù)長(zhǎng)度避免溢出 } if(count >0) { rt_kprintf("\\\\n======================================\\\\n"); rt_kprintf("\\\\nRead Data = %s\\\\n", recv_buff); rt_kprintf("\\\\n======================================\\\\n"); } /* 延遲 1000 毫秒 */ rt_thread_mdelay(1000);}}// 數(shù)據(jù)發(fā)送函數(shù)staticvoidsend_demoData(intargc,char**argv){staticintnum =1;uint8_t Send_Buff[128] = {"kunlunpi * UART框架使用測(cè)試"};intret =0;charbuffer[128] = {0};// 使用 snprintf 來(lái)格式化要發(fā)送的字符串snprintf(buffer,sizeof(buffer),"【%d】%s", num, (argc ==2) ? *(argv+1) : (char*)Send_Buff);// 發(fā)送數(shù)據(jù)ret = Serial_Send_String((uint8_t *)buffer);if(ret != RT_EOK){ LOG_E("%s: The test data transmission failed.", __FUNCTION__);}else{ rt_kprintf("\\\\n[%d] Send success\\\\n", num); num++;// 只有發(fā)送成功時(shí)才遞增 num}}// 導(dǎo)出函數(shù)為命令MSH_CMD_EXPORT(send_demoData, Send test data);// 串口接收和發(fā)送線程開(kāi)啟staticvoiduart2_test_on(intargc,char**argv){intret = UART_Init(); // 串口初始化if(ret != RT_EOK){LOG_E("Failed to [UART_Init] !!!");LOG_E("file: %s line: %d", **FILE** , **LINE** );return;}rt_kprintf("UART_Init run END!!\\n");/* 創(chuàng)建線程,名稱是 serial3_thread,入口是 serial3_thread_entry */serial_thread = rt_thread_create("serial2_thread", serial2_thread_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);/* 如果獲得線程控制塊,啟動(dòng)這個(gè)線程 */if(serial_thread != RT_NULL) rt_thread_startup(serial_thread);rt_kprintf("Test transmission and reception using UART2 serial port!!\\\\n");}// 導(dǎo)出函數(shù)為命令MSH_CMD_EXPORT(uart2_test_on, Test transmission and reception using UART2 serial port);
以上代碼大部分都?xì)w屬立創(chuàng)開(kāi)發(fā)板,需要填加文件配置文件,在同級(jí)Kconfig中寫(xiě)入以下代碼。
config USER_UART2_TEST_ONbool"Test transmission and reception using UART2 serial port"defaultnhelp
然后程序編譯等待編譯完成。

會(huì)出現(xiàn)【Luban-Lite is built successfully】,燒錄程序,打開(kāi)串口調(diào)試工具。

我們可以看到串口輸出信息,最后我給串口發(fā)送信息能發(fā)送到我的電腦。

以上內(nèi)容來(lái)源:電子發(fā)燒友論壇
-
pcb
+關(guān)注
關(guān)注
4404文章
23876瀏覽量
424147 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
26文章
6288瀏覽量
117966 -
匠芯創(chuàng)
+關(guān)注
關(guān)注
0文章
57瀏覽量
189
發(fā)布評(píng)論請(qǐng)先 登錄
探索 KunLun Pi | 基于匠芯創(chuàng)D13x系列開(kāi)發(fā)板分享(三)
【匠芯創(chuàng)科技】D13X-DOC
【新品體驗(yàn)】匠芯創(chuàng)D133CBS KunLun Pi開(kāi)發(fā)板試用體驗(yàn)
匠芯創(chuàng)D133CBS RISC-V KunLun Pi V1.0開(kāi)發(fā)板開(kāi)發(fā)資料
【匠芯創(chuàng)D133CBS KunLun Pi開(kāi)發(fā)板試用體驗(yàn)】《匠芯創(chuàng)D133CBS RISC-V KunLun Pi 》 開(kāi)箱及搭建vscode開(kāi)發(fā)環(huán)境
【匠芯創(chuàng)D133CBS KunLun Pi開(kāi)發(fā)板試用體驗(yàn)】1、開(kāi)發(fā)板開(kāi)箱及介紹
【匠芯創(chuàng)D133CBS KunLun Pi開(kāi)發(fā)板試用體驗(yàn)】2、SDK下載+環(huán)境搭建
【匠芯創(chuàng)D133CBS KunLun Pi開(kāi)發(fā)板試用體驗(yàn)】匠芯創(chuàng)D133CBS KunLun Pi開(kāi)發(fā)板串口使用
【匠芯創(chuàng)D133CBS KunLun Pi開(kāi)發(fā)板試用體驗(yàn)】+環(huán)境搭建
【匠芯創(chuàng)D133CBS KunLun Pi開(kāi)發(fā)板試用體驗(yàn)】開(kāi)箱評(píng)測(cè)
【匠芯創(chuàng)D133CBS KunLun Pi開(kāi)發(fā)板試用體驗(yàn)】介紹、環(huán)境搭建
【免費(fèi)試用】匠芯創(chuàng)D133CBS KunLun Pi開(kāi)發(fā)板試用體驗(yàn)
匠芯創(chuàng)D13x系列通過(guò)工業(yè)和信息化部重點(diǎn)實(shí)驗(yàn)室測(cè)試
賦能兩輪車新國(guó)標(biāo) | 匠芯創(chuàng)D13x系列芯片為手機(jī)無(wú)線投屏與導(dǎo)航提供核心支持
探索KunLun Pi | 基于匠芯創(chuàng)D13x系列開(kāi)發(fā)板分享
評(píng)論