精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

又踩坑了!這次敗給CAN總線了

小麥大叔 ? 來(lái)源:小麥大叔 ? 2023-10-12 16:47 ? 次閱讀

前言

最近負(fù)責(zé)的一個(gè)項(xiàng)目用的主控芯片STM32F407IGT6,需要和幾個(gè)電機(jī)控制器進(jìn)行通訊,有很多參數(shù)需要進(jìn)行監(jiān)控。
有一個(gè)問(wèn)題一直無(wú)法解決。在開(kāi)啟CAN的接收中斷,接收不到數(shù)據(jù),問(wèn)題卡了很久,下面簡(jiǎn)單分享一下解決的過(guò)程和思路。

目錄

  • 背景

  • CAN總線

  • CAN控制器

  • CAN收發(fā)器

  • 調(diào)試過(guò)程

    • 硬件排查

    • CAN分析儀

    • 芯片CAN控制器調(diào)試

  • 總結(jié)

CAN總線

CAN總線是一種串行通信協(xié)議,用于在微控制器和其他設(shè)備之間傳輸數(shù)據(jù)。CAN總線通常用于汽車、工業(yè)自動(dòng)化機(jī)器人等領(lǐng)域。

CAN總線的硬件通常由以下幾個(gè)部分組成:

  • 控制器區(qū)域:包括CAN控制器和CAN收發(fā)器;
  • 總線電纜:用于連接CAN總線上的所有設(shè)備;
  • 終端電阻:用于終止總線,以減少反射和信號(hào)干擾;
  • 外部電源:用于為CAN總線提供電源;

CAN總線的控制器區(qū)域通常包括CAN控制器CAN收發(fā)器。

  • CAN控制器負(fù)責(zé)處理CAN總線上的數(shù)據(jù)傳輸,包括數(shù)據(jù)發(fā)送和接收、錯(cuò)誤檢測(cè)和糾正等;
  • CAN收發(fā)器則負(fù)責(zé)將CAN控制器的信號(hào)轉(zhuǎn)換為總線上的電信號(hào),并將總線上的電信號(hào)轉(zhuǎn)換為CAN控制器可以理解的信號(hào)。

CAN控制器

主板上的芯片STM32F407IGT6中帶有兩路的CAN控制器,分別為CAN1CAN2,具體如下圖所示;

4d89280c-68d8-11ee-939d-92fbcf53809c.png

CAN收發(fā)器

主板上使用的是芯片SN65HVD230,這是TI公司的一款性能強(qiáng)大且具體低功耗功能的CAN收發(fā)器,具體的典型應(yīng)用電路如下所示;

4d9ec77a-68d8-11ee-939d-92fbcf53809c.png

調(diào)試過(guò)程

硬件排查

設(shè)備的調(diào)試過(guò)程中,首先要確保硬件鏈路上是否正常。最常見(jiàn)的方法就是直接用示波器進(jìn)行檢查。具體如下所示;

4db28f62-68d8-11ee-939d-92fbcf53809c.png

  1. 檢查CAN控制器和CAN收發(fā)器之間是否正常;
  2. 檢查CAN收發(fā)器的差分信號(hào)是否正常,這里可能要了解一下CAN總線電平的顯性電平和隱性電平的特點(diǎn),以及CAN底層協(xié)議的細(xì)節(jié),會(huì)比較復(fù)雜;

個(gè)人比較推薦使用上述步驟檢查硬件鏈路是否存在問(wèn)題,那如何對(duì)數(shù)據(jù)進(jìn)行分析呢?當(dāng)然可以對(duì)著示波器的波形一點(diǎn)一點(diǎn)進(jìn)行分析,但是這樣是很低效的,這里我建議使用CAN分析儀進(jìn)行數(shù)據(jù)抓包,下面我們繼續(xù)進(jìn)行介紹。

CAN分析儀

至于數(shù)據(jù)傳輸是否正確,可以使用CAN盒進(jìn)行數(shù)據(jù)監(jiān)聽(tīng),下面是我使用的一款CAN分析儀,如圖;

