0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用STM32F103做CAN的收發(fā)通信的程序思路與代碼分享

STM32嵌入式開發(fā) ? 來(lái)源:qq_36355662 ? 作者:qq_36355662 ? 2022-06-14 16:13 ? 次閱讀

(本文為qq_36355662創(chuàng)作文章在此特別鳴謝!)

CAN通信

CAN 是Controller Area Network 的縮寫(以下稱為CAN),該通信使用的是ISO11898標(biāo)準(zhǔn),該標(biāo)準(zhǔn)的物理層特征如下圖所示。

adb1c77c-e89e-11ec-ba43-dac502259ad0.png

CAN協(xié)議是通過以下5種類型的幀進(jìn)行的:

數(shù)據(jù)幀

搖控幀

錯(cuò)誤幀

過載幀

幀間隔

另外,數(shù)據(jù)幀和遙控幀有標(biāo)準(zhǔn)格式和擴(kuò)展格式兩種格式。標(biāo)準(zhǔn)格式有11 個(gè)位的標(biāo)識(shí)符(ID),擴(kuò)展格式有29 個(gè)位的ID。

大部分系統(tǒng)使用的都是數(shù)據(jù)幀 ,我這里使用的也是數(shù)據(jù)幀。
數(shù)據(jù)幀一般由7個(gè)段構(gòu)成,即:
(1) 幀起始。表示數(shù)據(jù)幀開始的段。
(2) 仲裁段。表示該幀優(yōu)先級(jí)的段。
(3) 控制段。表示數(shù)據(jù)的字節(jié)數(shù)及保留位的段。
(4) 數(shù)據(jù)段。數(shù)據(jù)的內(nèi)容,一幀可發(fā)送0~8個(gè)字節(jié)的數(shù)據(jù)。
(5) CRC段。檢查幀的傳輸錯(cuò)誤的段。
(6) ACK段。表示確認(rèn)正常接收的段。
(7) 幀結(jié)束。表示數(shù)據(jù)幀結(jié)束的段。

明確了數(shù)據(jù)幀概念,還需要理解一下過濾器的作用。

STM32的標(biāo)識(shí)符屏蔽濾波目的是減少了CPU處理CAN通信的開銷。STM32的過濾器組最多有28個(gè)(互聯(lián)型),但是STM32F103ZET6只有14個(gè)(增強(qiáng)型),每個(gè)濾波器組x由2個(gè)32為寄存器,CAN_FxR1和CAN_FxR2組成。
STM32每個(gè)過濾器組的位寬都可以獨(dú)立配置,以滿足應(yīng)用程序的不同需求。根據(jù)位寬的不同,每個(gè)過濾器組可提供:

1個(gè)32位過濾器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位

2個(gè)16位過濾器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位

此外過濾器可配置為,屏蔽位模式和標(biāo)識(shí)符列表模式。

在屏蔽位模式下,標(biāo)識(shí)符寄存器和屏蔽寄存器一起,指定報(bào)文標(biāo)識(shí)符的任何一位,應(yīng)該按照“必須匹配”或“不用關(guān)心”處理。
而在標(biāo)識(shí)符列表模式下,屏蔽寄存器也被當(dāng)作標(biāo)識(shí)符寄存器用。因此,不是采用一個(gè)標(biāo)識(shí)符加一個(gè)屏蔽位的方式,而是使用2個(gè)標(biāo)識(shí)符寄存器。接收?qǐng)?bào)文標(biāo)識(shí)符的每一位都必須跟過濾器標(biāo)識(shí)符相同。相關(guān)文章:CAN總線詳解。

一般也都是使用標(biāo)識(shí)符列表模式,這里使用的也是標(biāo)識(shí)符列表模式。濾波過程舉例如下:

add4a8fa-e89e-11ec-ba43-dac502259ad0.png

在程序中就是:

