色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

踩坑了,踩坑了!這次又敗在CAN總線手上了!

硬件攻城獅 ? 來源:硬件攻城獅 ? 2023-10-20 15:27 ? 次閱讀

前言

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

目錄

CAN總線

CAN總線是一種串行通信協(xié)議,用于在微控制器和其他設(shè)備之間傳輸數(shù)據(jù)。CAN總線通常用于汽車、工業(yè)自動化機器人等領(lǐng)域。本號發(fā)過很多CAN總線干貨文章,大家可以點擊下方標題直接閱讀。

秀!靠這篇我竟然2天理解了CAN協(xié)議!

秒懂CAN總線,你學(xué)會了嗎?

CAN總線不加終端電阻,會出現(xiàn)什么后果?

為什么CAN總線最高速度為1Mbps?

從今天起,你就是CAN專家了。

3個原因告訴你,CAN為什么比RS-485更好?

詳解CAN總線協(xié)議

...更多CAN總線可以關(guān)注下方公眾號在歷史消息中搜索

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

  • 控制器區(qū)域:包括CAN控制器和CAN收發(fā)器;
  • 總線電纜:用于連接CAN總線上的所有設(shè)備;
  • 終端電阻:用于終止總線,以減少反射和信號干擾;
  • 外部電源:用于為CAN總線提供電源;
CAN總線的控制器區(qū)域通常包括CAN控制器CAN收發(fā)器
  • CAN控制器負責(zé)處理CAN總線上的數(shù)據(jù)傳輸,包括數(shù)據(jù)發(fā)送和接收、錯誤檢測和糾正等;
  • CAN收發(fā)器則負責(zé)將CAN控制器的信號轉(zhuǎn)換為總線上的電信號,并將總線上的電信號轉(zhuǎn)換為CAN控制器可以理解的信號。

CAN控制器

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

28e791a8-6f15-11ee-939d-92fbcf53809c.png

CAN收發(fā)器

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

28f827fc-6f15-11ee-939d-92fbcf53809c.png

調(diào)試過程

硬件排查

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

2901963e-6f15-11ee-939d-92fbcf53809c.png

  1. 檢查CAN控制器和CAN收發(fā)器之間是否正常;
  2. 檢查CAN收發(fā)器的差分信號是否正常,這里可能要了解一下CAN總線電平的顯性電平和隱性電平的特點,以及CAN底層協(xié)議的細節(jié),會比較復(fù)雜;
個人比較推薦使用上述步驟檢查硬件鏈路是否存在問題,那如何對數(shù)據(jù)進行分析呢?當然可以對著示波器的波形一點一點進行分析,但是這樣是很低效的,這里我建議使用CAN分析儀進行數(shù)據(jù)抓包,下面我們繼續(xù)進行介紹。

CAN分析儀

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

290c5c86-6f15-11ee-939d-92fbcf53809c.png

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

2914d2ee-6f15-11ee-939d-92fbcf53809c.png

  1. 將CAN分析儀接入到CAN總線;
  2. 將CAN分析儀連接到電腦(這里是USB接口),需要配置相同的波特率;
  3. 打開CAN分析儀配套的PC軟件,進行數(shù)據(jù)的收發(fā);291fc2ee-6f15-11ee-939d-92fbcf53809c.png ?
  4. 進行到這里,我在項目中遇到的問題是,發(fā)送正常,但是STM32F407無法接收到連續(xù)的數(shù)據(jù),可以接收到一次數(shù)據(jù),后面便無法再進入中斷。這時候,只能再芯片端進行Debug了。

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

這里的代碼用的HAL庫,庫版本相對來說比較老,是V1.7.10版本的,如下圖所示;

29325c88-6f15-11ee-939d-92fbcf53809c.png