4dc0b768-68d8-11ee-939d-92fbcf53809c.png

將CAN分析儀的CAN_HCAN_L分別并聯(lián)到CAN收發(fā)器的CAN_HCAN_L上,然后打開(kāi)CAN分析儀廠家提供的PC軟件,就可以對(duì)CAN總線的數(shù)據(jù)進(jìn)行監(jiān)聽(tīng);

4dd310a2-68d8-11ee-939d-92fbcf53809c.png

  1. 將CAN分析儀接入到CAN總線;
  2. 將CAN分析儀連接到電腦(這里是USB接口),需要配置相同的波特率;
  3. 打開(kāi)CAN分析儀配套的PC軟件,進(jìn)行數(shù)據(jù)的收發(fā);

4de47748-68d8-11ee-939d-92fbcf53809c.png

  1. 進(jìn)行到這里,我在項(xiàng)目中遇到的問(wèn)題是,發(fā)送正常,但是STM32F407無(wú)法接收到連續(xù)的數(shù)據(jù),可以接收到一次數(shù)據(jù),后面便無(wú)法再進(jìn)入中斷。這時(shí)候,只能再芯片端進(jìn)行Debug了。

芯片CAN控制器調(diào)試

這里的代碼用的HAL庫(kù),庫(kù)版本相對(duì)來(lái)說(shuō)比較老,是V1.7.10版本的,如下圖所示;

4defae1a-68d8-11ee-939d-92fbcf53809c.png

當(dāng)時(shí)我把項(xiàng)目升級(jí)到最新的HAL庫(kù),發(fā)現(xiàn)CAN部分的驅(qū)動(dòng)改動(dòng)比較大,另外,下文都是基于V1.7.10版本的HAL庫(kù)。

CAN控制器的初始化代碼如下所示;

voidMX_CAN_Init(void)
{
CAN_FilterConfTypeDefsFilterConfig;

/*CAN單元初始化*/
hCAN.Instance=CANx;/*CAN外設(shè)*/
hCAN.pTxMsg=&TxMessage;
hCAN.pRxMsg=&RxMessage;

hCAN.Init.Prescaler=6;/*BTR-BRP波特率分頻器定義了時(shí)間單元的時(shí)間長(zhǎng)度42/(1+6+7)/6=500Kbps*/
hCAN.Init.Mode=CAN_MODE_NORMAL;/*正常工作模式*/
hCAN.Init.SJW=CAN_SJW_1TQ;/*BTR-SJW重新同步跳躍寬度1個(gè)時(shí)間單元*/
hCAN.Init.BS1=CAN_BS1_6TQ;/*BTR-TS1時(shí)間段1占用了6個(gè)時(shí)間單元*/
hCAN.Init.BS2=CAN_BS2_7TQ;/*BTR-TS1時(shí)間段2占用了7個(gè)時(shí)間單元*/
hCAN.Init.TTCM=DISABLE;/*MCR-TTCM關(guān)閉時(shí)間觸發(fā)通信模式使能*/
hCAN.Init.ABOM=ENABLE;/*MCR-ABOM自動(dòng)離線管理*/
hCAN.Init.AWUM=ENABLE;/*MCR-AWUM使用自動(dòng)喚醒模式*/
hCAN.Init.NART=DISABLE;/*MCR-NART禁止報(bào)文自動(dòng)重傳DISABLE-自動(dòng)重傳*/
hCAN.Init.RFLM=DISABLE;/*MCR-RFLM接收FIFO鎖定模式DISABLE-溢出時(shí)新報(bào)文會(huì)覆蓋原有報(bào)文*/
hCAN.Init.TXFP=DISABLE;/*MCR-TXFP發(fā)送FIFO優(yōu)先級(jí)DISABLE-優(yōu)先級(jí)取決于報(bào)文標(biāo)示符*/
HAL_CAN_Init(&hCAN);

/*CAN過(guò)濾器初始化*/
sFilterConfig.FilterNumber=0;/*過(guò)濾器組0*/
sFilterConfig.FilterMode=CAN_FILTERMODE_IDMASK;/*工作在標(biāo)識(shí)符屏蔽位模式*/
sFilterConfig.FilterScale=CAN_FILTERSCALE_32BIT;/*過(guò)濾器位寬為單個(gè)32位。*/
/*使能報(bào)文標(biāo)示符過(guò)濾器按照標(biāo)示符的內(nèi)容進(jìn)行比對(duì)過(guò)濾,擴(kuò)展ID不是如下的就拋棄掉,是的話,會(huì)存入FIFO0。*/
sFilterConfig.FilterIdHigh=0x0000;//(((uint32_t)0x1314<<3)&0xFFFF0000)>>16;/*要過(guò)濾的ID高位*/
sFilterConfig.FilterIdLow=0x0000;//(((uint32_t)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;?/*?要過(guò)濾的ID低位?*/
sFilterConfig.FilterMaskIdHigh=0x0000;/*過(guò)濾器高16位每位必須匹配*/
sFilterConfig.FilterMaskIdLow=0x0000;/*過(guò)濾器低16位每位必須匹配*/
sFilterConfig.FilterFIFOAssignment=0;/*過(guò)濾器被關(guān)聯(lián)到FIFO0*/
sFilterConfig.FilterActivation=ENABLE;/*使能過(guò)濾器*/
sFilterConfig.BankNumber=14;
HAL_CAN_ConfigFilter(&hCAN,&sFilterConfig);

}

