【STM32CubeMX】11,STM32之CAN回环测试,过滤器的匹配设置

2019-08-14来源: eefocus关键字:STM32CubeMX  STM32  CAN回环测试  过滤器

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

关键字:STM32CubeMX  STM32  CAN回环测试  过滤器

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471052.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:【STM32CubeMX】10,STM32之FSMC 之TFTLCD,移植,显示变量
下一篇:【STM32CubeMX】15,NVIC,中断优先级

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32F429-DISCO上手,stm32cubeMX与IAR学习,中断及Printf

stm32f429及stm32f439已经带有LTDC控制器,意味着可以输出RGB888及RGB565的图像信号,这与以往的单片机CPU8080接口LCD有很大不同,也是入手STM32F429-DISCO的原因,价格不贵,mouser上不含税150,淘宝180,非常适合学习。STM推出了一个叫STM32CUBEMX的软件,可以用来配置将要用到的模块,配置时钟树,输出源文件,相当给力。(不过貌似也有童鞋说坑,个人觉得挺好用的)芯片选型后配置JTAG(SWD),一个HSE(8MHz),两个GPIO_OUT,一个GPIO_IRQ(都是板子上有的东西)配置时钟树,有问题的会自动标成红色,特别要记下的就是SYSCLK(系统时钟),没什么好说
发表于 2019-08-15
STM32F429-DISCO上手,stm32cubeMX与IAR学习,中断及Printf

【STM32CubeMX】15,NVIC,中断优先级

以前虽然用到了中断,但很少用到中断优先级。现在必须有了,比如急停之类的。http://www.waveshare.net/study/article-641-1.html抢占优先级是用来判断一个中断是否可以打断另外一个中断的中断服务程序抢先运行。 响应优先级是用来判断抢占优先级相同的几个中断那个中断会优先响应。中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的四个比特位分配各个优先级数字所占的位数。例如3位用于抢占优先级(优先级有2^3=8种优先级),1位用于响应优先级(优先级有2^1=2种优先级)。 中断服务函数里面就调用了GPIO外部中断处理
发表于 2019-08-14
【STM32CubeMX】15,NVIC,中断优先级

【STM32CubeMX】10,STM32之FSMC 之TFTLCD,移植,显示变量

1,学了这章之后,主要掌握了怎么移植标准库的函数2,对.c .h文件的#include文件的修改3,在LCD中,最关键的是读写命令地址的书写4,LCD的初始化可以看给的参考例程5,变量的显示sprintf函数https://baike.baidu.com/item/sprintf/9703430?fr=aladdinhttp://www.openedv.com/posts/list/61386.htm6,在stm32 例子的 c语言 程序中看到这样一句 *(__IO uint16_t *) (((uint32_t)0x60020000) ) 7,fsmc目前还没怎么操作它,看以后怎么用吧
发表于 2019-08-14
【STM32CubeMX】10,STM32之FSMC 之TFTLCD,移植,显示变量

【STM32CubeMX】3,STM32的HAL库运用小方法

1,当在hal头文件中看到该函数时,还不理解,直接复制百度就好如HAL_UART_Transmit(),有些论坛讲解的非常详细2,hal_adc.c文件一般都是详细解释,hal_adc.h文件都是关键函数的综述,这个对于快速上手非常重要
发表于 2019-08-14
【STM32CubeMX】3,STM32的HAL库运用小方法

【STM32CubeMX】2,STM32CubeMX常用的自动生成函数

1,在#include "stm32f1xx_hal.h" 的头文件中,常用     void HAL_Delay(uint32_t Delay);2,GPIO.Hvoid  HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);void  HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx
发表于 2019-08-14
【STM32CubeMX】2,STM32CubeMX常用的自动生成函数

stm32CAN波特率计算小程序(QT源码)

软件:Qt Creator开发环境:Window7用qt做得一个计算波特率的小程序,在实际的应用中我们设置波特率的时候是通过以下参数来定的:CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;CAN_InitStructure.CAN_BS2=CAN_BS2_6tq;CAN_InitStructure.CAN_Prescaler=5;波特率计算小程序的截图:   根据所需的的采样点、波特率以及错误率得到以上外设初始化所需的参数。据网上资料,采样点的设置有以下规律:75%   
发表于 2019-08-20
stm32CAN波特率计算小程序(QT源码)

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved