1. 程式人生 > >【STM32CubeMX】11,STM32之CAN迴環測試,過濾器的匹配設定,FIFO與過濾器的關聯

【STM32CubeMX】11,STM32之CAN迴環測試,過濾器的匹配設定,FIFO與過濾器的關聯

1,因為自己目前只有一塊板子有CAN模組,所以先做CAN的迴環測試。

主要參考http://www.stm32cube.com/question/33

下面的程式碼測試可以使用

1-1,在CAN的程式設計中,主要是注意四大結構體,這幾個都是自動生成的,

1、CAN_HandleTypeDef  hcan1;// CAN handle Structure definition首先定義CAN的處理結構體,hcan1內部包括了

3、CanTxMsgTypeDef; 4、CanRxMsgTypeDef;的頭地址

2、CAN_FilterConfTypeDef  sFilterConfig;// CAN filter configuration structure definition需要學會怎麼配置配置過濾器

3、CanTxMsgTypeDef;//CAN Tx message structure definition  //can的傳送配置,主要是Stdld標準識別符號,Extld標準擴充套件識別符號,IDE標準幀與擴充套件幀的區別,RTR資料幀或遙控幀,DLC資料幀的長度,data[]要傳送的資料段的內容,最大8個位元組

4、CanRxMsgTypeDef;  //CAN Rx message structure definition//除了傳送CAN中的引數,還包括FMI過濾器的編號,FIFONumber的編號。

1-2,CAN的傳送與接收模式與以前的串列埠,I2C,FLASH都有區別。

can的傳送是HAL_CAN_Transmit(&hcan1, 10),在字面上並不指定傳送資料的陣列,而是傳送的是一個結構體,包含的資訊更多,如stdld,IDE,DLC,data[]等等。

但hcan1->Data中實際就是包含的陣列值.

同理可以看到can 的接收函式(HAL_CAN_Receive(&hcan, CAN_FIFO0,10),也是一樣的分析

1-3,簡單的傳送可以封裝函式


1-4,註釋


1-5,hal_can.h常用函式

/** @addtogroup CAN_Exported_Functions_Group1
  * @brief    Initialization and Configuration functions 
  * @{
  */
/* Initialization and de-initialization functions *****************************/
HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan);
HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef* hcan, CAN_FilterConfTypeDef* sFilterConfig);
HAL_StatusTypeDef HAL_CAN_DeInit(CAN_HandleTypeDef* hcan);
void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan);
void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan);
/**
  * @}
  */


/** @addtogroup CAN_Exported_Functions_Group2
  * @brief    I/O operation functions 
  * @{
  */