根據(jù)注釋,可以大概看懂,另外再簡(jiǎn)單分析一下關(guān)鍵的幾點(diǎn);

  • 波特率設(shè)置為 500Kbps;
  • 對(duì)報(bào)文不進(jìn)行過(guò)濾,可以接收任何擴(kuò)展ID的數(shù)據(jù);

雖然不進(jìn)行任何過(guò)濾,但是還是無(wú)法接收到CAN回傳的數(shù)據(jù),無(wú)法進(jìn)入的接收中斷;

從STM32F407的編程手冊(cè)里了解到;

4dfa2430-68d8-11ee-939d-92fbcf53809c.png

不難發(fā)現(xiàn),CAN1FIFO0產(chǎn)生接收中斷需要滿足三個(gè)條件中的任意一個(gè);

  • FMPIE01FMP01FIFO不為空會(huì)產(chǎn)生中斷
  • FFIE01FULL1;FIFO滿,會(huì)產(chǎn)生中斷
  • FOVIE01FOVR01FIFO溢出,會(huì)產(chǎn)生中斷

手冊(cè)里是這樣描述的,如下圖所示;

4e045ad6-68d8-11ee-939d-92fbcf53809c.png

使用仿真器對(duì)芯片進(jìn)行調(diào)試,設(shè)置斷點(diǎn),發(fā)現(xiàn)FMPIE0被清空了,具體如下圖所示;

4e15f232-68d8-11ee-939d-92fbcf53809c.png

FMPIE0這一位是FIFO0中有掛起的消息會(huì)產(chǎn)生中斷的中斷使能標(biāo)志位;

4e2654b0-68d8-11ee-939d-92fbcf53809c.png

4e48dde6-68d8-11ee-939d-92fbcf53809c.png

所以到這里,問(wèn)題有點(diǎn)明朗了,為什么無(wú)法進(jìn)入中斷?是中斷使能位被清空了。

那么下面就是檢查代碼,看看是哪里把中斷給disable了。

繼續(xù)調(diào)試,發(fā)現(xiàn)在ESR寄存器中,TEC的值一直增加,然后EWGF被值1了;具體如下所示;

4e5b72a8-68d8-11ee-939d-92fbcf53809c.png

TECREC分別是發(fā)送錯(cuò)誤計(jì)數(shù)器和接收錯(cuò)誤計(jì)數(shù)器;

如 CAN 協(xié)議所述,錯(cuò)誤管理完全由硬件通過(guò)發(fā)送錯(cuò)誤計(jì)數(shù)器( CAN_ESR 寄存器中的 TEC值)和接收錯(cuò)誤計(jì)數(shù)器( CAN_ESR 寄存器中的 REC 值)來(lái)處理,這兩個(gè)計(jì)數(shù)器根據(jù)錯(cuò)誤狀況進(jìn)行遞增或遞減。有關(guān) TEC 和 REC 管理的詳細(xì)信息,請(qǐng)參見(jiàn) CAN 標(biāo)準(zhǔn)。兩者均可由軟件讀取,用以確定網(wǎng)絡(luò)的穩(wěn)定性。此外, CAN 硬件還將在 CAN_ESR 寄存器中提供當(dāng)前錯(cuò)誤狀態(tài)的詳細(xì)信息。通過(guò) CAN_IER 寄存器( ERRIE 位等),軟件可以非常靈活地配置在檢測(cè)到錯(cuò)誤時(shí)生成的中斷。

當(dāng)TEC大于96的時(shí)候,硬件會(huì)將EWGF1(錯(cuò)誤警告標(biāo)志位);在代碼中找到了相應(yīng)的宏定義;這下問(wèn)題越來(lái)越清晰了。

4e694ee6-68d8-11ee-939d-92fbcf53809c.png

全文搜索這個(gè)宏定義,在HAL_CAN_IRQHandler中找到了__HAL_CAN_DISABLE_IT(CAN_IT_FMP0),關(guān)閉了FIFO0的消息掛起中斷,整體代碼如下;

/**
*@briefHandlesCANinterruptrequest
*@paramhcan:pointertoaCAN_HandleTypeDefstructurethatcontains
*theconfigurationinformationforthespecifiedCAN.
*@retvalNone
*/
voidHAL_CAN_IRQHandler(CAN_HandleTypeDef*hcan)
{
uint32_ttmp1=0U,tmp2=0U,tmp3=0U;
uint32_terrorcode=HAL_CAN_ERROR_NONE;

/*CheckOverrunflagforFIFO0*/
tmp1=__HAL_CAN_GET_FLAG(hcan,CAN_FLAG_FOV0);
tmp2=__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_FOV0);
if(tmp1&&tmp2)
{
/*SetCANerrorcodetoFOV0error*/
errorcode|=HAL_CAN_ERROR_FOV0;

/*ClearFIFO0OverrunFlag*/
__HAL_CAN_CLEAR_FLAG(hcan,CAN_FLAG_FOV0);
}
/*CheckOverrunflagforFIFO1*/
tmp1=__HAL_CAN_GET_FLAG(hcan,CAN_FLAG_FOV1);
tmp2=__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_FOV1);

if(tmp1&&tmp2)
{
/*SetCANerrorcodetoFOV1error*/
errorcode|=HAL_CAN_ERROR_FOV1;

/*ClearFIFO1OverrunFlag*/
__HAL_CAN_CLEAR_FLAG(hcan,CAN_FLAG_FOV1);
}

/*CheckEndoftransmissionflag*/
if(__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_TME))
{
tmp1=__HAL_CAN_TRANSMIT_STATUS(hcan,CAN_TXMAILBOX_0);
tmp2=__HAL_CAN_TRANSMIT_STATUS(hcan,CAN_TXMAILBOX_1);
tmp3=__HAL_CAN_TRANSMIT_STATUS(hcan,CAN_TXMAILBOX_2);
if(tmp1||tmp2||tmp3)
{
tmp1=__HAL_CAN_GET_FLAG(hcan,CAN_FLAG_TXOK0);
tmp2=__HAL_CAN_GET_FLAG(hcan,CAN_FLAG_TXOK1);
tmp3=__HAL_CAN_GET_FLAG(hcan,CAN_FLAG_TXOK2);
/*CheckTransmitsuccess*/
if(tmp1||tmp2||tmp3)
{
/*Calltransmitfunction*/
CAN_Transmit_IT(hcan);
}
else/*Transmitfailure*/
{
/*SetCANerrorcodetoTXFAILerror*/
errorcode|=HAL_CAN_ERROR_TXFAIL;
}

/*Cleartransmissionstatusflags(RQCPxandTXOKx)*/
SET_BIT(hcan->Instance->TSR,CAN_TSR_RQCP0|CAN_TSR_RQCP1|CAN_TSR_RQCP2|
CAN_FLAG_TXOK0|CAN_FLAG_TXOK1|CAN_FLAG_TXOK2);
}
}

