TKM32F499高性能MCU評(píng)估板試用之萬(wàn)事開(kāi)頭難,先點(diǎn)個(gè)燈來(lái)壓壓驚!
如下圖所示,評(píng)估板長(zhǎng)這個(gè)樣子:
TKM32F499深圳市好鉅潤(rùn)科技有限公司發(fā)行的一款高性能單片機(jī),以上圖片是基于TKM32F499的一款評(píng)估板,可以看到評(píng)估板上的資源那是相當(dāng)?shù)呢S富了,而且還是白菜價(jià),到手價(jià)僅需88元,不得不說(shuō)實(shí)在是香,香在哪呢?咱們看看特點(diǎn)就知道了。
1、特點(diǎn)
1、IPS全視角液晶屏,陽(yáng)光下可視度高;
2、高分辨率800*480;
3、超大存儲(chǔ)空間:16MB的FLASH及8MB的RAM,可以運(yùn)行復(fù)雜的界面程序;
4、采用高性能TK499芯片,240MHz,帶FPU,支持硬件浮點(diǎn)運(yùn)算;
5、USB方式下載,可以用USB更新程序,圖標(biāo)及字庫(kù);
6、帶WIFI模塊,支持無(wú)線顯示,利于接入IoT物聯(lián)網(wǎng)
7、提供豐富外設(shè):串口、SPI、GPIO、USB,SDIO、五向按鍵、3路LED燈;
8、性價(jià)比高,88元包含了高性能M4芯片,16M FLASH與8M RAM及高分辨率TFT屏, 可以直接片上編程,比串口屏靈活,速度更快;
這么強(qiáng)大的一個(gè)評(píng)估板,直接套在我們的產(chǎn)品上簡(jiǎn)直就是天然的優(yōu)勢(shì),但不知道開(kāi)發(fā)起來(lái)難度大不大?
根據(jù)官方對(duì)評(píng)估板的介紹,用戶不需要關(guān)心環(huán)境設(shè)置以及路徑設(shè)置,所有的一切,他們都幫我們配置好了,所以我們只需要拿到程序的工程文件,直接就可以開(kāi)始編寫(xiě)代碼,其它一些特殊的說(shuō)明直接查看資料包即可。
2、開(kāi)發(fā)平臺(tái)
那這款芯片用什么平臺(tái)來(lái)進(jìn)行開(kāi)發(fā)呢?
這是我們熟悉的Keil5,編程風(fēng)格和STM32是幾乎是一樣的。
想要讓芯片工作起來(lái),去驅(qū)動(dòng)連接的外設(shè),首先我們得了解芯片的一些規(guī)格,比如系統(tǒng)框圖、引腳排列和引腳說(shuō)明、存儲(chǔ)器映射表,了解了這些以后,我們?cè)偃ソY(jié)合芯片的Datasheet去查詢相應(yīng)的寄存器以及注意事項(xiàng),最后完成我們產(chǎn)品功能的軟件編寫(xiě)。
3、TKM32F499芯片架構(gòu)
以下是TKM32F499芯片系統(tǒng)框圖,系統(tǒng)框圖能讓我們快速了解這款芯片包含哪些模塊單元,以便于我們開(kāi)發(fā)產(chǎn)品時(shí)進(jìn)行選型。
可以看到,芯片基于ARM-ContexM4 FPU架構(gòu),我們來(lái)簡(jiǎn)單了解下:
ARM Cortex-M4處理器是由ARM專門(mén)開(kāi)發(fā)的最新嵌入式處理器,在M3的基礎(chǔ)上強(qiáng)化了運(yùn)算能力,新加了浮點(diǎn)、DSP、并行計(jì)算等。
ARM-ContexM4 FPU處理器則是在此架構(gòu)基礎(chǔ)上單精度浮點(diǎn)單元(FPU),能夠高效率處理較為復(fù)雜的浮點(diǎn)運(yùn)算,如電機(jī)閉環(huán)控制、PID算法、快速傅里葉變換等。
TKM32F499支持的功能還是非常多的,除了常規(guī)的STM32上有的功能,還加了一個(gè)特色模塊,比如TK80.
4、TKM32F499芯片管腳及排列說(shuō)明
5、TKM32F499存儲(chǔ)器映射表
6、TKM32F499測(cè)評(píng)程序編寫(xiě)步驟及程序解讀
玩任何一個(gè)板子,先點(diǎn)個(gè)燈,后面就好辦了,官方資料包里第一個(gè)例程GPIO_LED是讓評(píng)估板上的LED以固定的頻率進(jìn)行閃爍,我們來(lái)看下原理圖:
由于例程里沒(méi)有使用PWM去驅(qū)動(dòng)LED,所以直接高低電平就可以驅(qū)動(dòng)它進(jìn)行工作了。管腳接在PD8這個(gè)位置。
既然和STM32的編程方式一樣,那么肯定是以下的流程:
1、初始化并使能RCC時(shí)鐘
2、GPIO模式配置及初始化
3、使用GPIO
TKM32F499,官方已經(jīng)寫(xiě)好相應(yīng)的開(kāi)發(fā)庫(kù)了,我們拿來(lái)即用即可,編寫(xiě)這個(gè)例程,一共需要用到庫(kù)文件里四個(gè)API,分別是:
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin);
6.1 RCC_AHBPeriphClockCmd
RCC_AHBPeriphClockCmd用于配置系統(tǒng)的RCC時(shí)鐘,只有時(shí)鐘起來(lái)了,外設(shè)才能工作。打HAL_rcc.h可以看到,官方根據(jù)Datasheet已經(jīng)寫(xiě)好了相應(yīng)的地址。
這里我們要控制的外設(shè)是GPIOD,根據(jù)存儲(chǔ)器映射圖,我們可以看到GPIOD掛在AHB1總線下:
對(duì)應(yīng)的,接下來(lái)看Datasheet關(guān)于RCC相關(guān)的章節(jié)關(guān)于這部分的描述:
我們需要把這個(gè)寄存器的第三位給使能了,那么GPIOD功能就可以正常使用了。
所以非常簡(jiǎn)單,我們只需要把這一位和RCC的AHB1外設(shè)時(shí)鐘使能寄存器做一個(gè)或操作即可,來(lái)看看程序里是怎么寫(xiě)的:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);
追進(jìn)該函數(shù)的RCC_AHBPeriphClockCmd源碼實(shí)現(xiàn):
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
RCC->AHB1ENR |= RCC_AHBPeriph;
}
else
{
RCC->AHB1ENR &= ~RCC_AHBPeriph;
}
}
這里首先使用斷言函數(shù)assert_param檢查參數(shù)是否有效,主要是檢查是否為非法地址。
接下來(lái)判斷NewState參數(shù),如果是ENABLE ,則與RCC->AHB1ENR置位,否則清除該位,NewState參數(shù)其實(shí)是一個(gè)枚舉。
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
那么RCC->AHB1ENR是啥呢?追進(jìn)定義看看:
#define PERIPH_BASE ((uint32_t)0x40000000) /*!< SRAM base address in the bit-band region */
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
#define RCC_BASE (AHB1PERIPH_BASE + 0x3800)
#define RCC ((RCC_TypeDef *) RCC_BASE)
這是將一個(gè)地址強(qiáng)制轉(zhuǎn)換成一個(gè)結(jié)構(gòu)體,STM32里也是這么做的,我們看看對(duì)應(yīng)的結(jié)構(gòu)體:
typedef struct
{
__IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */
__IO uint32_t PLLCFGR; /*!< RCC clock configuration register, Address offset: 0x04 */
__IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */
__IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */
__IO uint32_t AHB1RSTR; /*!< RCC AHB peripheral clock register, Address offset: 0x10 */
__IO uint32_t AHB2RSTR; /*!< RCC AHB peripheral clock register, Address offset: 0x14 */
__IO uint32_t APB1RSTR; /*!< RCC AHB peripheral clock register, Address offset: 0x18 */
__IO uint32_t APB2RSTR; /*!< RCC AHB peripheral clock register, Address offset: 0x1C */
__IO uint32_t AHB1ENR; /*!< RCC AHB peripheral clock register, Address offset: 0x20 */
__IO uint32_t AHB2ENR; /*!< RCC AHB peripheral clock register, Address offset: 0x24 */
__IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x28 */
__IO uint32_t APB2ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x2C */
__IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x30 */
__IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x34 */
__IO uint32_t PLLLCDCFGR; /*!< RCC clock configuration register 2, Address offset: 0x38 */
__IO uint32_t PLLDCKCFGR; /*!< RCC clock configuration register 3, Address offset: 0x3C */
} RCC_TypeDef;
對(duì)應(yīng)結(jié)構(gòu)體的成員即為RCC的地址,如果想詳細(xì)了解它的配置,可以查看手冊(cè)時(shí)鐘章節(jié)。
RCC_AHBPeriph_GPIOD是一個(gè)宏
對(duì)應(yīng)的值是0x0000008,也就是(1 << 3),所以得出結(jié)論,把這個(gè)宏作為參數(shù)傳遞進(jìn)RCC_AHBPeriphClockCmd這個(gè)函數(shù),在第二個(gè)函數(shù)寫(xiě)上ENABLE即可完成GPIOD使能RCC時(shí)鐘的初始化,真香!所以很容易可以寫(xiě)出以下代碼完成GPIOD使能時(shí)鐘的配置:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);
6.2 GPIO_Init
/**
* @brief Initializes the GPIOx peripheral according to the specified
* parameters in the GPIO_InitStruct.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that
* contains the configuration information for the specified GPIO
* peripheral.
* @retval : None
*/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
這個(gè)函數(shù)用戶GPIO(通用功能I/O)功能的初始化,與RCC一樣,程序里也是定義了操作GPIO相關(guān)的結(jié)構(gòu)體GPIO_TypeDef,以下是對(duì)應(yīng)的一些寄存器:
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
uint32_t RESERVED;
__IO uint32_t AFRL;
__IO uint32_t AFRH;
__IO uint32_t CRH_EXT;
__IO uint32_t BSRR_EXT;
__IO uint32_t AFRH_EXT;
} GPIO_TypeDef;
詳細(xì)可以看GPIO章節(jié)手冊(cè)里對(duì)寄存器的描述:
對(duì)IO的管腳、速率、模式的設(shè)置,用的是GPIO_InitTypeDef這個(gè)結(jié)構(gòu)體:
typedef struct
{
uint32_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
GPIO_Pin用于設(shè)置管腳,對(duì)應(yīng)的也是相應(yīng)的宏:
#define GPIO_Pin_0 ((uint16_t)0x0001) /* Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /* Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /* Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /* Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /* Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /* Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /* Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /* Pin 7 selected */
#define GPIO_Pin_8 ((uint16_t)0x0100) /* Pin 8 selected */
#define GPIO_Pin_9 ((uint16_t)0x0200) /* Pin 9 selected */
#define GPIO_Pin_10 ((uint16_t)0x0400) /* Pin 10 selected */
#define GPIO_Pin_11 ((uint16_t)0x0800) /* Pin 11 selected */
#define GPIO_Pin_12 ((uint16_t)0x1000) /* Pin 12 selected */
#define GPIO_Pin_13 ((uint16_t)0x2000) /* Pin 13 selected */
#define GPIO_Pin_14 ((uint16_t)0x4000) /* Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /* Pin 15 selected */
#define GPIO_Pin_16 ((uint32_t)0x010000) /* Pin 16 selected */
#define GPIO_Pin_17 ((uint32_t)0x020000) /* Pin 17 selected */
#define GPIO_Pin_18 ((uint32_t)0x040000) /* Pin 18 selected */
#define GPIO_Pin_19 ((uint32_t)0x080000) /* Pin 19 selected */
#define GPIO_Pin_20 ((uint32_t)0x100000) /* Pin 20 selected */
#define GPIO_Pin_21 ((uint32_t)0x200000) /* Pin 21 selected */
#define GPIO_Pin_22 ((uint32_t)0x400000) /* Pin 22 selected */
#define GPIO_Pin_23 ((uint32_t)0x800000) /* Pin 23 selected */
#define GPIO_Pin_All ((uint32_t)0xFFFFFF) /* All pins selected */
GPIO_Speed是用于IO速率的配置,對(duì)應(yīng)的是一個(gè)枚舉:
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
GPIO_Mode是針對(duì)IO的模式進(jìn)行配置,對(duì)應(yīng)的是一個(gè)枚舉
typedef enum
{
GPIO_Mode_AIN = 0x0, //模擬輸入
GPIO_Mode_IN_FLOATING = 0x04, //浮空輸入
GPIO_Mode_IPD = 0x28, //下拉輸入
GPIO_Mode_IPU = 0x48, //上拉輸入
GPIO_Mode_Out_OD = 0x14,//通用開(kāi)漏輸出
GPIO_Mode_Out_PP = 0x10,//通用推挽輸出
GPIO_Mode_AF_OD = 0x1C, // 復(fù)用開(kāi)漏輸出
GPIO_Mode_AF_PP = 0x18 //復(fù)用推挽輸出
}GPIOMode_TypeDef;
在了解了以下知識(shí)點(diǎn)以后,針對(duì)LED管腳的配置,我們很快就能寫(xiě)出代碼:
//1、定義GPIO初始化結(jié)構(gòu)體變量
GPIO_InitTypeDef GPIO_InitStructure;
//2、初始化配置管腳
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//3、初始化管腳速率
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//4、初始化管腳模式,配置為推挽輸出模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//5、調(diào)用GPIO_Init完成IO的初始化
GPIO_Init(GPIOD, &GPIO_InitStructure);
6.3 GPIO_SetBits、GPIO_ResetBits
GPIO_SetBits和GPIO_ResetBits主要是對(duì)端口進(jìn)行設(shè)置和清除,對(duì)應(yīng)的是下面這個(gè)寄存器:
以下是兩個(gè)函數(shù)的源代碼:
/**
* @brief Sets the selected data port bits.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param GPIO_Pin: specifies the port bits to be written.
* This parameter can be any combination of GPIO_Pin_x where
* x can be (0..15).
* @retval : None
*/
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
if(GPIO_Pin>GPIO_Pin_15)GPIOE->BSRR_EXT=GPIO_Pin>>16;
else
GPIOx->BSRR = GPIO_Pin;
}
/**
* @brief Clears the selected data port bits.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param GPIO_Pin: specifies the port bits to be written.
* This parameter can be any combination of GPIO_Pin_x where
* x can be (0..15).
* @retval : None
*/
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->BRR = GPIO_Pin;
}
根據(jù)功能描述,很容易可以寫(xiě)出下列代碼:
//給GPIOD的第八位
GPIO_SetBits(GPIOD, GPIO_Pin_8); //PC8輸出高電平,點(diǎn)亮LED
//清除GPIOD的第八位
GPIO_ResetBits(GPIOD, GPIO_Pin_8);//PD8輸出低電平,熄滅LED
以下是該Demo的源代碼:
/****************************************Copyright (c)****************************************************
**
**
**
**--------------File Info---------------------------------------------------------------------------------
** File name: main.c
** modified Date: 2017-6-20
** Last Version: V0.1
** Descriptions: main 函數(shù)調(diào)用
**
** 好鉅潤(rùn)科技,芯片事業(yè)部----深圳龍華應(yīng)用分部
*********************************************************************************************************/
#include "HAL_conf.h"
/********************************************************************************************************
**函數(shù)信息 :int main (void)
**功能描述 :
**輸入?yún)?shù) :
**輸出參數(shù) :
********************************************************************************************************/
int main(void)
{
uint32_t i;
GPIO_InitTypeDef GPIO_InitStructure;//定義GPIO初始化結(jié)構(gòu)體變量
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);
//配置連接LED的GPIO為推挽輸出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
while(1)//無(wú)限循環(huán)
{
GPIO_SetBits(GPIOD, GPIO_Pin_8); //PC8輸出高電平,點(diǎn)亮LED
for(i=0;i<2000000;i++);//延時(shí)
GPIO_ResetBits(GPIOD, GPIO_Pin_8);//PD8輸出低電平,熄滅LED
for(i=0;i<2000000;i++);//延時(shí)
}
}
7、TKM32F499程序編譯與下載
7.1 程序編譯
和STM32一樣,程序編譯直接點(diǎn)擊Keil軟件上的編譯即可,如果程序沒(méi)有錯(cuò)誤則會(huì)生成對(duì)應(yīng)的bin文件。
7.2 程序燒錄
TK499 支持 U 盤(pán)方式下載,無(wú)需借助下載器,一根 USB 線就能下載。
方法一:五向按鍵向上推,同時(shí)按一下復(fù)位(注意,松手時(shí),先松復(fù)位,再松五向按鍵),然后點(diǎn)一下 KEIL 的下載程序的按鈕就可以下載了。KEIL 不會(huì)提示是否下載完成,聽(tīng)到退出 U 盤(pán)的“叮咚”聲就可以了。下載完成一般可以自動(dòng)運(yùn)行,如果沒(méi)運(yùn)行,可以按一下復(fù)位或者斷電再上電就可以運(yùn)行。
方法二:向上推,同時(shí)按一下復(fù)位就會(huì)進(jìn)入程序下載模式,同樣的也會(huì)彈出一個(gè) U 盤(pán),把 KEIL 工程目錄下生成的 bin 程序拖進(jìn) U 盤(pán)就行,如下圖。
如果是芯片第一次使用,需要先燒錄一個(gè) Bootloader。方法是:把五向按鍵向左推,同時(shí)再按一下復(fù)位就進(jìn)入了 Bootloader 下載模式(注意,松開(kāi)按鍵時(shí),先松復(fù)位,再松五向按鍵)。這時(shí)會(huì)彈出一個(gè) TK499 的 U 盤(pán),把開(kāi)發(fā)包壓縮包里的 TK499_Bootloader.bin拖進(jìn)去就行。(一般情況下開(kāi)發(fā)板已經(jīng)是燒好 Bootloader,此步可省略)
Bootloader 是一個(gè)重要的文件,以后會(huì)不斷升級(jí) Bootloader,用它可以通過(guò) USB下載圖片及字庫(kù)。
注意:2019.10.1 前發(fā)布的程序,一般沒(méi)把 flash_download.exe 下載程序工具放進(jìn)工程文件夾里,所以用不了方法一來(lái)下載。當(dāng)然你要自己添加也是很容易的,把這個(gè)小工具放到工程目錄下,然后復(fù)制下面兩行命令進(jìn)去就行。
flash_download
..//@L.bin TK499_V2
8、運(yùn)行結(jié)果
LED以固定頻率進(jìn)行閃爍:
最后,感謝淘寶客服小姐姐多送了一塊帶觸摸的開(kāi)發(fā)板給我:
TKM32F499評(píng)估板例程及資料下載
鏈接:https://pan.baidu.com/s/1xujEO4vJ7i7UUK7v_fGNgw
提取碼:g1y2
或者后臺(tái)回復(fù)TK499即可獲取。
關(guān)于開(kāi)源項(xiàng)目群建立
本公眾號(hào)嵌入式云IOT技術(shù)圈
聯(lián)合友情鏈接mculover666
公眾號(hào),發(fā)起了開(kāi)源項(xiàng)目的移植分析及共享,目前已到第三期,未來(lái)還會(huì)持續(xù)搜索有價(jià)值的項(xiàng)目,感興趣可加我們的開(kāi)源項(xiàng)目分享群。
Mculover666公眾號(hào)簡(jiǎn)介
號(hào)主Mculover666是一個(gè)喜歡玩板子的小碼農(nóng),CSDN博客專家、華為云云享專家。憑著與生俱來(lái)的興趣專注于物聯(lián)網(wǎng)領(lǐng)域。在寫(xiě)代碼玩板子的同時(shí),通過(guò)寫(xiě)作這種方式分享自己的個(gè)人理解,文章分享的技術(shù)領(lǐng)域內(nèi)容主要包括C語(yǔ)言、STM32、RTOS、NB-IoT、LoRa等,還會(huì)分享超級(jí)好玩的創(chuàng)客內(nèi)容,大開(kāi)腦洞,發(fā)現(xiàn)不一樣的生活~
公眾號(hào)粉絲福利時(shí)刻
這里我給大家申請(qǐng)到了福利,本公眾號(hào)讀者購(gòu)買(mǎi)小熊派開(kāi)發(fā)板可享受9折優(yōu)惠,有需要購(gòu)買(mǎi)小熊派的朋友,淘寶搜索即可,跟客戶說(shuō)你是公眾號(hào):嵌入式云IOT技術(shù)圈 的粉絲,立享9折優(yōu)惠!
往期精彩
網(wǎng)紅物聯(lián)網(wǎng)開(kāi)發(fā)板小熊派使用評(píng)測(cè)
開(kāi)源STM32產(chǎn)品:無(wú)線點(diǎn)菜寶使用評(píng)測(cè)
超輕量級(jí)網(wǎng)紅軟件定時(shí)器multi_timer(51+stm32雙平臺(tái)實(shí)戰(zhàn))
若覺(jué)得本次分享的文章對(duì)您有幫助,隨手點(diǎn)[在看]
并轉(zhuǎn)發(fā)分享,也是對(duì)我的支持。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!