//要過濾的ID高位
CAN_FilterInitStructure.CAN_FilterIdHigh=0X00;
//要過濾的ID低位
CAN_FilterInitStructure.CAN_FilterIdLow= (((u32)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;?
//過濾器屏蔽標(biāo)識(shí)符的高16位值
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;
//過濾器屏蔽標(biāo)識(shí)符的低16位值
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;

這里的CAN_FilterId和CAN_FilterMaskId是配合使用的,意思是CAN_FilterId指出需要屏蔽ID的什么內(nèi)容,什么格式;CAN_FilterMaskId是指CAN_FilterId的每一位是否需要過濾,若CAN_FilterMaskId在某位上是1的話,ID對(duì)應(yīng)位上的數(shù)值就必須和CAN_FilterId該位上的一樣,保持一致,反之則是“不關(guān)心”。

上述程序的設(shè)置的含義就是:只接收來(lái)自0x1314的數(shù)據(jù),屏蔽其他ID的數(shù)據(jù)。

程序思路

這里準(zhǔn)備做一個(gè)主機(jī)與從機(jī)的通信,主要用擴(kuò)展標(biāo)識(shí)符ExtId來(lái)區(qū)分,分配的標(biāo)識(shí)符是: 主機(jī):0x1314 從機(jī):0x1311

主機(jī)負(fù)責(zé)接收所有從機(jī)的數(shù)據(jù),不需要過濾,用擴(kuò)展標(biāo)識(shí)符ExtId來(lái)區(qū)分不同從機(jī)的數(shù)據(jù);主機(jī)還可以向不同從機(jī)發(fā)送信息。而從機(jī)則只接收來(lái)自主機(jī)的數(shù)據(jù),同樣用擴(kuò)展標(biāo)識(shí)符ExtId來(lái)區(qū)分是否是發(fā)向自己的數(shù)據(jù);同時(shí),也能夠向主機(jī)發(fā)送信息。

相關(guān)代碼

代碼也是非常簡(jiǎn)單的,這里貼出了主機(jī)和從機(jī)的can.c和can.h兩個(gè)文件。

從機(jī)相關(guān)代碼

can.c文件:

#include "can.h"
/* 在中斷處理函數(shù)中返回 */
//__IO uint32_t ret = 0;
//接收數(shù)據(jù)緩沖器
u8 RxBuf[5];
u8 Rx_flag=0;
void CAN1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
/* 復(fù)用功能和GPIOB端口時(shí)鐘使能*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
/* CAN1 模塊時(shí)鐘使能 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* Configure CAN pin: RX */ // PB8
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure CAN pin: TX */ // PB9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_Init(GPIOB, &GPIO_InitStructure);
//#define GPIO_Remap_CAN GPIO_Remap1_CAN1 本實(shí)驗(yàn)沒有用到重映射I/O
GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
//CAN_NVIC_Configuration(); //CAN中斷初始化
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
/* enabling interrupt */
NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//CAN_INIT();//CA初始化N模塊
/* CAN register init */
CAN_DeInit(CAN1); //將外設(shè)CAN的全部寄存器重設(shè)為缺省值
CAN_StructInit(&CAN_InitStructure); //把CAN_InitStruct中的每一個(gè)參數(shù)按缺省值填入
/* CAN cell init */
CAN_InitStructure.CAN_TTCM=DISABLE; //沒有使能時(shí)間觸發(fā)模式
CAN_InitStructure.CAN_ABOM=DISABLE; //沒有使能自動(dòng)離線管理
CAN_InitStructure.CAN_AWUM=DISABLE; //沒有使能自動(dòng)喚醒模式
CAN_InitStructure.CAN_NART=DISABLE; //沒有使能非自動(dòng)重傳模式
CAN_InitStructure.CAN_RFLM=DISABLE; //沒有使能接收FIFO鎖定模式
CAN_InitStructure.CAN_TXFP=DISABLE; //沒有使能發(fā)送FIFO優(yōu)先級(jí)
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; //CAN設(shè)置為正常模式
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳躍寬度1個(gè)時(shí)間單位
CAN_InitStructure.CAN_BS1=CAN_BS1_3tq; //時(shí)間段1為3個(gè)時(shí)間單位
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; //時(shí)間段2為2個(gè)時(shí)間單位
CAN_InitStructure.CAN_Prescaler=60; //時(shí)間單位長(zhǎng)度為60
CAN_Init(CAN1,&CAN_InitStructure); //波特率為:72M/2/60(1+3+2)=0.1 即波特率為100KBPs
// CAN filter init 過濾器,注意,只接收主機(jī)發(fā)過來(lái)的數(shù)據(jù),屏蔽其他數(shù)據(jù)
CAN_FilterInitStructure.CAN_FilterNumber=1; //指定過濾器為1
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //指定過濾器為標(biāo)識(shí)符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //過濾器位寬為32位
//CAN_FilterInitStructure.CAN_FilterIdHigh= (((u32)0x1314<<3)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdHigh=0X00; //要過濾的ID高位
CAN_FilterInitStructure.CAN_FilterIdLow= (((u32)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; //要過濾的ID低位?
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF; //過濾器屏蔽標(biāo)識(shí)符的高16位值
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF; //過濾器屏蔽標(biāo)識(shí)符的低16位值
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; //設(shè)定了指向過濾器的FIFO為0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //使能過濾器
CAN_FilterInit(&CAN_FilterInitStructure); //按上面的參數(shù)初始化過濾器
/* CAN FIFO0 message pending interrupt enable */
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //使能FIFO0消息掛號(hào)中斷
}
/* 發(fā)送兩個(gè)字節(jié)的數(shù)據(jù)*/
u8 CAN_SetMsg(u8 Data1,u8 Data2)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0x0000; //標(biāo)準(zhǔn)標(biāo)識(shí)符為0x00
TxMessage.ExtId=0x1311; //擴(kuò)展標(biāo)識(shí)符0x1311,可以更改該標(biāo)識(shí)符以示區(qū)分不同從機(jī)
TxMessage.IDE=CAN_ID_EXT; //使用擴(kuò)展標(biāo)識(shí)符
TxMessage.RTR=CAN_RTR_DATA; //為數(shù)據(jù)幀
TxMessage.DLC=2; //消息的數(shù)據(jù)長(zhǎng)度為2個(gè)字節(jié)
TxMessage.Data[0]=Data1; //第一個(gè)字節(jié)數(shù)據(jù)
TxMessage.Data[1]=Data2; //第二個(gè)字節(jié)數(shù)據(jù)
//發(fā)送數(shù)據(jù)
mbox= CAN_Transmit(CAN1, &TxMessage);
while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))
i++; //等待發(fā)送結(jié)束
if(i>=0XFFF)
return 0;
return 1;
}
u8 CAN_GetMsg(u8 *msg1,u8 *msg2)
{
if(Rx_flag == 1)//發(fā)現(xiàn)數(shù)據(jù)
{
*msg1=RxBuf[0];
*msg2=RxBuf[1];
Rx_flag=0;//數(shù)據(jù)已經(jīng)取走,可以更新數(shù)據(jù)
return 1;
}else
return 0;
}
/* USB中斷和CAN接收中斷服務(wù)程序,USB跟CAN公用I/O,這里只用到CAN的中斷。 */
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
RxMessage.StdId=0x00;
RxMessage.ExtId=0x00;
RxMessage.IDE=0;
RxMessage.DLC=0;
RxMessage.FMI=0;
RxMessage.Data[0]=0x00;
RxMessage.Data[1]=0x00;
CAN_Receive(CAN1,CAN_FIFO0, &RxMessage); //接收FIFO0中的數(shù)據(jù)
if(Rx_flag == 0)//數(shù)據(jù)已取走或者緩沖器為空
{
RxBuf[0]=RxMessage.Data[0];
RxBuf[1]=RxMessage.Data[1];
Rx_flag=1;//數(shù)據(jù)已經(jīng)備好,等待取走
}
}