tmp1=__HAL_CAN_MSG_PENDING(hcan,CAN_FIFO0);
tmp2=__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_FMP0);
/*CheckEndofreceptionflagforFIFO0*/
if((tmp1!=0U)&&tmp2)
{
/*Callreceivefunction*/
CAN_Receive_IT(hcan,CAN_FIFO0);
}

tmp1=__HAL_CAN_MSG_PENDING(hcan,CAN_FIFO1);
tmp2=__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_FMP1);
/*CheckEndofreceptionflagforFIFO1*/
if((tmp1!=0U)&&tmp2)
{
/*Callreceivefunction*/
CAN_Receive_IT(hcan,CAN_FIFO1);
}

/*Seterrorcodeinhandle*/
hcan->ErrorCode|=errorcode;

tmp1=__HAL_CAN_GET_FLAG(hcan,CAN_FLAG_EWG);
tmp2=__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_EWG);
tmp3=__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_ERR);
/*CheckErrorWarningFlag*/
if(tmp1&&tmp2&&tmp3)
{
/*SetCANerrorcodetoEWGerror*/
hcan->ErrorCode|=HAL_CAN_ERROR_EWG;
}

tmp1=__HAL_CAN_GET_FLAG(hcan,CAN_FLAG_EPV);
tmp2=__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_EPV);
tmp3=__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_ERR);
/*CheckErrorPassiveFlag*/
if(tmp1&&tmp2&&tmp3)
{
/*SetCANerrorcodetoEPVerror*/
hcan->ErrorCode|=HAL_CAN_ERROR_EPV;
}

tmp1=__HAL_CAN_GET_FLAG(hcan,CAN_FLAG_BOF);
tmp2=__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_BOF);
tmp3=__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_ERR);
/*CheckBus-OffFlag*/
if(tmp1&&tmp2&&tmp3)
{
/*SetCANerrorcodetoBOFerror*/
hcan->ErrorCode|=HAL_CAN_ERROR_BOF;
}

tmp1=HAL_IS_BIT_CLR(hcan->Instance->ESR,CAN_ESR_LEC);
tmp2=__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_LEC);
tmp3=__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_ERR);
/*CheckLasterrorcodeFlag*/
if((!tmp1)&&tmp2&&tmp3)
{
tmp1=(hcan->Instance->ESR)&CAN_ESR_LEC;
switch(tmp1)
{
case(CAN_ESR_LEC_0):
/*SetCANerrorcodetoSTFerror*/
hcan->ErrorCode|=HAL_CAN_ERROR_STF;
break;
case(CAN_ESR_LEC_1):
/*SetCANerrorcodetoFORerror*/
hcan->ErrorCode|=HAL_CAN_ERROR_FOR;
break;
case(CAN_ESR_LEC_1|CAN_ESR_LEC_0):
/*SetCANerrorcodetoACKerror*/
hcan->ErrorCode|=HAL_CAN_ERROR_ACK;
break;
case(CAN_ESR_LEC_2):
/*SetCANerrorcodetoBRerror*/
hcan->ErrorCode|=HAL_CAN_ERROR_BR;
break;
case(CAN_ESR_LEC_2|CAN_ESR_LEC_0):
/*SetCANerrorcodetoBDerror*/
hcan->ErrorCode|=HAL_CAN_ERROR_BD;
break;
case(CAN_ESR_LEC_2|CAN_ESR_LEC_1):
/*SetCANerrorcodetoCRCerror*/
hcan->ErrorCode|=HAL_CAN_ERROR_CRC;
break;
default:
break;
}

/*ClearLasterrorcodeFlag*/
hcan->Instance->ESR&=~(CAN_ESR_LEC);
}

