1.初始化CAN参数

/* CAN init function */
void MX_CAN_Init(void)
{
  CAN_FilterConfTypeDef filter;
  hcan.Instance = CAN1;
  hcan.Init.Prescaler = 3;
//  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.Mode = CAN_MODE_LOOPBACK;
  hcan.Init.SJW = CAN_SJW_1TQ;
  hcan.Init.BS1 = CAN_BS1_12TQ;
  hcan.Init.BS2 = CAN_BS2_2TQ;
  hcan.Init.TTCM = DISABLE;
  hcan.Init.ABOM = DISABLE;
  hcan.Init.AWUM = DISABLE;
  hcan.Init.NART = DISABLE;
  hcan.Init.RFLM = DISABLE;
  hcan.Init.TXFP = ENABLE;

//在cube生成的基础上添加以下三项,用于保存收发的内容
  hcan.pTxMsg = &CAN_TX_MSG;  //用于保存要发送的内容
  hcan.pRxMsg = &CAN_RX0_MSG;  //对应fifo0接收
  hcan.pRx1Msg = &CAN_RX1_MSG; //对应fifo1接收
  if (HAL_CAN_Init(&hcan) != HAL_OK)  
  {
    _Error_Handler(__FILE__, __LINE__);
  }

filter.FilterNumber=1;
  filter.FilterMode=CAN_FILTERMODE_IDMASK;
  filter.FilterScale=CAN_FILTERSCALE_32BIT;
  filter.FilterIdHigh=0x0000;
  filter.FilterIdLow=0x0000;
  filter.FilterMaskIdHigh=0x0000;
  filter.FilterMaskIdLow=0x0000;
  filter.FilterFIFOAssignment=CAN_FIFO0;
  filter.FilterActivation=ENABLE;
 
  if(  HAL_CAN_ConfigFilter(&hcan,&filter) != HAL_OK) //刚开始因为没有加过滤配置,导致数据一直收不到,所以接收中断进不去。
  {
      Error_Handler();
  }
    
  if(HAL_CAN_Receive_IT(&hcan,CAN_FIFO0) != HAL_OK) // 打开接收中断(注意cube自动生成的中断处理会再次清除中断使能,所以只能接受一次,想要反复接收每次接收万要重新打开)
  {
      Error_Handler();
  }
}

2.初始化IO

void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
{

GPIO_InitTypeDef GPIO_InitStruct;
  if(canHandle->Instance==CAN1)
  {
  /* USER CODE BEGIN CAN1_MspInit 0 */

/* USER CODE END CAN1_MspInit 0 */
    /* CAN1 clock enable */
    __HAL_RCC_CAN1_CLK_ENABLE();
 
    /**CAN GPIO Configuration    
    PB8     ------> CAN_RX
    PB9     ------> CAN_TX
    */
    GPIO_InitStruct.Pin = CAN_RX_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(CAN_RX_GPIO_Port, &GPIO_InitStruct);

GPIO_InitStruct.Pin = CAN_TX_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(CAN_TX_GPIO_Port, &GPIO_InitStruct);

__HAL_AFIO_REMAP_CAN1_2(); //参考手册,PB8,PB9要重映射IO

/* CAN1 interrupt Init */
    HAL_NVIC_SetPriority(USB_HP_CAN1_TX_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USB_HP_CAN1_TX_IRQn);
    HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
//    HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 0, 0);        //结合上面初始化,这里FIFO1的中断用不上
//    HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);
//    HAL_NVIC_SetPriority(CAN1_SCE_IRQn, 0, 0);
//    HAL_NVIC_EnableIRQ(CAN1_SCE_IRQn);
  /* USER CODE BEGIN CAN1_MspInit 1 */

/* USER CODE END CAN1_MspInit 1 */
  }
}

3.发送

     hcan.pTxMsg->StdId=0x00;    
            hcan.pTxMsg->ExtId=0x0000;
            hcan.pTxMsg->IDE=CAN_ID_EXT;
            hcan.pTxMsg->RTR=CAN_RTR_DATA;
            hcan.pTxMsg->DLC=2;
            hcan.pTxMsg->Data[0]=0x12;
            hcan.pTxMsg->Data[1]=0x89;
            hal_status = HAL_CAN_Transmit_IT(&hcan); //用这个不会卡死
            if(hal_status != HAL_OK)
            {
                Error_Handler();
            }

4.关于SCE中断,不是很了解,后面再更新吧。

5.重点摘要,用于帮助制定通讯协议。要关注过滤寄存器,屏蔽寄存器。

在当今的CAN应用中, CAN网络的节点在不断增加,并且多个CAN常常通过网关连接起来,因
此整个CAN网中的报文数量(每个节点都需要处理)急剧增加。除了应用层报文外,网络管理和诊
断报文也被引入。
● 需要一个增强的过滤机制来处理各种类型的报文(注:过滤机制就是为了应对报文数量太多的痛点)

此外,应用层任务需要更多CPU时间,因此报文接收所需的实时响应程度需要减轻。
● 接收FIFO的方案允许CPU花很长时间处理应用层任务而不会丢失报文 (注:FIFO是为了缓解CPU接收报文所需的实时响应的程度)

屏蔽位模式
在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照
“必须匹配”或“不用关心”处理。

标识符列表模式
在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一
个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符
相同。

应用程序选择1个空置的发送邮箱;设置标识符,数据长度和待发送数据;
然后对CAN_TIxR寄存器的TXRQ位置’1’,来请求发送。 TXRQ位置’1’后,邮箱就不再是空邮
箱,软件对邮箱寄存器就不再有写的权限。 TXRQ位置1后,邮箱马上
进入挂号状态,并等待成为最高优先级的邮箱 。一旦邮箱成为最高优先级的
邮箱,其状态就变为预定发送状态。一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马
上被发送(进入发送状态)。一旦邮箱中的报文被成功发送后,它马上变为空置邮箱 。