can.h文件

#ifndef __CAN_H
#define __CAN_H
#include "sys.h"
void CAN1_Init(void);
u8 CAN_SetMsg(u8 Data1,u8 Data2);
u8 CAN_GetMsg(u8 *msg1,u8 *msg2);
#endif /* __CAN_H */

主機(jī)相關(guān)代碼

這里主機(jī)代碼大部分是和從機(jī)類似的,就只貼出不同的地方了。
can.c文件:

#include "can.h"
/* 在中斷處理函數(shù)中返回 */
//__IO uint32_t ret = 0;
void CAN1_Init(void)
{
......//以上與從機(jī)部分相同
//CAN filter init 過濾器,已經(jīng)設(shè)置為任意,可以通過ExtId標(biāo)識(shí)符區(qū)分從機(jī)代號(hào)
CAN_FilterInitStructure.CAN_FilterNumber=1; //指定過濾器為1
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //指定過濾器為標(biāo)識(shí)符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //過濾器位寬為32位
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; //過濾器標(biāo)識(shí)符的高16位值
CAN_FilterInitStructure.CAN_FilterIdLow=CAN_ID_EXT|CAN_RTR_DATA;//過濾器標(biāo)識(shí)符的低16位值
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; //過濾器屏蔽標(biāo)識(shí)符的高16位值
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; //過濾器屏蔽標(biāo)識(shí)符的低16位值
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; //設(shè)定了指向過濾器的FIFO為0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //使能過濾器
CAN_FilterInit(&CAN_FilterInitStructure); //按上面的參數(shù)初始化過濾器
/* CAN FIFO0 message pending interrupt enable */
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //使能FIFO0消息掛號(hào)中斷
}
//接收數(shù)據(jù)緩沖器
u8 CAN_RX_BUF[CAN_RX_LEN]={0}; //接收緩沖,最大USART_REC_LEN個(gè)字節(jié).
//接收標(biāo)志位
u8 Rx_flag=0;
/* USB中斷和CAN接收中斷服務(wù)程序,USB跟CAN公用I/O,這里只用到CAN的中斷。 */
void USB_LP_CAN1_RX0_IRQHandler(void)
{
u8 i=0;
CanRxMsg RxMessage;
RxMessage.StdId=0x00;
RxMessage.ExtId=0x00;
RxMessage.IDE=0;
RxMessage.DLC=0;
RxMessage.FMI=0;
CAN_Receive(CAN1,CAN_FIFO0, &RxMessage); //接收FIFO0中的數(shù)據(jù)
if(Rx_flag == 0)//數(shù)據(jù)已取走或者緩沖器為空
{
if((RxMessage.DLC) == 2)//是否收到2位字節(jié)數(shù)據(jù)
{
CAN_RX_BUF[0]=RxMessage.Data[0];
CAN_RX_BUF[1]=RxMessage.Data[1];
}
}
}
/* 發(fā)送兩個(gè)字節(jié)的數(shù)據(jù)*/
u8 CAN_SendMsg(u8* data1, u8* data2)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0x0000; //標(biāo)準(zhǔn)標(biāo)識(shí)符為0x00
TxMessage.ExtId=0x1314; //擴(kuò)展標(biāo)識(shí)符0x0000
TxMessage.IDE=CAN_ID_EXT; //使用擴(kuò)展標(biāo)識(shí)符
TxMessage.RTR=CAN_RTR_DATA; //為數(shù)據(jù)幀
TxMessage.DLC=2; //消息的數(shù)據(jù)長(zhǎng)度為2個(gè)字節(jié)
TxMessage.Data[0]=Data1; //第一個(gè)字節(jié)數(shù)據(jù)
TxMessage.Data[1]=Data2; //第二個(gè)字節(jié)數(shù)據(jù)
//發(fā)送數(shù)據(jù)
mbox= CAN_Transmit(CAN1, &TxMessage);
while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))
i++; //等待發(fā)送結(jié)束
if(i>=0XFFF)
return 0;//發(fā)送失敗
return 1;//發(fā)送成功
}
u8 CAN_GetMsg(u8 *msg1,u8 *msg2)
{
if(Rx_flag == 1)//發(fā)現(xiàn)數(shù)據(jù)
{
*msg1=CAN_RX_BUF[0];
*msg2=CAN_RX_BUF[1];
Rx_flag=0;//數(shù)據(jù)已經(jīng)取走,可以更新數(shù)據(jù)
return 1;
}else
return 0;
}
void Clear_canBuffer(void)
{
Rx_flag=0;//清楚接收標(biāo)志位
memset(CAN_RX_BUF, 0, sizeof(u8)*CAN_RX_LEN);//清空緩沖區(qū)
}
u8 Check_canRX(void)
{
return (Rx_flag == 6);
}