/*CalltheErrorcallBackincaseofErrors*/
if(hcan->ErrorCode!=HAL_CAN_ERROR_NONE)
{
/*ClearERRIFlag*/
hcan->Instance->MSR=CAN_MSR_ERRI;
/*SettheCANstatereadytobeabletostartagaintheprocess*/
hcan->State=HAL_CAN_STATE_READY;

/*Disableinterrupts:*/
/*-DisableErrorwarningInterrupt*/
/*-DisableErrorpassiveInterrupt*/
/*-DisableBus-offInterrupt*/
/*-DisableLasterrorcodeInterrupt*/
/*-DisableErrorInterrupt*/
/*-DisableFIFO0messagependingInterrupt*/
/*-DisableFIFO0OverrunInterrupt*/
/*-DisableFIFO1messagependingInterrupt*/
/*-DisableFIFO1OverrunInterrupt*/
/*-DisableTransmitmailboxemptyInterrupt*/
__HAL_CAN_DISABLE_IT(hcan,CAN_IT_EWG|
CAN_IT_EPV|
CAN_IT_BOF|
CAN_IT_LEC|
CAN_IT_ERR|
CAN_IT_FMP0|
CAN_IT_FOV0|
CAN_IT_FMP1|
CAN_IT_FOV1|
CAN_IT_TME);

/*CallErrorcallbackfunction*/
HAL_CAN_ErrorCallback(hcan);
}
}

最后,找到無(wú)法進(jìn)入接收中斷的原因,是CAN總線出現(xiàn)發(fā)送錯(cuò)誤的情況,從而觸發(fā)了錯(cuò)誤警告標(biāo)志位EWGF,進(jìn)而將關(guān)閉了消息掛起中斷。

總結(jié)

本文簡(jiǎn)單介紹了在STM32F407上的CAN總線調(diào)試過(guò)程,項(xiàng)目中難免會(huì)遇到各種問(wèn)題,解決之后,大家要及時(shí)做好總結(jié)和復(fù)盤(pán),技術(shù)在于積累和沉淀,相互學(xué)習(xí),共同進(jìn)步。


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

    關(guān)注

    57

    文章

    2715

    瀏覽量

    463371
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2866

    瀏覽量

    87984
  • 主控芯片
    +關(guān)注

    關(guān)注

    2

    文章

    192

    瀏覽量

    24612

原文標(biāo)題:又踩坑了!這次敗給CAN總線了