当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。如果标识符的值相等,那么邮箱号小的报文先被发送。

在接收一个报文时,其标识符首先与配置在标识符列表模式下的过滤器相比较;如果匹配上,报文就被存放到相关联的FIFO中,并且所匹配的过滤
器的序号被存入过滤器匹配序号中。如同例子中所显示,报文标识符跟#4标识符匹配,因此报文内容和FMI4被存入FIFO。
如果没有匹配,报文标识符接着与配置在屏蔽位模式下的过滤器进行比较。
如果报文标识符没有跟过滤器中的任何标识符相匹配,那么硬件就丢弃该报文,且不会对软件
有任何打扰

转载于:https://www.cnblogs.com/zhanghonglang/p/8919181.html

stm32 can bus 总结相关推荐

  1. STM32与Futaba遥控器进行S.Bus的通讯程序

    Futaba(日本双叶电子工业,戏称"扶他爸")的遥控器用航模中使用较为广泛的遥控器.S.Bus则是Futaba公司提出的舵机控制总线.本篇博文主要以T6K为对象,介绍STM32与 ...

  2. i2c hid 触摸板不能用_I2C 总线协议初探 - STM32 I2C 接口外设学习笔记

    I2C(Inter-Integrated Circuit)总线是由 PHILIPS(飞利浦) 公司开发的两线式串行总线,用于连接微控制器及其外围设备.是微电子通信控制领域广泛采用的一种总线标准.它是同 ...

  3. 004:STM32启动文件详解及SystemInit函数分析(转)

    1 ;先在RAM中分配系统使用的栈,RAM的起始地址为0x2000_0000 2 ;然后在RAM中分配变量使用的堆 3 ;然后在CODE区(flash)分配中断向量表,flash的起始地址为0x080 ...

  4. STM32启动文件分析

    相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化. ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一 ...

  5. python stm32-尝试一下使用Python来开发STM32

    MicroPython是什么 微信图片_20200508183121.jpg (26.41 KB, 下载次数: 0) 2020-5-8 18:39 上传 程序猿中有句俗语: 人生苦短,我用Python ...

  6. STM32 电机教程 23 - ST MCLIB实战之基于stm32f13c8tx构建FOC工程

    前言 前面章节我们介绍了很多关于ST MotorControl Workbench的使用及实例 ,但是所有的实例均是基于ST的NUCLEO-F103RB和X-NUCLEO-IHM07M1 3SH开发板 ...

  7. STM32 基础系列教程 24 - USB_HID_key

    前言 学习stm32 USB接口使用,学会用CUBE工具快速创建USB设备工程及调试,关于usb的相关知道请读者提前准备并学习,当然如果不想深究其中原理的话,跟着本文来操作就可以实现基于USB的设备开 ...

  8. STM32’s I2C 硬件BUG引发的血案

    2010-4-8 1: 45 下面的函数中有一个BUG, 也就是SR2不能用WHILE来轮询,而应直接读出.如下面代码段,因此,在这里说的这是STM32的BUG其实是我的代码的错误:     I2C2 ...

  9. STM32启动文件详解及SystemInit函数分析

    1 ;先在RAM中分配系统使用的栈,RAM的起始地址为0x2000_0000 2 ;然后在RAM中分配变量使用的堆 3 ;然后在CODE区(flash)分配中断向量表,flash的起始地址为0x080 ...

最新文章

  1. usaco window arear(递归求矩形覆盖面积)
  2. 怎样用批处理来执行多个exe文件
  3. 怎么提取html的数据,如何提取网页数据
  4. React中后台管理系统添加广告分类显示不出来
  5. ASP.NET 3.5中的ListView控件和DataPager控件(一)
  6. Android 以太网转 WiFi 热点 (并在同一网段 192.168.0.xx)
  7. 反编译那些事儿(三)—那些看似没用到的全局变量和那些使用了动态参数的方法
  8. Android 端 Rsa加密数据
  9. 同济大学 线性代数 第六版 pdf_同济版线性代数(第六版)教材课后习题解答与综合测试...
  10. php百度知道小偷,随风百度知道(小偷采集) php版 v2.0.0X
  11. 爬虫中proxies小分享
  12. 耿建超英语语法---陈述句(2)
  13. 捍卫者usb管理控制系统_捍卫效用优先CSS
  14. java 包含文件_java 文件夹拷贝(文件夹里包含文件和文件夹) 代码
  15. 第一章 数据资产的定义
  16. 人脸扫描建模_人脸识别中的特征建模方法与流程
  17. Pnet抓包工具Wireshark提示end of file on pipemagic during open
  18. Linux常用命令大全(史上最全)建议收藏!
  19. 谈谈对Spring IOC(控制反转)的理解--转
  20. GT 745M表现如何 华硕A450J性能探秘

热门文章

  1. Learning to Rank简介
  2. 梯度方向直方图和物体检测Histogram of Oriented Gradients and Object Detection
  3. Coursera课程Python for everyone:Quiz: Multi-Table Relational SQL
  4. C++实用技巧(三)
  5. 10道C++输出易错笔试题收集
  6. git和码云的使用以及搭建git服务器
  7. 4.50Nginx负载均衡
  8. exportfs命令、NFS客户端问题、FTP介绍、使用vsftpd搭建ftp
  9. 开发自己的区块链基础功能篇
  10. string类assign方法