當時我把項目升級到最新的HAL庫,發(fā)現(xiàn)CAN部分的驅(qū)動改動比較大,另外,下文都是基于V1.7.10版本的HAL庫。CAN控制器的初始化代碼如下所示;
void MX_CAN_Init(void)
{
CAN_FilterConfTypeDef  sFilterConfig;
/*CAN單元初始化*/
 hCAN.Instance = CANx;             /* CAN外設(shè) */
 hCAN.pTxMsg = &TxMessage;
 hCAN.pRxMsg = &RxMessage;
 hCAN.Init.Prescaler = 6;          /* BTR-BRP 波特率分頻器  定義了時間單元的時間長度 42/(1+6+7)/6 = 500Kbps */
 hCAN.Init.Mode = CAN_MODE_NORMAL; /* 正常工作模式 */
 hCAN.Init.SJW = CAN_SJW_1TQ;      /* BTR-SJW 重新同步跳躍寬度 1個時間單元 */
 hCAN.Init.BS1 = CAN_BS1_6TQ;      /* BTR-TS1 時間段1 占用了6個時間單元 */
 hCAN.Init.BS2 = CAN_BS2_7TQ;      /* BTR-TS1 時間段2 占用了7個時間單元 */
 hCAN.Init.TTCM = DISABLE;         /* MCR-TTCM  關(guān)閉時間觸發(fā)通信模式使能 */
 hCAN.Init.ABOM = ENABLE;          /* MCR-ABOM  自動離線管理 */
 hCAN.Init.AWUM = ENABLE;          /* MCR-AWUM  使用自動喚醒模式 */
 hCAN.Init.NART = DISABLE;         /* MCR-NART  禁止報文自動重傳   DISABLE-自動重傳 */
 hCAN.Init.RFLM = DISABLE;         /* MCR-RFLM  接收FIFO 鎖定模式  DISABLE-溢出時新報文會覆蓋原有報文 */
 hCAN.Init.TXFP = DISABLE;         /* MCR-TXFP  發(fā)送FIFO優(yōu)先級 DISABLE-優(yōu)先級取決于報文標示符 */
 HAL_CAN_Init(&hCAN);
/*CAN過濾器初始化*/
 sFilterConfig.FilterNumber = 0;                    /* 過濾器組0 */
 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;  /* 工作在標識符屏蔽位模式 */
 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; /* 過濾器位寬為單個32位。*/
/* 使能報文標示符過濾器按照標示符的內(nèi)容進行比對過濾,擴展ID不是如下的就拋棄掉,是的話,會存入FIFO0。*/
 sFilterConfig.FilterIdHigh         = 0x0000; //(((uint32_t)0x1314<<3)&0xFFFF0000)>>16;    /* 要過濾的ID高位 */
 sFilterConfig.FilterIdLow          = 0x0000; //(((uint32_t)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; /* 要過濾的ID低位 */
 sFilterConfig.FilterMaskIdHigh     = 0x0000;   /* 過濾器高16位每位必須匹配 */
 sFilterConfig.FilterMaskIdLow      = 0x0000;   /* 過濾器低16位每位必須匹配 */
 sFilterConfig.FilterFIFOAssignment = 0;           /* 過濾器被關(guān)聯(lián)到FIFO 0 */
 sFilterConfig.FilterActivation = ENABLE;          /* 使能過濾器 */ 
 sFilterConfig.BankNumber = 14;
 HAL_CAN_ConfigFilter(&hCAN, &sFilterConfig);
}
根據(jù)注釋,可以大概看懂,另外再簡單分析一下關(guān)鍵的幾點;
  • 波特率設(shè)置為 500Kbps;
  • 對報文不進行過濾,可以接收任何擴展ID的數(shù)據(jù);
雖然不進行任何過濾,但是還是無法接收到CAN回傳的數(shù)據(jù),無法進入的接收中斷;從STM32F407的編程手冊里了解到;

2939e9f8-6f15-11ee-939d-92fbcf53809c.png