文章出處:【微信號(hào):knifewheat,微信公眾號(hào):小麥大叔】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用STM32采集電池電壓過(guò)的那些

    本文來(lái)解析一個(gè)盆友在使用STM32采集電池電壓過(guò)的。以STM32F4 的ADC屬于逐次逼近SAR 型ADC為例進(jìn)行分析,參考STM32F405xxDatasheet,對(duì)于如何編寫(xiě)ADC程序就不做描述。
    發(fā)表于 03-01 07:39

    STM32基礎(chǔ)知識(shí)入門避指南

    一STM32入門筆記——(2)無(wú)敵的我、回來(lái)了。。。。又是元?dú)鉂M滿的一天、又是崩潰的一天。昨晚上連夜把跑馬燈寄存器版本搞定
    發(fā)表于 08-03 07:30

    使用樹(shù)莓派搭建stm32開(kāi)發(fā)環(huán)境過(guò)的以及碰到的問(wèn)題

    使用樹(shù)莓派搭建stm32開(kāi)發(fā)環(huán)境很多,下面主要是記錄一下過(guò)的,以及碰到的問(wèn)題。##開(kāi)發(fā)方式的選擇1.使用Eclipse+GDB+O
    發(fā)表于 08-24 07:47

    有沒(méi)有關(guān)于STM32入門經(jīng)驗(yàn)分享

    有沒(méi)有關(guān)于STM32入門經(jīng)驗(yàn)分享
    發(fā)表于 10-13 06:52

    NodeMCU開(kāi)發(fā)板經(jīng)歷分享

    寫(xiě)在前面今天入手一個(gè)NodeMCU的板子,準(zhǔn)備學(xué)習(xí)一下物聯(lián)網(wǎng)相關(guān)的知識(shí)。不過(guò)由于博主學(xué)藝不精,在第一步燒寫(xiě)固件上就,所以就想著把自己的
    發(fā)表于 11-01 07:55

    Linux學(xué)習(xí)過(guò)程過(guò)的與如何解決

    Linux記錄記錄Linux學(xué)習(xí)過(guò)程過(guò)的與如何解決1解決方法:F10進(jìn)入BIOS使能
    發(fā)表于 11-04 08:44

    STM32編程常有哪些?

    STM32編程常有哪些?
    發(fā)表于 12-17 06:15

    Xavier入門PWM問(wèn)題解決方法

    Xavier入門PWM問(wèn)題解決方法GPIO問(wèn)題解決方法PWM問(wèn)題由于需要做外部傳感器的觸發(fā)同步,所以需要一個(gè)方波,考慮用Xavier的PWM,結(jié)果折騰好久發(fā)現(xiàn)需要配置內(nèi)部硬件,折騰
    發(fā)表于 01-10 08:11

    記錄寫(xiě)SAM4S的bootloader所

    記錄寫(xiě)SAM4S的bootloader所
    發(fā)表于 01-24 07:16

    【國(guó)民技術(shù)N32項(xiàng)目移植】匯總一下我過(guò)的那些

    充滿信心??墒?,過(guò)于信任還是不行的,果不其然,該還是。2 過(guò)的下面簡(jiǎn)單聊一聊
    發(fā)表于 02-28 16:42

    嵌入式Linux記錄

    Linux記錄記錄Linux學(xué)習(xí)過(guò)程過(guò)的與如何解決1解決方法:F10進(jìn)入BIOS使能
    發(fā)表于 11-01 17:21 ?10次下載
    嵌入式Linux<b class='flag-5'>踩</b><b class='flag-5'>坑</b>記錄

    STM32CubeIDE+FREERTOS記錄

    STM32CubeIDE+FREERTOS記錄
    發(fā)表于 12-05 18:06 ?15次下載
    STM32CubeIDE+FREERTOS<b class='flag-5'>踩</b><b class='flag-5'>坑</b>記錄

    !這次敗在CAN總線手上了!

    CAN 協(xié)議所述,錯(cuò)誤管理完全由硬件通過(guò)發(fā)送錯(cuò)誤計(jì)數(shù)器( CAN_ESR 寄存器中的 TEC 值)和接收錯(cuò)誤計(jì)數(shù)器( CAN_ESR 寄存器中的 REC 值)來(lái)處理,這兩個(gè)計(jì)數(shù)器根據(jù)錯(cuò)誤 狀況進(jìn)行遞增或遞減。
    的頭像 發(fā)表于 10-20 15:27 ?1250次閱讀
    <b class='flag-5'>踩</b><b class='flag-5'>坑</b><b class='flag-5'>了</b>,<b class='flag-5'>踩</b><b class='flag-5'>坑</b><b class='flag-5'>了</b>!<b class='flag-5'>這次</b><b class='flag-5'>又</b>敗在<b class='flag-5'>CAN</b><b class='flag-5'>總線</b>手上了!

    推挽電路的,你過(guò)沒(méi)?

    推挽電路的,你過(guò)沒(méi)?
    的頭像 發(fā)表于 11-24 16:25 ?1062次閱讀
    推挽電路的<b class='flag-5'>坑</b>,你<b class='flag-5'>踩</b>過(guò)沒(méi)?

    反相輸入放大器的,你過(guò)沒(méi)有?

    反相輸入放大器的,你過(guò)沒(méi)有?
    的頭像 發(fā)表于 12-06 15:35 ?593次閱讀
    反相輸入放大器的<b class='flag-5'>坑</b>,你<b class='flag-5'>踩</b>過(guò)沒(méi)有?