can.h文件:

#ifndef __CAN_H
#define __CAN_H
#include "sys.h"
#include "string.h"
#define CAN_RX_LEN 30 //定義最大接收字節(jié)數(shù)
extern u8 CAN_RX_BUF[CAN_RX_LEN]; //接收緩沖,最大USART_REC_LEN個(gè)字節(jié).末字節(jié)為換行符
void CAN1_Init(void);
u8 CAN_SendMsg(u8* data1, u8* data2);
u8 CAN_GetMsg(u8 *msg1,u8 *msg2);
#endif /* __CAN_H */

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • CAN通信
    +關(guān)注

    關(guān)注

    5

    文章

    93

    瀏覽量

    17791
  • CAN
    CAN
    +關(guān)注

    關(guān)注

    57

    文章

    2686

    瀏覽量

    462912
  • STM32
    +關(guān)注

    關(guān)注

    2263

    文章

    10846

    瀏覽量

    353701
  • STM32F103
    +關(guān)注

    關(guān)注

    33

    文章

    475

    瀏覽量

    63347

原文標(biāo)題:使用STM32F103做CAN的收發(fā)通信

文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32F103控制ad7606采集程序分享

    本文首先分析了了stm32f103系列的性能如何,其次介紹了ad7606特性,最后介紹了STM32F103控制ad7606采集程序。
    的頭像 發(fā)表于 05-21 11:31 ?3w次閱讀

    基于STM32F103實(shí)現(xiàn)CAN數(shù)據(jù)收發(fā)的功能

    。基于rt-thread,已經(jīng)有CAN的驅(qū)動(dòng)框架,可以快速實(shí)現(xiàn)CAN數(shù)據(jù)的收發(fā)。這里基于STM32F103 實(shí)現(xiàn)CAN數(shù)據(jù)
    發(fā)表于 08-19 07:20

    如何使用STM32F103CAN收發(fā)通信?

    如何使用STM32F103CAN收發(fā)通信
    發(fā)表于 12-15 07:36

    STM32F103芯片F(xiàn)FT程序

    STM32F103芯片使用DSP庫(kù)進(jìn)行FFT運(yùn)算的資料與程序。
    發(fā)表于 06-07 16:30 ?109次下載

    optical flow px4flow stm32f103程序

    STM32f103 optical flow px4flow c 代碼程序
    發(fā)表于 03-24 09:21 ?5次下載

    stm32f103寫的菜單管理程序

    stm32f103寫的菜單管理程序,支持無(wú)限嵌套程序里有使用說(shuō)明,12864采用串口驅(qū)動(dòng)
    發(fā)表于 07-27 16:32 ?69次下載

    STM32F103使用總結(jié)

    STM32F103使用總結(jié)
    發(fā)表于 10-24 10:22 ?152次下載

    stm32f103移植

    stm32f103移植
    發(fā)表于 10-27 09:03 ?43次下載
    <b class='flag-5'>stm32f103</b>移植

    STM32F103教程之STM32F103單片機(jī)的使用心得資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是STM32F103教程之STM32F103單片機(jī)的使用心得資料免費(fèi)下載目前很火的設(shè)計(jì)STM32教程。
    發(fā)表于 09-26 08:00 ?254次下載

    STM32F103 CAN模板程序

    STM32F103 CAN模板程序
    發(fā)表于 11-09 11:08 ?67次下載
    <b class='flag-5'>STM32F103</b> <b class='flag-5'>CAN</b>模板<b class='flag-5'>程序</b>

    LMT70代碼基于stm32f103

    LMT70測(cè)溫代碼基于stm32f103免費(fèi)下載。
    發(fā)表于 05-06 11:16 ?29次下載

    基于STM32f103的FFT頻率測(cè)試程序下載

    基于STM32f103的FFT頻率測(cè)試程序下載
    發(fā)表于 08-02 10:07 ?163次下載

    STM32F103學(xué)習(xí)筆記三 串口通信

    STM32F103學(xué)習(xí)筆記三 串口通信
    發(fā)表于 11-25 09:06 ?71次下載
    <b class='flag-5'>STM32F103</b>學(xué)習(xí)筆記三   串口<b class='flag-5'>通信</b>

    GD32F103STM32F103的區(qū)別 2021.6.2

    GD32F103STM32F103區(qū)別介紹關(guān)鍵詞Key words:GD32F103、STM32F103摘要Abstract:本文主要是GD32F
    發(fā)表于 12-08 11:06 ?82次下載
    GD32<b class='flag-5'>F103</b>與<b class='flag-5'>STM32F103</b>的區(qū)別 2021.6.2

    基于STM32F103的DAC8411驅(qū)動(dòng)程序

    基于STM32F103的DAC8411驅(qū)動(dòng)程序,親測(cè)可用,歡迎大家一起交流
    發(fā)表于 08-28 11:21 ?15次下載