不難發(fā)現(xiàn),CAN1FIFO0產(chǎn)生接收中斷需要滿足三個條件中的任意一個;
  • FMPIE01FMP01FIFO不為空會產(chǎn)生中斷
  • FFIE01FULL1FIFO滿,會產(chǎn)生中斷
  • FOVIE01FOVR01FIFO溢出,會產(chǎn)生中斷
手冊里是這樣描述的,如下圖所示;

294a9406-6f15-11ee-939d-92fbcf53809c.png

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

29527f90-6f15-11ee-939d-92fbcf53809c.png

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

295cf4ca-6f15-11ee-939d-92fbcf53809c.png2967df7a-6f15-11ee-939d-92fbcf53809c.png

所以到這里,問題有點明朗了,為什么無法進入中斷?是中斷使能位被清空了。那么下面就是檢查代碼,看看是哪里把中斷給disable了。繼續(xù)調(diào)試,發(fā)現(xiàn)在ESR寄存器中,TEC的值一直增加,然后EWGF被值1了;具體如下所示;

29742686-6f15-11ee-939d-92fbcf53809c.png

TECREC分別是發(fā)送錯誤計數(shù)器和接收錯誤計數(shù)器;
如 CAN 協(xié)議所述,錯誤管理完全由硬件通過發(fā)送錯誤計數(shù)器( CAN_ESR 寄存器中的 TEC 值)和接收錯誤計數(shù)器( CAN_ESR 寄存器中的 REC 值)來處理,這兩個計數(shù)器根據(jù)錯誤 狀況進行遞增或遞減。有關(guān) TEC 和 REC 管理的詳細信息,請參見 CAN 標準。兩者均可由軟件讀取,用以確定網(wǎng)絡(luò)的穩(wěn)定性。此外, CAN 硬件還將在 CAN_ESR 寄存器中 提供當前錯誤狀態(tài)的詳細信息。通過 CAN_IER 寄存器( ERRIE 位等),軟件可以非常靈活 地配置在檢測到錯誤時生成的中斷。
TEC大于96的時候,硬件會將EWGF1(錯誤警告標志位);在代碼中找到了相應(yīng)的宏定義;這下問題越來越清晰了。

2985cf6c-6f15-11ee-939d-92fbcf53809c.png

全文搜索這個宏定義,在HAL_CAN_IRQHandler中找到了__HAL_CAN_DISABLE_IT(CAN_IT_FMP0),關(guān)閉了FIFO0的消息掛起中斷, 整體代碼如下;
/**
  * @brief  Handles CAN interrupt request  
  * @param  hcan: pointer to a CAN_HandleTypeDef structure that contains
  *         the configuration information for the specified CAN.
  * @retval None
  */
void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan)
{
  uint32_t tmp1 = 0U, tmp2 = 0U, tmp3 = 0U;
  uint32_t errorcode = HAL_CAN_ERROR_NONE;
/* Check Overrun flag for FIFO0 */
  tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV0);
  tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FOV0);
if(tmp1 && tmp2)
  {
/* Set CAN error code to FOV0 error */
    errorcode |= HAL_CAN_ERROR_FOV0;
/* Clear FIFO0 Overrun Flag */
    __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0);
  }
/* Check Overrun flag for FIFO1 */
  tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV1);
  tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FOV1);
if(tmp1 && tmp2)
  {
/* Set CAN error code to FOV1 error */
    errorcode |= HAL_CAN_ERROR_FOV1;
/* Clear FIFO1 Overrun Flag */
    __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1);
  }
/* Check End of transmission flag */
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);
/* Check Transmit success */
if(tmp1 || tmp2 || tmp3)
      {
/* Call transmit function */
CAN_Transmit_IT(hcan);
      }
else /* Transmit failure */
      {
/* Set CAN error code to TXFAIL error */
        errorcode |= HAL_CAN_ERROR_TXFAIL;
      }
/* Clear transmission status flags (RQCPx and TXOKx) */
      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);