/* I/O operation functions *****************************************************/
HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef *hcan, uint32_t Timeout);
HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef *hcan);
HAL_StatusTypeDef HAL_CAN_Receive(CAN_HandleTypeDef *hcan, uint8_t FIFONumber, uint32_t Timeout);
HAL_StatusTypeDef HAL_CAN_Receive_IT(CAN_HandleTypeDef *hcan, uint8_t FIFONumber);
HAL_StatusTypeDef HAL_CAN_Sleep(CAN_HandleTypeDef *hcan);
HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan);
void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan);
void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan);
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan);
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan);
/**

1-6 測試函式

/* USER CODE BEGIN 1 */
HAL_StatusTypeDef CAN_Polling(void)
{
  CAN_FilterConfTypeDef  sFilterConfig;
  static CanTxMsgTypeDef        TxMessage;
  static CanRxMsgTypeDef        RxMessage;
 
  hcan.pTxMsg = &TxMessage;//²é¿´CAN_HandleTypeDefµÄ¶¨Ò壬pTxMsgÊÇÒ»¸ö½á¹¹ÌåÖ¸Õë
  hcan.pRxMsg = &RxMessage;

  //Configure the CAN Filter 
  sFilterConfig.FilterNumber = 0;
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  sFilterConfig.FilterIdHigh = 0x0000;
  sFilterConfig.FilterIdLow = 0x0000;
  sFilterConfig.FilterMaskIdHigh = 0x0000;
  sFilterConfig.FilterMaskIdLow = 0x0000;
  sFilterConfig.FilterFIFOAssignment = 0;//???????FIFO?,0??1,??????FIFO0
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.BankNumber = 14;
  
  if(HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  {
  //[i] Filter configuration Error [/i]/
Error_Handler();
  }
    
  //3- Start the Transmission process 
  hcan.pTxMsg->StdId = 0x11;      //Ö¸¶¨±ê×¼±êʶ·û£¬0-0X7FF
  hcan.pTxMsg->RTR = CAN_RTR_DATA; //RTR,Çø·ÖÊý¾ÝÖ¡»¹ÊÇÒ£¿ØÖ¡£¬´Ë´¦ÎªÊý¾ÝÖ¡
  hcan.pTxMsg->IDE = CAN_ID_STD;//Çø±ð±ê×¼Ö¡ºÍÀ©Õ¹Ö¡£¬#define CAN_ID_EXT                  0x00000004U  /*!< Extended Id */
  hcan.pTxMsg->DLC = 2;//ÉèÖÃÊý¾ÝÖ¡Êý¾Ý³¤¶È£¬·¶Î§0-8
  hcan.pTxMsg->Data[0] = 0xCA;//µÚÒ»¸ö×Ö½ÚÊý¾Ý
  hcan.pTxMsg->Data[1] = 0xFE;//µÚ¶þ¸ö×Ö½ÚÊý¾Ý
  
  if(HAL_CAN_Transmit(&hcan, 10) != HAL_OK)//timeout 10ms
  {
    //²é¿´´«ÊäÊÇ·ñ³¬Ê±£¬³¬Ê±µãÁÁºìÉ«LED
HAL_GPIO_WritePin (GPIOB,GPIO_PIN_5,GPIO_PIN_RESET );
while(1);
  }
  
  if(HAL_CAN_GetState(&hcan) != HAL_CAN_STATE_READY)
  {
    return HAL_ERROR;
  }
  
//4- Start the Reception process 
  if(HAL_CAN_Receive(&hcan, CAN_FIFO0,10) != HAL_OK)//ÉÏÃ涨ÒåÁËFIFO0
  {
   //Reception Error 


HAL_GPIO_WritePin (GPIOB,GPIO_PIN_5,GPIO_PIN_RESET );
while(1);
  }
  
  if(HAL_CAN_GetState(&hcan) != HAL_CAN_STATE_READY)
  {
    return HAL_ERROR;
  }
  



  if (hcan.pRxMsg->StdId != 0x11)//½ÓÊÕµ½µÄÊý¾Ý±êʶ·û
  {
printf ("CAN1 Loopback fause !/r/n");
    return HAL_ERROR;  
  }


  if (hcan.pRxMsg->IDE != CAN_ID_STD)//??????????
  {
    return HAL_ERROR;
  }


  if (hcan.pRxMsg->DLC != 2)//????????
  {
    return HAL_ERROR;  
  }


  if ((RxMessage.Data[0]<<8|RxMessage.Data[1]) != 0xCAFE)
  {
    return HAL_ERROR;
  }
  
  return HAL_OK; //[i] Test Passed [/i]/
}

/* USER CODE END 1 */

1-7,過濾器的匹配設定

https://blog.csdn.net/houqi02/article/details/51545967

https://blog.csdn.net/bonson2004/article/details/68942442



1-8,FIFO與過濾器的關聯

http://www.openedv.com/posts/list/43984.htm


相關推薦

STM32CubeMX11STM32CAN測試過濾器匹配設定FIFO過濾器關聯

1,因為自己目前只有一塊板子有CAN模組,所以先做CAN的迴環測試。主要參考http://www.stm32cube.com/question/33下面的程式碼測試可以使用1-1,在CAN的程式設計中,主要是注意四大結構體,這幾個都是自動生成的,1、CAN_HandleTyp

STM32CubeMX1STM32GPIO埠輸入模式配置

主要參考這兩篇文章https://blog.csdn.net/flaming999/article/details/52487904https://blog.csdn.net/kevinhg/article/details/174902732、推輓輸出與開漏輸出的區別推輓輸出

STM32CubeMX5STM32ADC

1,初步配置。對於滑動變阻器的電壓輸出 還有就是printf、scanf的重定向,在uart.c中 int fputc (int ch ,FILE *f) { HAL_UART_Transmit(&huart1,(uint8_t *)&ch,

Python11、python內置數據結構字典

dict一、字典1、字典的初始化 字典是一種key-value結構In [160]: d = {} In [161]: type(d) Out[161]: dict In [166]: d = {‘a‘:1, ‘b‘:2} In [167]: d Out[167]: {‘a‘: 1, ‘b‘:

Flask增加使用者體驗 abort和@errorhandler裝飾器自定義錯誤頁面和資訊

一、abort函式 概念:flask中的異常處理語句,功能類似於python中raise語句,只要觸發abort,後面的程式碼不會執行,abort只能丟擲符合http協議的異常狀態碼(不同於return可以返回自定義狀態碼,這裡不做討論)。 應用場景:一般用來實現自定義的錯誤資訊,讓程式

LEDEx86軟路由路-10-都能用Docker了LXC還遠嗎?

opkg install gnupg-utils opkg install gnupg opkg install kmod-veth opkg install lscpu opkg find lxc* | cut -d ' ' -f 1 | xargs opkg in

docker效能優化-redis主從複製第一次準備

主從複製說明  面臨問題 在實際的場景當中單一節點的redis容易面臨風險。 比如: 1、機器故障。我們部署到一臺 Redis 伺服器,當發生機器故障時,需要遷移到另外一臺伺服器並且要保證資料是同步的。而資料是最重要的,如果你不在乎,基本上也就不會使用 Redis 了。

Android安卓開發activity如何傳值到fragmentactivityfragment傳值

作者:程式設計師小冰,GitHub主頁:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 大家知道,我們利用acti

ShiroApache Shiro架構身份認證(Authentication)

trac pretty asm 安全保障 軟件測試 釋放 model tac 讀取配置文件 Shiro系列文章: 【Shiro】Apache Shiro架構之權限認證(Authorization) 【Shiro】Apache Shiro架構之集成web

Mysql經常使用指令——忘記password

my.cnf 執行cmd mysql blank lan service 重裝 授權 環境變量 上一篇文章基本總結了下myql下通過指令怎麽創建用戶。詳見:【Mysql】經常使用指令之——用戶操作(創建,授權,改動。刪除) 今天說下特殊情況,忘記passw

Python11、集合字典的實現

python一、字典的實現dict是在list之上實現的 i(索引) = hash(key) % solt(槽位數)此時i重復了怎麽辦(hash沖突)?1、拉鏈法 每個槽位上拉一個List,就是拉鏈法2、開地址法 使用某個算法重新計算i,就交開地址法 常用,效率更高,i = fn(key, i)【Pyt

JavaSE--網絡安全證書、密鑰、密鑰庫等名詞解釋

detail 發的 都是 base64 request 服務器 win art ive 轉載:http://www.cnblogs.com/alanfang/p/5600449.html 那些證書相關的名詞解釋(SSL,X.509,PEM,DER,CRT,CER,KEY,

Effective C#觀後感提高Unity中C#代碼質量的21條準則

們的 嚴格 知識 將不 實現接口 控制流程 effect 序列 狀態 轉自:http://blog.csdn.net/swj524152416/article/details/75418162 我們知道,在C++領域,作為進階閱讀材料,必看的書是《Effective C++

中文分詞HMM模型詳解

實現 含義 jieba 順序 清晰 bsp 中國 matrix 統計 關於HMM模型的介紹,網上的資料已經爛大街,但是大部分都是在背書背公式,本文在此針對HMM模型在中文分詞中的應用,講講實現原理。 盡可能的撇開公式,撇開推導。結合實際開源代碼作為例子,爭取做到雅俗共賞,

AIX系統錯誤--磁盤錯誤

scsi 系統 article root into flag wsh digg kaa AIX系統錯誤之--磁盤錯誤 來源:http://blog.csdn.net/yujin2010good/article/details/40075485 系統環境: 操作系統

學習Unity手遊路<十二>手遊資源熱更新策略探討

似的 remove 方式 comment word rep 熱更新 style encoding http://blog.csdn.net/janeky/article/details/17666409 =================================

轉載python3安裝scrapywindows32位爬坑

命令 cep 3.2 wheel 跳過 。。 學習 自己的 打開 python3安裝scrapy之windows32位爬坑 原創 2016年11月06日 01:38:08 標簽: scrapy / windows / python / 開源框架 / 網絡爬蟲

文件下載斷點續傳(客戶端服務端的實現)

http協議 當前時間 end box [] ada demo 服務端 sem 【轉】文件下載之斷點續傳(客戶端與服務端的實現) 【轉】文件下載之斷點續傳(客戶端與服務端的實現) 前面講了文件的上傳,今天來聊聊文件的下載。 老規矩,還是從最簡單粗暴的開始。那麽多簡單算簡單

javascriptjavascript設計模式單例模式

函數 設置 tin 私有 資源 公有 key fun 初始化 單例模式: 定義:單例模式之所以這麽叫,是因為它限制一個類只能有一個實例化對象。 實現方法:判斷實例是否存在,如果存在則直接返回,如果不存在就創建了再返回。(確保一個類只有一個實例對象) 特點: 命名空間提供者,

javascriptjavasrcipt設計模式策略模式

影響 配置 可能 pan style 類庫 ava 自由 AC 策略模式支持在運行時由使用者選擇合適的算法,對於使用者而言不用關心背後的具體事項,而使用者自動根據當前程序執行的上下文和配置,從已有的算法列表中選擇出合適的算法來處理當前任務。 1.要解決的問題 2.如何實現