完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>
標簽 > DM642
DM642全名TMS320DM642是TI公司C6000系列DSP中最新的定點DSP,其核心是C6416型高性能數字信號處理器,具有極強的處理性能,高度的靈活性和可編程性,同時外圍集成了非常完整的音頻、視頻和網絡通信等設備及接口,特別適用于機器視覺、醫學成像、網絡視頻監控、數字廣播以及基于數字視頻/圖像處理的消費類電子產品等高速DSP應用領域。
DM642全名TMS320DM642是TI公司C6000系列DSP中最新的定點DSP,其核心是C6416型高性能數字信號處理器,具有極強的處理性能,高度的靈活性和可編程性,同時外圍集成了非常完整的音頻、視頻和網絡通信等設備及接口,特別適用于機器視覺、醫學成像、網絡視頻監控、數字廣播以及基于數字視頻/圖像處理的消費類電子產品等高速DSP應用領域。筆者針對市場客戶的需求,設計并實現了一款以TVP5150為視頻輸入解碼器,以PCM1801為音頻輸入采集電路,以TMS320DM642型DSP為核心處理器的多路視頻采集兼壓縮處理PCI板卡,并將其應用于構建高穩定性、高魯棒性和多媒體數字監控系統,取得了較好的社會效益和經濟效益。
DM642全名TMS320DM642是TI公司C6000系列DSP中最新的定點DSP,其核心是C6416型高性能數字信號處理器,具有極強的處理性能,高度的靈活性和可編程性,同時外圍集成了非常完整的音頻、視頻和網絡通信等設備及接口,特別適用于機器視覺、醫學成像、網絡視頻監控、數字廣播以及基于數字視頻/圖像處理的消費類電子產品等高速DSP應用領域。筆者針對市場客戶的需求,設計并實現了一款以TVP5150為視頻輸入解碼器,以PCM1801為音頻輸入采集電路,以TMS320DM642型DSP為核心處理器的多路視頻采集兼壓縮處理PCI板卡,并將其應用于構建高穩定性、高魯棒性和多媒體數字監控系統,取得了較好的社會效益和經濟效益。
硬件架構
TMS320DM642采用第二代高性能、先進的超長指令字veloci T1.2結構的DSP核及增強的并行機制,當工作在720M赫茲的時鐘頻率下,其處理性能最高可達5760MI/s,使得該款DSP成為數字媒體解決方案的首選產品,它不僅擁有高速控制器的操作靈活性,而且具有陣列處理器的數字處理能力,TMS320DM642的外圍集成了非常完整的音頻、視頻和網絡通信接口。
主要構成
3個可配置的視頻端口(VPORT0-2)能夠與通用的視頻編、解碼器實現無縫連接,支持多種視頻分辨率及視頻標準,支持RAW視頻輸入/輸出,傳輸流模式;
1個10/100Mb/s以太網接口(EMAC),符合IEEE 802.3標準;
1個多通道帶緩沖音頻串行端口(McASP),支持I2S,DIT,S/PDIF,IEC60958-1,AES-3、CP-430等音頻格式;
2個多通道帶緩沖串行端口(McBSP),采用RS232電平驅動;
1個VCXO內插控制單元(VIC),支持音/視頻同步;
1個32位、66M赫茲、3.3V主/從PCI接口,遵循PCI2.2規范;
1個用戶可配置的16/32主機接口(HPI);
1個16位通用輸入/輸出端口(GPIO);
1個64位外部存儲器接口(EMIF),能夠與大多數異步存儲器(SRAM、EPROM)及同步存儲器(SDRAM,SBSRAM,ZBT SRAM,FIFO)無縫連接,最大可尋址外部存儲器空間為1024MB;
1個具有64路獨立通道的增強型直接內存訪問控制器(EDMA);
1個數據管理輸入/輸出模塊(MDIO);
1個I2C總線模塊;
3個32位通用定時器;
1個符合IEEE 1149.1標準的JTAG接口及子板接口等。
DM642學習筆記(程序注釋)
用的是瑞泰創新的實驗箱(ICETEK-DM642-IDK-M),主要是視頻處理部分的程序注釋及思考題思路及一些不成熟的見解~~
實驗5.6-5.19 視頻驅動程序應用
DM642視頻驅動程序的注釋:
/*
* Copyright 2003 by Texas Instruments Incorporated.
* All rights reserved. Property of Texas Instruments Incorporated.
* Restricted rights to use, duplicate or disclose this code are
* granted through contract.
*
*/
/* “@(#) DDK 1.10.00.23 07-02-03 (ddk-b12)” */
#include 《std.h》 //如果使用C語言,必須將此文件作為第一個頭文件
#include 《tsk.h》
#include 《sem.h》
#include 《gio.h》
#include 《csl_dat.h》
#include 《csl_cache.h》//使用CSL庫,要用到的一些頭文件,可參考CSL
#include 《fvid.h》//視頻驅動頭文件
#include 《edc.h》
#include 《vport.h》
#include 《vportcap.h》
#include 《vportdis.h》
#include 《saa7105.h》
#include 《saa7115.h》
#include 《evmdm642.h》//芯片頭文件
#include “colorbar.h”//如果顯示彩色滾動條,就必須有此頭文件;否則不需要
#include “evmdm642_vcapparams.h”
#include “evmdm642_vdisparams.h”
/* heap IDs defined in the BIOS configuration file */
extern Int EXTERNALHEAP;//??DSP/BIOS?????¨??
/*
* ======== main ========
*/
main()
{
/******************************************************/
/* open CSL DAT module for fast copy */
/******************************************************/
CSL_init(); //調用任何CSL庫中的函數,必須先在此調用函數
CACHE_clean(CACHE_L2ALL, 0, 0); //清洗Cache模式
CACHE_setL2Mode(CACHE_256KCACHE); //設置Cache模式
CACHE_enableCaching(CACHE_EMIFA_CE00); //使能EMIFA CE0空間
CACHE_enableCaching(CACHE_EMIFA_CE01); //使能EMIFA CE1空間
DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D); //打開數據傳輸
}
/*
* ======== tskVideoLoopback ========
* video loopback function.
*/
void tskVideoLoopback()
{
Int i;
int m_nWork;
Int status;
FVID_Handle disChan; //設置設備句柄
Int frames = 0;
FVID_Frame *disFrameBuf;
Int numLinesDis = EVMDM642_vDisParamsChan.imgVSizeFld1;
//設置顯示的行數,VGA為480,PAL為576
Int numLinesCap =EVMDM642_vCapParamsChan.fldYStop1 - //設置采集行數
EVMDM642_vCapParamsChan.fldYStrt1+1;
/*判斷是顯示區域大,還是采集區域大,取其小者*/
Int numLines = (numLinesDis 》 numLinesCap) ? numLinesCap : numLinesDis;
#ifdef _LOOPBACK
FVID_Handle capChan;
/*設置每行顯示的像素數,PAL制為720*/
Int numPixels = EVMDM642_vCapParamsChan.fldXStop1 -
EVMDM642_vCapParamsChan.fldXStrt1+1;
FVID_Frame *capFrameBuf;
/*設置采集圖像一行的總像素*/
Int capLinePitch = EVMDM642_vCapParamsChan.fldXStop1 -
EVMDM642_vCapParamsChan.fldXStrt1+1;
/*設置顯示圖像一行的總像素*/
Int disLinePitch = EVMDM642_vDisParamsChan.imgHSizeFld1;
#ifdef _PIP
VPORTCAP_Params EVMDM642_vCapParamsChan2 = EVMDM642_vCapParamsChan;
FVID_Handle capChan2;
FVID_Frame *capFrameBuf2;
Int yPitch = capLinePitch 》》 1;
Int cPitch = ((capLinePitch 》》 2) + 7) & (~ 7);
#endif
#endif
numLines *= 2; /* both fields */如果輸出為PAL制,前面numLinesCap不要*2,這里再*2?
/******************************************************/
/* allocate both capture and display frame buffers */
/* in external heap memory */
/******************************************************/
/*分配采集和顯示圖像的存放緩沖區*/
EVMDM642_vCapParamsChan.segId = EXTERNALHEAP;
EVMDM642_vDisParamsChan.segId = EXTERNALHEAP;
EVMDM642_vDisParamsSAA7105.hI2C = EVMDM642_I2C_hI2C;
EVMDM642_vCapParamsSAA7115.hI2C = EVMDM642_I2C_hI2C;
/******************************************************/
/* initialization of capture driver */
/******************************************************/
/*建立并初始化采集設備對象*/
#ifdef _LOOPBACK
capChan = FVID_create(“/VP0CAPTURE/A/0”,
IOM_INPUT, &status, (Ptr)&EVMDM642_vCapParamsChan, NULL);
#ifdef _PIP
EVMDM642_vCapParamsChan2.scale = VPORT_SCALING_ENABLE;
EVMDM642_vCapParamsChan2.fldOp = VPORT_FLDOP_FLD1;
EVMDM642_vCapParamsChan2.thrld 》》=1;
capChan2 = FVID_create(“/VP1CAPTURE/A/1”,
IOM_INPUT, &status, (Ptr)&EVMDM642_vCapParamsChan2, NULL);
#endif
#endif
/******************************************************/
/* initialization of display driver */
/******************************************************/
/*建立并初始化顯示設備對象*/
disChan = FVID_create(“/VP2DISPLAY”, IOM_OUTPUT,
&status, (Ptr)&EVMDM642_vDisParamsChan, NULL);
/******************************************************/
/* configure video encoder & decoder */
/******************************************************/
for ( m_nWork=0;m_nWork《6;m_nWork++ )//這里的循環有何用???一直沒有弄清楚
{
/*為保證采集和顯示設備正常工作,為其設置驅動*/
FVID_control(disChan, VPORT_CMD_EDC_BASE + EDC_CONFIG,
(Ptr)&EVMDM642_vDisParamsSAA7105);
#ifdef _LOOPBACK
FVID_control(capChan, VPORT_CMD_EDC_BASE + EDC_CONFIG,
(Ptr)&EVMDM642_vCapParamsSAA7115);
#ifdef _PIP
EVMDM642_vCapParamsSAA7115.aFmt = SAA7115_AFMT_COMPOSITE;
FVID_control(capChan2, VPORT_CMD_EDC_BASE+EDC_CONFIG,
(Ptr)&EVMDM642_vCapParamsSAA7115);
#endif
#endif
}
/******************************************************/
/* start capture & display operation */
/******************************************************/
/*開始采集和顯示操作*/
FVID_control(disChan, VPORT_CMD_START, NULL);
#ifdef _LOOPBACK
FVID_control(capChan, VPORT_CMD_START, NULL);
#ifdef _PIP
FVID_control(capChan2, VPORT_CMD_START, NULL);
#endif
#endif
/********************************************************/
/* request a frame buffer from display & capture driver */
/********************************************************/
/*分配采集和顯示一幀圖像存放的緩沖區*/
FVID_alloc(disChan, &disFrameBuf);
#ifdef _LOOPBACK
FVID_alloc(capChan, &capFrameBuf);
#ifdef _PIP
FVID_alloc(capChan2, &capFrameBuf2);
#endif
#endif
frames ++;
while(1){/* loop forever */
#ifdef _LOOPBACK
/* copy data from capture buffer to display buffer */
/***************************************************/
/*將采集緩沖區的內容復制到顯示緩沖區*/
for(i = 0; i 《 numLines; i ++) {
DAT_copy(capFrameBuf-》frame.iFrm.y1 + i * capLinePitch,
disFrameBuf-》frame.iFrm.y1 + i * disLinePitch,
numPixels);
DAT_copy(capFrameBuf-》frame.iFrm.cb1 + i * (capLinePitch 》》 1),
disFrameBuf-》frame.iFrm.cb1 + i * (disLinePitch 》》 1),
numPixels》》1);
DAT_copy(capFrameBuf-》frame.iFrm.cr1 + i * (capLinePitch 》》 1),
disFrameBuf-》frame.iFrm.cr1 + i * (disLinePitch 》》 1),
numPixels》》1);
}
#ifdef _PIP
for(i = 0; i 《 (numLines》》1); i ++) {
DAT_copy(capFrameBuf2-》frame.iFrm.y1 + i * yPitch,
disFrameBuf-》frame.iFrm.y1 + i * disLinePitch
+ (disLinePitch 》》 1),
(numPixels》》1));
DAT_copy(capFrameBuf2-》frame.iFrm.cb1 + i * cPitch,
disFrameBuf-》frame.iFrm.cb1 + i * (disLinePitch 》》 1)
+ (disLinePitch 》》2 ),
(numPixels 》》 2));
DAT_copy(capFrameBuf2-》frame.iFrm.cr1 + i * cPitch,
disFrameBuf-》frame.iFrm.cr1 + i * (disLinePitch 》》 1)
+(disLinePitch 》》 2),
(numPixels 》》 2));
}
#endif
DAT_wait(DAT_XFRID_WAITALL);
FVID_exchange(capChan, &capFrameBuf);//采集一幀圖像
#ifdef _PIP
FVID_exchange(capChan2, &capFrameBuf2);
#endif
#else //如果定義CAPTURE則填充圖像緩沖區為8條帶
fillFrmBuf(&disFrameBuf-》frame.iFrm, EVMDM642_vDisParamsChan.imgHSizeFld1,
EVMDM642_vDisParamsChan.imgVSizeFld1
+ EVMDM642_vDisParamsChan.imgVSizeFld2,
frames % 360);
#endif
FVID_exchange(disChan, &disFrameBuf);//將顯示緩沖區中一幀圖像送給顯示設備
frames ++; //處理下一幀圖像
}
}
實驗5.20 視頻圖像處理-取反
1.將程序改成屏幕1/4進行取反,而其他不變
在主程序中ICETEKDM642PCIImageProcessReverse()函數前加if(i《(numLines/2)),即:
if(i《(numLines/2))
ICETEKDM642PCIImageProcessReverse();
并將ICETEKDM642PCIImageProcessReverse()函數中的循環體改為如下:
for ( i=0;i《720/2;i++ )
nMemTemp[i]=~nMemTemp[i];
2.例程中處理了亮度信號,以下是處理色差信號:
for ( i = 0; i 《 numLines; i ++ )
{
m_nID=DAT_copy(capFrameBuf-》frame.iFrm.cb1+i*(capLinePitch》》1),nMemTemp,numPixels》》1);
DAT_wait(m_nID);
ICETEKDM642PCIImageProcessReverse();
DAT_copy(nMemTemp,disFrameBuf-》frame.iFrm.cb1+i*(disLinePitch》》1),numPixels》》1);
for ( m_nWork=0;m_nWork《numPixels》》1;m_nWork++ )
nMemTemp[m_nWork]=0x080;
DAT_copy(nMemTemp,disFrameBuf-》frame.iFrm.y1+i*disLinePitch,numPixels); DAT_copy(nMemTemp,disFrameBuf-》frame.iFrm.cr1+i*(disLinePitch》》1),numPixels》》1);
}
出現的問題:圖像顯示時右半屏有閃爍???~~~
實驗5.21 視頻圖像處理-直方圖統計
程序注釋:源程序中定義的js變量不知為何用,于是就刪除了~~~
#include “ICETEK-DM642-PCI.h”
//工作變量
#pragma DATA_SECTION(nMemTemp, “.INTPROCBUFF”);
#pragma DATA_ALIGN(nMemTemp,128);
unsigned char nMemTemp[720];
#pragma DATA_SECTION(nHisto, “.INTPROCBUFF”);
#pragma DATA_ALIGN(nHisto,128);
unsigned int nHisto[256];
unsigned char imgHisto[HISTOHIGH*HISTOWIDTH];//128*256
int mi,mj,m_nWork1;
unsigned int m_nWork,*pWork;
unsigned char *pImg,*pImg1;
void ICETEKDM642PCIBoardInit()//直方圖顯示區域初始化
{
for ( mi=0;mi《HISTOHIGH*HISTOWIDTH;mi++ )
imgHisto[mi]=1;
for ( mi=0;mi《256;mi++ )
nHisto[mi]=0;
}
#pragma CODE_SECTION(ICETEKDM642PCIStatistic,“.text1”)
void ICETEKDM642PCIStatistic()//統計一幀圖像的直方圖
{
int i;
for ( i=0;i《720;i++ )
{
nHisto[nMemTemp[i]]++;
}
}
#pragma CODE_SECTION(ICETEKDM642PCIHistogram,“.text1”)
void ICETEKDM642PCIHistogram()//將統計的一幀圖像的直方圖顯示在顯示區域上
{
m_nWork=0;
for ( mi=0;mi《256;mi++ )//找出各灰度級別像素總數最大的
if ( m_nWork《nHisto[mi] )
m_nWork=nHisto[mi];
m_nWork/=(HISTOHIGH-1);//求出比例因子(即像素總數最大值/顯示區域的高度)
for ( mi=0;mi《256;mi++ )//轉換各灰度級,將其映射到顯示區域(即:各個灰度級的像素/比例因子)
{
nHisto[mi]/=m_nWork;
}
for ( mi=0;mi《HISTOHIGH*HISTOWIDTH;mi++ )//將顯示區域置白
imgHisto[mi]=1;
pImg = imgHisto; //pImg指針指向顯示區域首地址
pImg += ((HISTOHIGH-1)*HISTOWIDTH); //mImg指針指向顯示區域尾地址
pImg++;//???
for ( mi=1;mi《255;mi++,pImg++ )
{
for ( mj=0,pImg1=pImg;mj《nHisto[mi];mj++,pImg1-=HISTOWIDTH )
(*pImg1)=HISTOCOLOR;//對應的顯示區域填充顏色,這里還是不太明白
}
for ( mi=0;mi《256;mi++ ) //清除直方圖統計的數組
nHisto[mi]=0;
}
實驗5.22 視頻圖像處理-直方圖均衡化增強
程序注釋:直方圖均衡化,其實質是圖像增強的一種。
#include “math.h”
#include “ICETEK-DM642-PCI.h”
//工作變量
#pragma DATA_SECTION(nMemTemp, “.INTPROCBUFF”);
#pragma DATA_ALIGN(nMemTemp,128);
unsigned char nMemTemp[720];
#pragma DATA_SECTION(fHisto, “.INTPROCBUFF”);
#pragma DATA_ALIGN(fHisto,128);
float fHisto[256];//
#pragma DATA_SECTION(lut, “.INTPROCBUFF”);
#pragma DATA_ALIGN(lut,128);
unsigned char lut[256];//保存新的灰度級,是通過上一幀圖像計算的
int mi,mj,m_nWork1;
unsigned int m_nWork,*pWork,js;
unsigned char *pImg,*pImg1;
float m_fWork;
void ICETEKDM642PCIBoardInit()
{
js=0;
for ( mi=0;mi《256;mi++ )
{
fHisto[mi]=0.0f;
lut[mi]=0;
}
}
#pragma CODE_SECTION(ICETEKDM642PCIStatistic,“.text1”)
void ICETEKDM642PCIStatistic()
{
int i;
for ( i=0;i《720;i++ )
{
fHisto[nMemTemp[i]]++;//統計灰度直方圖
nMemTemp[i]=lut[nMemTemp[i]];//新的灰度級映射(通過上一幀圖像計算出的新灰度級,處理這一幀圖像)
}
}
#pragma CODE_SECTION(ICETEKDM642PCIHistogramEnhance,“.text1”)
void ICETEKDM642PCIHistogramEnhance()//
{
m_fWork=720*576; fHisto[0]/=m_fWork;
for ( mi=1;mi《256;mi++ )//灰度直方圖頻率
{
fHisto[mi]/=m_fWork;
fHisto[mi]+=fHisto[mi-1];
}
for ( mi=0;mi《256;mi++ )//計算新的灰度級
{
m_fWork=fHisto[mi];
m_fWork*=255;
lut[mi]=(unsigned char)m_fWork;//這就是新的灰度級
}
for ( mi=0;mi《256;mi++ )//灰度直方圖數組清0
fHisto[mi]=0.0f;
}
實驗5.23 視頻圖像處理-中值濾波
中值濾波算法實質是一種圖像噪聲的抑制。該系統實現中值濾波算法速度極慢。
實驗5.24 視頻圖像處理-邊緣檢測(Sobel算子)
Sobel算子實質是圖像的銳化處理,主要目的是突出圖像中的細節或者增強被模糊了的細節。
但是對這個算法程序實現不是很明白。
for ( mi=0;mi《MWIDTH;mi++,pImg1++,pImg2++,pImg3++ )
{
x3=(*pImg1); x6=(*pImg2); x9=(*pImg3);
m_nWork1=x7+x8+x8-x2-x2-x3;
m_nWork2=x3+x6+x6-x4-x4-x7;
if ( m_nWork1《m_nWork2 )////對這個算法的程序實現不是很明白
m_nWork1=m_nWork2;
m_nWork2=m_nWork1+x9-x1;
if ( m_nWork2》255 ) m_nWork2=255;
else if ( m_nWork2《0 ) m_nWork2=0;
nMemTemp[mi+180]=m_nWork2;
x1=x2; x2=x3;
x4=x5; x5=x6;
x7=x8; x8=x9;
}
實驗5.25 視頻圖像處理-傅立葉變換
對傅立葉變換的知識比較空白。壓根沒看懂~~~
實驗5.26 視頻圖像處理-色彩空間變換
程序注釋:
void ICETEKDM642PCIYUVRGB()
{
int i,j;
int r,g,b,y,u,v;
unsigned char *py,*pu,*pv,*pr,*pg,*pb;
py=m_dbFrameY; pu=m_dbFrameU; pv=m_dbFrameV;
pr=m_dbTargetImageR; pg=m_dbTargetImageG; pb=m_dbTargetImageB;
for ( i=0;i《SIMGHEIGHT;i++ )
{
for ( j=0;j《SIMGWIDTH;j+=2 ) ////列720點,360個32bit,
{
u=(*pu); v=(*pv); y=(*py);
u-=128; v-=128;
r=y+1.402*u;
g=y-0.34414*u-0.71414*v;
b=y+1.772*v;
if ( r》255 ) r=255;
else if ( r《0 ) r=0;
if ( g》255 ) g=255;
else if ( g《0 ) g=0;
if ( b》255 ) b=255;
else if ( b《0 ) b=0;
(*pr)=r; pr++;
(*pg)=g; pg++;
(*pb)=b; pb++;
py++; y=(*py);
r=y+1.402*u;
g=y-0.34414*u-0.71414*v;
b=y+1.772*v;
if ( r》255 ) r=255;
else if ( r《0 ) r=0;
if ( g》255 ) g=255;
else if ( g《0 ) g=0;
if ( b》255 ) b=255;
else if ( b《0 ) b=0;
(*pr)=r; pr++;
(*pg)=g; pg++;
(*pb)=b; pb++;
py++; pu++; pv++;
}
}
}
////在計算機中,用RGB方式描述一個像素需要R、G、B共3個字節。而用YUV方式描述,則對于每2個像素,Y用2個字節,U取相同的值,用一個字節,V取相同的值,
////用一個字節,平均每個像素2個字節。理解了這一點,對于上面的程序就理解了~~~
基于TMS320DM642嵌入式圖像識別方案實現車流量檢測系統的設計
現有的傳統視頻檢測方法基于工控機,其算法成熟,且已形成相關產品。但其也有缺點:一是由于通用CPU沒有專用的硬件乘法器,故很難實現圖像的時實性處理。二是采...
編輯推薦廠商產品技術軟件/工具OS/語言教程專題
電機控制 | DSP | 氮化鎵 | 功率放大器 | ChatGPT | 自動駕駛 | TI | 瑞薩電子 |
BLDC | PLC | 碳化硅 | 二極管 | OpenAI | 元宇宙 | 安森美 | ADI |
無刷電機 | FOC | IGBT | 逆變器 | 文心一言 | 5G | 英飛凌 | 羅姆 |
直流電機 | PID | MOSFET | 傳感器 | 人工智能 | 物聯網 | NXP | 賽靈思 |
步進電機 | SPWM | 充電樁 | IPM | 機器視覺 | 無人機 | 三菱電機 | ST |
伺服電機 | SVPWM | 光伏發電 | UPS | AR | 智能電網 | 國民技術 | Microchip |
開關電源 | 步進電機 | 無線充電 | LabVIEW | EMC | PLC | OLED | 單片機 |
5G | m2m | DSP | MCU | ASIC | CPU | ROM | DRAM |
NB-IoT | LoRa | Zigbee | NFC | 藍牙 | RFID | Wi-Fi | SIGFOX |
Type-C | USB | 以太網 | 仿真器 | RISC | RAM | 寄存器 | GPU |
語音識別 | 萬用表 | CPLD | 耦合 | 電路仿真 | 電容濾波 | 保護電路 | 看門狗 |
CAN | CSI | DSI | DVI | Ethernet | HDMI | I2C | RS-485 |
SDI | nas | DMA | HomeKit | 閾值電壓 | UART | 機器學習 | TensorFlow |
Arduino | BeagleBone | 樹莓派 | STM32 | MSP430 | EFM32 | ARM mbed | EDA |
示波器 | LPC | imx8 | PSoC | Altium Designer | Allegro | Mentor | Pads |
OrCAD | Cadence | AutoCAD | 華秋DFM | Keil | MATLAB | MPLAB | Quartus |
C++ | Java | Python | JavaScript | node.js | RISC-V | verilog | Tensorflow |
Android | iOS | linux | RTOS | FreeRTOS | LiteOS | RT-THread | uCOS |
DuerOS | Brillo | Windows11 | HarmonyOS |