/* Check End of reception flag for FIFO0 */
if((tmp1 != 0U) && tmp2)
  {
/* Call receive function */
CAN_Receive_IT(hcan, CAN_FIFO0);
  }
  tmp1 = __HAL_CAN_MSG_PENDING(hcan, CAN_FIFO1);
  tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FMP1);
/* Check End of reception flag for FIFO1 */
if((tmp1 != 0U) && tmp2)
  {
/* Call receive function */
CAN_Receive_IT(hcan, CAN_FIFO1);
  }
/* Set error code in handle */
  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);
/* Check Error Warning Flag */
if(tmp1 && tmp2 && tmp3)
  {
/* Set CAN error code to EWG error */
    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); 
/* Check Error Passive Flag */
if(tmp1 && tmp2 && tmp3)
  {
/* Set CAN error code to EPV error */
    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);  
/* Check Bus-Off Flag */
if(tmp1 && tmp2 && tmp3)
  {
/* Set CAN error code to BOF error */
    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);
/* Check Last error code Flag */
if((!tmp1) && tmp2 && tmp3)
  {
    tmp1 = (hcan->Instance->ESR) & CAN_ESR_LEC;
switch(tmp1)
    {
case(CAN_ESR_LEC_0):
/* Set CAN error code to STF error */
          hcan->ErrorCode |= HAL_CAN_ERROR_STF;
break;
case(CAN_ESR_LEC_1):
/* Set CAN error code to FOR error */
          hcan->ErrorCode |= HAL_CAN_ERROR_FOR;
break;
case(CAN_ESR_LEC_1 | CAN_ESR_LEC_0):
/* Set CAN error code to ACK error */
          hcan->ErrorCode |= HAL_CAN_ERROR_ACK;
break;
case(CAN_ESR_LEC_2):
/* Set CAN error code to BR error */
          hcan->ErrorCode |= HAL_CAN_ERROR_BR;
break;
case(CAN_ESR_LEC_2 | CAN_ESR_LEC_0):
/* Set CAN error code to BD error */
          hcan->ErrorCode |= HAL_CAN_ERROR_BD;
break;
case(CAN_ESR_LEC_2 | CAN_ESR_LEC_1):
/* Set CAN error code to CRC error */
          hcan->ErrorCode |= HAL_CAN_ERROR_CRC;
break;
default:
break;
    }
/* Clear Last error code Flag */ 
    hcan->Instance->ESR &= ~(CAN_ESR_LEC);
  }
/* Call the Error call Back in case of Errors */
if(hcan->ErrorCode != HAL_CAN_ERROR_NONE)
  {
/* Clear ERRI Flag */ 
    hcan->Instance->MSR = CAN_MSR_ERRI; 
/* Set the CAN state ready to be able to start again the process */
    hcan->State = HAL_CAN_STATE_READY;
/* Disable interrupts: */
/*  - Disable Error warning Interrupt */
/*  - Disable Error passive Interrupt */
/*  - Disable Bus-off Interrupt */
/*  - Disable Last error code Interrupt */
/*  - Disable Error Interrupt */
/*  - Disable FIFO 0 message pending Interrupt */
/*  - Disable FIFO 0 Overrun Interrupt */
/*  - Disable FIFO 1 message pending Interrupt */
/*  - Disable FIFO 1 Overrun Interrupt */
/*  - Disable Transmit mailbox empty Interrupt */
    __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);
/* Call Error callback function */
    HAL_CAN_ErrorCallback(hcan);
  }  
}
最后,找到無法進入接收中斷的原因,是CAN總線出現(xiàn)發(fā)送錯誤的情況,從而觸發(fā)了錯誤警告標志位EWGF,進而將關(guān)閉了消息掛起中斷。

總結(jié)

