設(shè)計(jì)按鍵 FIFO 主要有三個(gè)方面的好處:
1.可以有效的記錄按鍵事件的發(fā)生,特別是需要實(shí)現(xiàn)按鍵的按下,長(zhǎng)按,彈起等事件,使用 FIFO的方式來(lái)實(shí)現(xiàn)是一種非常好的思路。
2.系統(tǒng)是非阻塞的,這樣系統(tǒng)在檢測(cè)到按鍵按下的情況下,由于機(jī)械按鍵抖動(dòng)的原因不需要在這里等待一段時(shí)間,然后再確定按鍵是否按下。
3.按鍵 FIFO 程序在嘀嗒定時(shí)器中定期的執(zhí)行檢測(cè),不需要在主程序中一直做檢測(cè),這樣可以有效的降低系統(tǒng)資源消耗。
關(guān)于按鍵是否該使用中斷方式去實(shí)現(xiàn)的問(wèn)題,很多初學(xué)者都比較模糊,我這里從兩方面簡(jiǎn)單說(shuō)一下,純屬個(gè)人見(jiàn)解,如果那位有更好的意見(jiàn),歡迎提出來(lái)。
從裸機(jī)的角度分析
中斷方式:中斷方式可以有效的檢測(cè)到按鍵按下的消息,并執(zhí)行相應(yīng)的程序,但是用中斷方式實(shí)現(xiàn)按鍵 FIFO 相對(duì)就有點(diǎn)麻煩,如果每個(gè)按鍵都是獨(dú)立的接一個(gè) IO 引腳,需要我們給每個(gè) IO都設(shè)置一個(gè)中斷,程序中過(guò)多的中斷會(huì)影響系統(tǒng)的穩(wěn)定性。
查詢方式:查詢方式有一個(gè)最大的缺點(diǎn)就是需要程序定期的去執(zhí)行查詢,耗費(fèi)一定的系統(tǒng)資源,實(shí)際上耗費(fèi)不了多大的系統(tǒng)資源,因?yàn)檫@種查詢方式也只是查詢按鍵是否按下,按鍵事件的執(zhí)行還是在主程序里面實(shí)現(xiàn)。
從 OS 的角度分析
中斷方式:在 OS 中要盡可能少用中斷方式,因?yàn)樵?RTOS 中過(guò)多的使用中斷會(huì)影響系統(tǒng)的穩(wěn)定性和可預(yù)見(jiàn)性(搶占式調(diào)度的 OS 基本沒(méi)有可預(yù)見(jiàn)性,基于時(shí)間觸發(fā)調(diào)度的可預(yù)見(jiàn)性要好很多)。比較重要的事件處理需要用中斷的方式。
查詢方式:對(duì)于用戶按鍵推薦使用這種查詢方式來(lái)實(shí)現(xiàn),現(xiàn)在的 OS 基本都帶有 CPU 利用率的功能,這個(gè)按鍵 FIFO 占用的還是很小的,基本都在%1 以下。
這個(gè)按鍵 FIFO 程序主要用于掃描掃描獨(dú)立按鍵,具有軟件濾波機(jī)制,具有按鍵 FIFO。可以檢測(cè)如下事件:
1. 按鍵按下
2. 按鍵彈起
3. 長(zhǎng)按鍵
4. 長(zhǎng)按時(shí)自動(dòng)連發(fā)
聲明代碼如下:
/**
******************************************************************************
* @file : bsp_key.h
* @author : xiaofeng
* @version : V1.0
* @date : 2015.05.21
* @brief : STM32F4 KEY FIFO
******************************************************************************
* @attention:
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_KEY_H__
#define __BSP_KEY_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h"
/* Exported types ------------------------------------------------------------*/
// 按鍵ID
typedef enum
{
KID_K1 = 0,
KID_K2,
KID_K3,
KID_K4
}KEY_ID_E;
/*
定義鍵值代碼, 必須按如下次序定時(shí)每個(gè)鍵的按下、彈起和長(zhǎng)按事件
推薦使用enum, 不用#define,原因:
(1) 便于新增鍵值,方便調(diào)整順序,使代碼看起來(lái)舒服點(diǎn)
(2) 編譯器可幫我們避免鍵值重復(fù)。
*/
typedef enum
{
KEY_NONE = 0, /* 0 表示按鍵事件 */
KEY1_DOWN, /* 1鍵按下 */
KEY1_UP, /* 1鍵彈起 */
KEY1_LONG, /* 1鍵長(zhǎng)按 */
KEY2_DOWN, /* 2鍵按下 */
KEY2_UP, /* 2鍵彈起 */
KEY2_LONG, /* 2鍵長(zhǎng)按 */
}KEY_ENUM;
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
#define KEY_COUNT 2 // 按鍵個(gè)數(shù)
#define KEY_FIFO_SIZE 10 // 按鍵FIFO大小
#define KEY_FILTER_TIME 5 // 按鍵濾波時(shí)間50ms, 只有連續(xù)檢測(cè)到50ms狀態(tài)不變才認(rèn)為有效,包括彈起和按下兩種事件
#define KEY_LONG_TIME 0 // 長(zhǎng)按時(shí)間. 0,表示不檢測(cè)長(zhǎng)按鍵; 其他,檢測(cè)長(zhǎng)按鍵的時(shí)間
#define KEY_REPEAT_SPEED 0 // 長(zhǎng)按鍵連發(fā)速度. 0,表示不支持連發(fā),上報(bào)長(zhǎng)按事件;其他,連發(fā)按下
// 按鍵口對(duì)應(yīng)的RCC時(shí)鐘及引腳
#define RCC_ALL_KEY (RCC_AHB1Periph_GPIOA )
#define GPIO_PORT_K1 GPIOA
#define GPIO_PIN_K1 GPIO_Pin_0
#define GPIO_PORT_K2 GPIOD
#define GPIO_PIN_K2 GPIO_Pin_1
/* Exported functions --------------------------------------------------------*/
void KEY_Init(void);
void KEY_Scan(void);
void KEY_FIFO_Clear(void);
uint8_t KEY_FIFO_Get(void);
uint8_t KEY_GetState(KEY_ID_E ucKeyID);
void KEY_SetParam(uint8_t ucKeyID, uint16_t LongTime, uint8_t RepeatSpeed);
#ifdef __cplusplus
}
#endif
#endif
/*****END OF FILE****/
實(shí)現(xiàn)代碼如下:
/**
******************************************************************************
* @file : bsp_key.h
* @author : xiaofeng
* @version : V1.0
* @date : 2015.05.21
* @brief : STM32F4 KEY FIFO
******************************************************************************
* @attention:
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "bsp_key.h"
/* Private typedef -----------------------------------------------------------*/
// 每個(gè)按鍵對(duì)應(yīng)1個(gè)全局的結(jié)構(gòu)體變量。
typedef struct
{
/* 下面是一個(gè)函數(shù)指針,指向判斷按鍵手否按下的函數(shù) */
uint8_t (*IsKeyDownFunc)(void); /* 按鍵按下的判斷函數(shù),1表示按下 */
uint8_t Count; /* 濾波器計(jì)數(shù)器 */
uint8_t State; /* 按鍵當(dāng)前狀態(tài)(按下還是彈起) */
uint16_t LongCount; /* 長(zhǎng)按計(jì)數(shù)器 */
uint16_t LongTime; /* 按鍵按下持續(xù)時(shí)間, 0表示不檢測(cè)長(zhǎng)按 */
uint8_t RepeatSpeed; /* 連續(xù)按鍵周期 */
uint8_t RepeatCount; /* 連續(xù)按鍵計(jì)數(shù)器 */
}KEY_T;
// 按鍵FIFO用到變量
typedef struct
{
uint8_t Buf[KEY_FIFO_SIZE]; /* 鍵值緩沖區(qū) */
uint8_t Read; /* 緩沖區(qū)讀指針 */
uint8_t Write; /* 緩沖區(qū)寫(xiě)指針 */
}KEY_FIFO_T;
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static KEY_T s_tBtn[KEY_COUNT];
static KEY_FIFO_T s_tKey; /* 按鍵FIFO變量,結(jié)構(gòu)體 */
/* Private function prototypes -----------------------------------------------*/
static void KEY_FIFO_Init(void);
static void KEY_GPIO_Config(void);
static void KEY_FIFO_Put(uint8_t _KeyCode);
static void KEY_Detect(uint8_t i);
/* Private functions ---------------------------------------------------------*/
/**
* @brief : KEY初始化
* @note :
* @param :
* @retval :
*/
void KEY_Init(void)
{
KEY_GPIO_Config();
KEY_FIFO_Init();
}
/**
* @brief : 清空按鍵FIFO緩沖區(qū)
* @note : 無(wú)
* @param : 無(wú)
* @retval : 無(wú)
*/
void KEY_FIFO_Clear(void)
{
s_tKey.Read = s_tKey.Write;
}
/**
* @brief : 從按鍵FIFO緩沖區(qū)讀取一個(gè)鍵值
* @note : 無(wú)
* @param :
* @retval : 按鍵代碼
*/
uint8_t KEY_FIFO_Get(void)
{
uint8_t ret;
if (s_tKey.Read == s_tKey.Write)
{
return KEY_NONE;
}
else
{
ret = s_tKey.Buf[s_tKey.Read];
if (++s_tKey.Read >= KEY_FIFO_SIZE)
{
s_tKey.Read = 0;
}
return ret;
}
}
/**
* @brief : 讀取按鍵的狀態(tài)
* @note : 無(wú)
* @param : ucKeyID : 按鍵ID,從0開(kāi)始
* @retval : 1 表示按下, 0 表示未按下
*/
uint8_t KEY_GetState(KEY_ID_E ucKeyID)
{
return s_tBtn[ucKeyID].State;
}
/**
* @brief : 設(shè)置按鍵參數(shù)
* @note : 無(wú)
* @param : ucKeyID : 按鍵ID,從0開(kāi)始
* LongTime : 長(zhǎng)按事件時(shí)間
* RepeatSpeed : 連發(fā)速度
* @retval : 無(wú)
*/
void KEY_SetParam(uint8_t ucKeyID, uint16_t LongTime, uint8_t RepeatSpeed)
{
s_tBtn[ucKeyID].LongTime = LongTime; /* 長(zhǎng)按時(shí)間 0 表示不檢測(cè)長(zhǎng)按鍵事件 */
s_tBtn[ucKeyID].RepeatSpeed = RepeatSpeed; /* 長(zhǎng)按鍵連發(fā)的速度,0表示不支持連發(fā) */
s_tBtn[ucKeyID].RepeatCount = 0; /* 連發(fā)計(jì)數(shù)器 */
}
/**
* @brief : 掃描所有按鍵。非阻塞,被周期性的調(diào)用(如systick中斷)
* @note : 無(wú)
* @param : 無(wú)
* @retval : 無(wú)
*/
void KEY_Scan(void)
{
uint8_t i;
for (i = 0; i < KEY_COUNT; i++)
{
KEY_Detect(i);
}
}
/***************************************************************************/
/**
* @brief : 配置按鍵對(duì)應(yīng)的GPIO
* @note : 無(wú)
* @param : 無(wú)
* @retval : 無(wú)
*/
static void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 第1步:打開(kāi)GPIO時(shí)鐘 */
RCC_AHB1PeriphClockCmd(RCC_ALL_KEY, ENABLE);
/* 第2步:配置所有的按鍵GPIO為浮動(dòng)輸入模式(實(shí)際上CPU復(fù)位后就是輸入狀態(tài)) */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; /* 設(shè)為輸入口 */
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /* 設(shè)為推挽模式 */
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; /* 無(wú)需上下拉電阻 */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* IO口最大速度 */
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_K1;
GPIO_Init(GPIO_PORT_K1, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_K2;
GPIO_Init(GPIO_PORT_K2, &GPIO_InitStructure);
}
/**
* @brief : 判斷按鍵是否按下
* @note : 無(wú)
* @param : 無(wú)
* @retval : 1 表示按下,0表示未按下
*/
static uint8_t IsKey1Down(void) {if (GPIO_ReadInputDataBit(GPIO_PORT_K1, GPIO_PIN_K1) == 0) return 1;else return 0;}
static uint8_t IsKey2Down(void) {if (GPIO_ReadInputDataBit(GPIO_PORT_K2, GPIO_PIN_K2) == 0) return 1;else return 0;}
/**
* @brief : 初始化按鍵變量
* @note : 無(wú)
* @param : 無(wú)
* @retval : 無(wú)
*/
static void KEY_FIFO_Init(void)
{
uint8_t i;
/* 對(duì)按鍵FIFO讀寫(xiě)指針清零 */
s_tKey.Read = 0;
s_tKey.Write = 0;
/* 給每個(gè)按鍵結(jié)構(gòu)體成員變量賦一組缺省值 */
for (i = 0; i < KEY_COUNT; i++)
{
s_tBtn[i].LongTime = KEY_LONG_TIME; /* 長(zhǎng)按時(shí)間 0 表示不檢測(cè)長(zhǎng)按鍵事件 */
s_tBtn[i].Count = KEY_FILTER_TIME / 2; /* 計(jì)數(shù)器設(shè)置為濾波時(shí)間的一半 */
s_tBtn[i].State = 0; /* 按鍵缺省狀態(tài),0為未按下 */
s_tBtn[i].RepeatSpeed = KEY_REPEAT_SPEED; /* 按鍵連發(fā)的速度,0表示不支持連發(fā) */
s_tBtn[i].RepeatCount = 0; /* 連發(fā)計(jì)數(shù)器 */
}
/* 判斷按鍵按下的函數(shù) */
s_tBtn[0].IsKeyDownFunc = IsKey1Down;
s_tBtn[1].IsKeyDownFunc = IsKey2Down;
}
/**
* @brief : 將1個(gè)鍵值壓入按鍵FIFO緩沖區(qū)
* @note : 無(wú)
* @param : KeyCode : 按鍵代碼
* @retval : 無(wú)
*/
static void KEY_FIFO_Put(uint8_t _KeyCode)
{
s_tKey.Buf[s_tKey.Write] = _KeyCode;
if (++s_tKey.Write >= KEY_FIFO_SIZE)
{
s_tKey.Write = 0;
}
}
/**
* @brief : 檢測(cè)一個(gè)按鍵。非阻塞狀態(tài),必須被周期性的調(diào)用
* @note : 無(wú)
* @param : 按鍵數(shù)
* @retval : 無(wú)
*/
static void KEY_Detect(uint8_t i)
{
KEY_T *pBtn;
pBtn = &s_tBtn[i];
if (pBtn->IsKeyDownFunc())
{// 按鍵按下
if (pBtn->Count < KEY_FILTER_TIME)
{
pBtn->Count = KEY_FILTER_TIME;
}
else if(pBtn->Count < 2 * KEY_FILTER_TIME)
{
pBtn->Count++;
}
else
{
if (pBtn->State == 0)
{
pBtn->State = 1;
/* 發(fā)送按鈕按下的消息 */
KEY_FIFO_Put((uint8_t)(3 * i + 1));
}
if (pBtn->LongTime > 0)
{
if (pBtn->LongCount < pBtn->LongTime)
{
/* 發(fā)送按鈕持續(xù)按下的消息 */
if (++pBtn->LongCount == pBtn->LongTime)
{
if (pBtn->RepeatSpeed > 0)
{
pBtn->LongCount = 0;
if (++pBtn->RepeatCount >= pBtn->RepeatSpeed)
{
pBtn->RepeatCount = 0;
/* 常按鍵后,每隔10ms發(fā)送1個(gè)按鍵 */
KEY_FIFO_Put((uint8_t)(3 * i + 1));
}
}
else
{
/* 鍵值放入按鍵FIFO */
KEY_FIFO_Put((uint8_t)(3 * i + 3));
}
}
}
}
}
}
else
{// 按鍵抬起
if(pBtn->Count > KEY_FILTER_TIME)
{
pBtn->Count = KEY_FILTER_TIME;
}
else if(pBtn->Count != 0)
{
pBtn->Count--;
}
else
{
if (pBtn->State == 1)
{
pBtn->State = 0;
/* 發(fā)送按鈕彈起的消息 */
KEY_FIFO_Put((uint8_t)(3 * i + 2));
}
}
pBtn->LongCount = 0;
pBtn->RepeatCount = 0;
}
}
/*****END OF FILE****/
上一篇:STM32內(nèi)存使用及分配
下一篇:KeilMDK配置項(xiàng)中Use MicroLIB是干什么的
推薦閱讀
史海拾趣
在60年代,Bergquist Company作為一家私人擁有的美國(guó)公司,在明尼蘇達(dá)州的一個(gè)小城市誕生。創(chuàng)立初期,公司面臨著資金短缺、市場(chǎng)競(jìng)爭(zhēng)激烈等諸多困難。然而,創(chuàng)始人憑借著對(duì)導(dǎo)熱材料行業(yè)的深刻洞察和堅(jiān)定信念,帶領(lǐng)公司一步步走過(guò)了創(chuàng)業(yè)初期的艱難歲月。他們不斷研發(fā)新產(chǎn)品,提升產(chǎn)品質(zhì)量,逐漸在市場(chǎng)上獲得了一席之地。
百蓉公司不滿足于僅在國(guó)內(nèi)市場(chǎng)發(fā)展,開(kāi)始積極拓展國(guó)際市場(chǎng)。他們參加了多個(gè)國(guó)際電子展覽,與多家國(guó)際知名企業(yè)建立了合作關(guān)系。通過(guò)深入了解不同國(guó)家和地區(qū)的市場(chǎng)需求,百蓉針對(duì)性地推出了符合當(dāng)?shù)叵M(fèi)者需求的產(chǎn)品,逐漸在國(guó)際市場(chǎng)上占據(jù)了一席之地。
1974年,電子工程師Helmut Nolden先生在德國(guó)創(chuàng)立了EA Elektro-Automatik公司。初期,公司主要生產(chǎn)小型固定式和可調(diào)式電源,以滿足工業(yè)、實(shí)驗(yàn)室和業(yè)余愛(ài)好者的需求。這些產(chǎn)品憑借穩(wěn)定的性能和合理的價(jià)格,在市場(chǎng)上逐漸獲得了認(rèn)可。隨著技術(shù)團(tuán)隊(duì)能力的逐漸提高和持續(xù)創(chuàng)新,EA Elektro-Automatik開(kāi)始擴(kuò)大產(chǎn)品線,滿足更多客戶的特定需求。
隨著技術(shù)的不斷進(jìn)步,Cembre SPA不斷加大對(duì)研發(fā)的投入,推出了一系列創(chuàng)新產(chǎn)品。其中,公司的電纜接頭技術(shù)取得了重大突破,不僅提高了接頭的可靠性和安全性,還降低了安裝和維護(hù)的成本。這些技術(shù)創(chuàng)新使得Cembre SPA在市場(chǎng)中脫穎而出,成為行業(yè)的領(lǐng)導(dǎo)者。
引言 近年來(lái),人們?cè)絹?lái)越關(guān)注低電壓狀態(tài)下的集成電路,這主要是因?yàn)楸銛y式電子產(chǎn)品需要盡可能低的功耗,以延長(zhǎng)電池供電的時(shí)間,而放大器作為集成電路的一種重要的組成部分是國(guó)內(nèi)外研究的熱點(diǎn)。文獻(xiàn)[1~3]描述了低電壓狀態(tài)下電壓模式放大器的設(shè)計(jì), ...… 查看全部問(wèn)答∨ |
|
可以驅(qū)動(dòng)10個(gè)LED的背光驅(qū)動(dòng)芯片 目前在手機(jī),MP4等領(lǐng)域多數(shù)用到可以驅(qū)動(dòng)多個(gè)LED的芯片,現(xiàn)在本公司有一款主推產(chǎn)品可以驅(qū)動(dòng)10個(gè)LED的, 就是RT9293的,性價(jià)比各方面都比較有優(yōu)勢(shì)。可以提供資料,并備有大量原裝無(wú)鉛現(xiàn)貨。歡迎大家前來(lái)索取,(請(qǐng)來(lái)電或來(lái)郵件或取資料)張生,MAIL ...… 查看全部問(wèn)答∨ |
|
求助:為什么WINCE加載完NANDFLASH之后無(wú)法繼續(xù)啟動(dòng)? 我有兩塊板子,一塊是QQ2440的開(kāi)發(fā)板,一塊是自己做的開(kāi)發(fā)板,兩塊板子基本一樣,但是同樣的程序(WINCE5.0)在QQ2440里可以啟動(dòng)整個(gè)系統(tǒng),在我做的板子上啟動(dòng)時(shí)卻卡在了NANDFLASH之后,未能進(jìn)入電源管理模塊。有人說(shuō)可能是觸發(fā)了外部中斷EINT0使系 ...… 查看全部問(wèn)答∨ |
我編寫(xiě)的C51程序在編譯后提示說(shuō)DATA SEGMENT TOO LARGE,所以我就將部分變量改成idata型,而且將memory module改成large:variable XDATA,在編譯后就有提示說(shuō)error:incompitable memory model MODULE: .\\SJA1000_PELI.lib ...… 查看全部問(wèn)答∨ |
linux鍵盤(pán)及串口驅(qū)動(dòng)問(wèn)題,大家指教,謝謝了 目前要做一個(gè)事情,就是把以前的i2c的鍵盤(pán)驅(qū)動(dòng)改為串口的。 有個(gè)問(wèn)題: 串口驅(qū)動(dòng)中可供其他驅(qū)動(dòng)調(diào)用的讀寫(xiě)等接口函數(shù)在哪個(gè)地方? 小弟初學(xué),希望高手不吝賜教,可以再 ...… 查看全部問(wèn)答∨ |
|
求8051四位LED倒計(jì)時(shí)時(shí)鐘程序設(shè)計(jì) P2.4-P2.7位碼輸出口,P0段碼輸出口 采用反向驅(qū)動(dòng) 有圖及詳細(xì)解釋… 查看全部問(wèn)答∨ |
請(qǐng)教,我在調(diào)試時(shí)可以通過(guò)斷點(diǎn)及單步運(yùn)行在watch窗口看變量的值,怎么樣在全速運(yùn)行時(shí)查看變量的值啊?… 查看全部問(wèn)答∨ |
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計(jì)
- 小型傾轉(zhuǎn)旋翼機(jī)的無(wú)刷直流電機(jī)驅(qū)動(dòng)器設(shè)計(jì)
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計(jì)
- 基于GPS自動(dòng)授時(shí)的無(wú)線智能控制器的設(shè)計(jì)
- 基于PTR2000的無(wú)線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無(wú)人飛行器機(jī)載穩(wěn)定云臺(tái)控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時(shí)處理器M7000
- 通用汽車(chē)轉(zhuǎn)向LFP電池,LG新能源和三星SDI擬在美建廠
- 蓋世汽車(chē)研究院:政策助推疊加技術(shù)迭代 全固態(tài)電池蓄勢(shì)待發(fā)
- 小鵬汽車(chē)董事長(zhǎng)預(yù)測(cè):2027年激光雷達(dá)非智能駕駛必備
- 解碼大眾汽車(chē)中國(guó)戰(zhàn)略 - 決戰(zhàn)智能化電氣化的三板斧
- 2025從具身智能大腦展望人形機(jī)器人發(fā)展
- “荊楚”人形機(jī)器人即將量產(chǎn),智能時(shí)代的新篇章!
- 小鵬純視覺(jué)方案:技術(shù)突圍與市場(chǎng)下沉的雙重博弈
- 為什么無(wú)人出租車(chē)能“零”事故,而智能駕駛輔助卻事故頻發(fā)?
- 重磅!一顆要顛覆全球智駕的芯片點(diǎn)亮了!
- 3D視覺(jué)技術(shù)為工業(yè)自動(dòng)化帶來(lái)新“視界”
- 有獎(jiǎng)直播|TI Sitara™ 產(chǎn)品在智能電網(wǎng)中的應(yīng)用
- 有獎(jiǎng)探索 | 和村田一起,深挖 GNSS 開(kāi)發(fā)!
- 有獎(jiǎng)活動(dòng)|登陸泰克高精度電源測(cè)試知識(shí)星球,揭開(kāi)噪聲的迷霧,發(fā)現(xiàn)真實(shí)的信號(hào)!
- 免費(fèi)申請(qǐng)測(cè)評(píng) | Sipeed MAix BiT AIoT 開(kāi)發(fā)套件,搭載K210、屏幕和攝像頭
- 有獎(jiǎng)話題:聊一聊論壇里幫助過(guò)你的網(wǎng)友!
- 老T叔的藏書(shū)閣——一位老工程師多年的資料積累
- 【有獎(jiǎng)?wù)魑摹縏I DSP 30 周年——聊聊DSP的那些事兒
- 最能打的國(guó)產(chǎn)芯們
- 有獎(jiǎng)直播:TI最新C2000實(shí)時(shí)控制器,在功率變換應(yīng)用中實(shí)現(xiàn)高性能的成本優(yōu)化型設(shè)計(jì)