本文簡單介紹了在STM32F407上的CAN總線調(diào)試過程,項目中難免會遇到各種問題,解決之后,大家要及時做好總結(jié)和復(fù)盤,技術(shù)在于積累和沉淀。

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

    關(guān)注

    31

    文章

    5336

    瀏覽量

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

    關(guān)注

    57

    文章

    2744

    瀏覽量

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

    關(guān)注

    10

    文章

    2878

    瀏覽量

    88052

原文標題:踩坑了,踩坑了!這次又敗在CAN總線手上了!

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    使用STM32采集電池電壓過的那些

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

    使用樹莓派搭建stm32開發(fā)環(huán)境過的以及碰到的問題

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

    有沒有關(guān)于STM32入門經(jīng)驗分享

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

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

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

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

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

    移植debian系統(tǒng)過的

    基本的linux系統(tǒng),板子的交叉編譯器是arm-linux-gnueabihf-gcc,這給我?guī)砹瞬簧俚穆闊灾劣谙胫匦乱浦惨幌耫ebian系統(tǒng)。ok,轉(zhuǎn)入正題,說說這兩天我吧。首先...
    發(fā)表于 12-14 08:42

    STM32編程常有哪些?

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

    Xavier入門PWM問題解決方法

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

    記錄寫SAM4S的bootloader所

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

    嵌入式Linux記錄

    Linux記錄記錄Linux學(xué)習(xí)過程過的與如何解決1解決方法:F10進入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總線

    個人比較推薦使用上述步驟檢查硬件鏈路是否存在問題,那如何對數(shù)據(jù)進行分析呢?當然可以對著示波器的波形一點一點進行分析,但是這樣是很低效的,這里我建議使用CAN分析儀進行數(shù)據(jù)抓包,下面我們繼續(xù)進行介紹。
    的頭像 發(fā)表于 10-12 16:47 ?1269次閱讀
    <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><b class='flag-5'>了</b>

    推挽電路的,你過沒?

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

    反相輸入放大器的,你過沒有?

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

    在學(xué)習(xí)go語言的過程過的

    作為一個5年的phper,這兩年公司和個人都在順應(yīng)技術(shù)趨勢,新項目慢慢從php轉(zhuǎn)向go語言,從2021年到現(xiàn)在,筆者手上也先后開發(fā)了兩個go項目。在學(xué)習(xí)go語言的過程中也學(xué)習(xí)并總結(jié)了一些相關(guān)的東西,這篇文章就分享下自己過的一
    的頭像 發(fā)表于 11-11 09:22 ?159次閱讀
    主站蜘蛛池模板: 中文在线日韩亚洲制服| 国产高清砖码区| 精品无人区麻豆乱码1区2| 日本在线免费播放| 在线色av| 好湿好滑好硬好爽好深视频| 肉动漫h黄动漫日本免费观看| 中文字幕乱码亚洲无线三区| 国产手机在线视频| 日本特黄网站| 99久久综合精品免费| 久色视频网| 亚洲欧美一区二区三区四区| 二级特黄绝大片免费视频大片| 男人的天堂黄色片| 伊人狼人久久精品热9| 国产一区私人高清影院| 神马老子影院午夜伦| 被男按摩师添的好爽在线直播| 毛片大片免费看| 伊人第一路线| 狠狠啪在线香蕉| 性满足久久久久久久久| 各种肉黄浪荡故事集| 欧美又粗又长又大AAAA片| 97精品免费视频| 久久香蕉国产免费天天| 一个人免费视频在线观看高清版| 国产午夜视频在线| 无套内射无矿码免费看黄| 超碰公开在线caopon| 千禧金瓶梅 快播| 99在线观看免费视频| 免费伦理片网站| 最新亚洲人成网站在线影院| 久久国产精品高清一区二区三区| 亚洲精品国产第一区第二区| 国产午夜福利100集发布| 午夜啪啪免费视频| 国产女人乱人伦精品一区二区| 无码天堂亚洲内射精品课堂|