1. stm32 CAN通信标准库函数

//CAN通信初始化函数
uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct);
//筛选器初始化函数
void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct);
//发送信息函数
uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage);
//发送信息状态函数
uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox);
//接收信息函数
void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage);
//CAN通信中断使能函数
void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState);
//状态有关的函数
FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG);
void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG);
ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT);
void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT);

2. 利用标准库进行初始化

/*
CAN_TX:PB_13
CAN_RX:PB_12
*/
void CAN_Config(void)
{
//定义初始化所需结构体变量
CAN_InitTypeDef CAN_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//开启所用的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
//引脚复用
GPIO_PinAFConfig(GPIOB,GPIO_Pin_13,GPIO_AF_CAN2);
GPIO_PinAFConfig(GPIOB,GPIO_Pin_12,GPIO_AF_CAN2);
//GPIO初始化
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;//复用模式
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;//推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;//默认上拉
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//输出速率
GPIO_Init(GPIOB,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
//CAN初始化
CAN_InitStruct.CAN_ABOM=ENABLE;//是否使能ABOM自动离线管理功能
CAN_InitStruct.CAN_AWUM=ENABLE;//是否使能AWUM自动唤醒功能
CAN_InitStruct.CAN_NART=ENABLE;//是否使能NART自动重传功能
CAN_InitStruct.CAN_RFLM=DISABLE;//是否使能RFLM锁定功能
CAN_InitStruct.CAN_TTCM=DISABLE;//是否使能TTCM时间触发功能
CAN_InitStruct.CAN_TXFP=DISABLE;//配置TXFP报文优先级的判定方法
CAN_InitStruct.CAN_Mode=CAN_Mode_LoopBack;//回环模式
CAN_InitStruct.CAN_Prescaler=6;//配置CAN外设的时钟分频,可设置1-1024
CAN_InitStruct.CAN_SJW=CAN_SJW_2tq;//配置SJW极限值
CAN_InitStruct.CAN_BS1=CAN_BS1_4tq;//配置BS1段长度
CAN_InitStruct.CAN_BS2=CAN_BS2_2tq;//配置BS2段长度
CAN_Init(CAN2,&CAN_InitStruct);
//开启中断使能
CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);
//配置中断向量
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStruct.NVIC_IRQChannel=CAN2_RX0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStruct); }

3. 筛选器初始化

void CAN_Filter(void)
{
CAN_FilterInitTypeDef CAN_FilterInitStruct; CAN_FilterInitStruct.CAN_FilterNumber=14;//筛选器编号
CAN_FilterInitStruct.CAN_FilterScale=CAN_FilterScale_32bit;//设置筛选器的尺度
CAN_FilterInitStruct.CAN_FilterMode=CAN_FilterMode_IdMask;//掩码模式
CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//设置经过筛选后数据存储到那个接收器
CAN_FilterInitStruct.CAN_FilterActivation=ENABLE;//是否使能筛选器 CAN_FilterInitStruct.CAN_FilterIdHigh= (((uint32_t)0x1314<<3|CAN_Id_Extended|CAN_RTR_Data)&0xFFFF0000);//CAN_FxR1寄存器的高16位
CAN_FilterInitStruct.CAN_FilterIdLow=(((uint32_t)0x1314<<3|CAN_Id_Extended|CAN_RTR_Data)&0x0000FFFF);//CAN_FxR1寄存器的低16位
CAN_FilterInitStruct.CAN_FilterMaskIdHigh=0xFFFF;CAN_FxR2寄存器的高16位
CAN_FilterInitStruct.CAN_FilterMaskIdLow=0xFFFF;CAN_FxR2寄存器的低16位 CAN_FilterInit(&CAN_FilterInitStruct);
}

4. 发送数据

uint8_t mail_box;
CanTxMsg TxMessage; TxMessage.StdId=0;//标准格式为0 ,使用扩展格式
TxMessage.ExtId=0x1314;//使用扩展格式
TxMessage.IDE=CAN_Id_Extended;//配置使用标准格式还是扩展格式
TxMessage.RTR=CAN_RTR_Data;//配置是数据帧还是遥控帧
TxMessage.DLC=8;//发送的数据长度
for(i=0;i<8;i++)
{
TxMessage.Data[i]=data[i];//存放数据
}
mail_box = CAN_Transmit(CAN2,&TxMessage);

5. 接收数据

//在终端中进行接收
void CAN2_RX0_IRQHandler(void)
{
if(CAN_GetITStatus(CAN2,CAN_IT_FMP0)==SET)
{
CAN_Receive(CAN2, CAN_FIFO0,&RxMessage);
printf("RxMessage.StdId:%x\r\n" ,RxMessage.StdId);
printf("RxMessage.ExtId:%x\r\n" ,RxMessage.ExtId);
printf("RxMessage.IDE:%x\r\n" ,RxMessage.IDE);
printf("RxMessage.RTR:%x\r\n" ,RxMessage.RTR);
printf("RxMessage.DLC:%x\r\n" ,RxMessage.DLC);
for(i=0;i<RxMessage.DLC;i++)
{
printf("RxMessage.Data[i]:%x\r\n",RxMessage.Data[i]);
}
}
}

初学STM32 CAN通信(三)的更多相关文章

  1. Stm32串口通信(USART)

    Stm32串口通信(UART) 串口通信的分类 串口通信三种传递方式 串口通信的通信方式 串行通信的方式: 异步通信:它用一个起始位表示字符的开始,用停止位表示字符的结束.其每帧的格式如下: 在一帧格 ...

  2. Stm32高级定时器(三)

    Stm32高级定时器(三) 1 互补输出和死区插入 1.1 死区:某个处于相对无效状态的时间或空间 本来OCX信号与OCXREF时序同相同步,OCXN信号与OCXREF时序反相同步.但为了安全考虑,以 ...

  3. STM32 串口通信使用奇偶校验

    STM32串口通信如果使用奇偶校验,需要设置数据位长度为9bit USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USAR ...

  4. STM32串口通信UART使用

    STM32串口通信UART使用 uart使用的过程为: 1. 使能GPIO口和UART对应的总线时钟 2. 配置GPIO口的输出模式 3. 配置uart口相关的基本信息 4. 使能uart口的相关的中 ...

  5. STM32 USB-HID通信移植步骤

    大家可以使用压缩包中的UsbApp.exe调试本软件idVendor为:0483  idProduct为5750. 今天太晚了,明天还要上半天班,上位机软件找个时间在写一篇文章.请关注我的博客.压缩包 ...

  6. stm32串口通信实验,一点笔记

    第一次深入学习stm32,花了好长时间才看懂代码(主要是C语言学习不够深入),又花了段时间自己敲了一遍,然后比对教程,了解了利用中断来串口通信的设置方法. 板子是探索版f407,本实验工程把正点原子库 ...

  7. stm32之通信

    本文提到的内容有以下几个方面: 通信概述 串口通信 I2C通信 CAN通信 SPI通信 I2S通信 USB通信 其他通信 一.通信概述 按照数据传送方式分: 串行通信(一条数据线.适合远距离传输.控制 ...

  8. STM32串口通信配置(USART1+USART2+USART3+UART4) (转)

    一.串口一的配置(初始化+中断配置+中断接收函数) 1 /*====================================================================== ...

  9. iOS开发之使用XMPPFramework实现即时通信(三)

    你看今天是(三)对吧,前面肯定有(一)和(二),在发表完iOS开发之使用XMPPFramework实现即时通信(一)和iOS开发之使用XMPPFramework实现即时通信(二)后有好多的小伙伴加我Q ...

  10. 半吊子的STM32 — SPI通信

    全双工,同步串行通信. 一般需要三条线通信: MOSI 主设备发送,从设备接收 MISO 主设备接收,从设备发送 SCLK 时钟线 多设备时,多线选取从机: 传输过程中,主从机中的移位寄存器中数据相互 ...

随机推荐

  1. 《系列一》-- 2、XmlBeanFactory 的类图介绍.md

    阅读之前要注意的东西:本文就是主打流水账式的源码阅读,主导的是一个参考,主要内容需要看官自己去源码中验证.全系列文章基于 spring 源码 5.x 版本. Spring源码阅读系列--全局目录.md ...

  2. 【LeetCode滑动窗口专题】水果成篮 + 最小覆盖子串(hard)+ 字符串的排列

    二刷刷到滑动窗口,发现有一些细节和遗漏,在此补充 实际上关于滑动窗口的题还有一题:最小长度的子数组 进入正题 水果成篮 LeetCode904水果成篮 你正在探访一家农场,农场从左到右种植了一排果树. ...

  3. 【Azure 事件中心】Kafka 生产者发送消息失败,根据失败消息询问机器人得到的分析步骤

    问题描述 Azure Event Hubs -- Kafka 生产者发送消息存在延迟接收和丢失问题, 在客户端的日志中发现如下异常: 2023-06-05 02:00:20.467 [kafka-pr ...

  4. Jmeter参数化-用户自定义变量

    一  首先我们先来了解下jmeter 做参数化的目的: 1通过参数化来集中管理配置和测试数据 2通过参数化实现数据驱动测试 二 线程组添加配置元件中的用户自定义变量 添加变量名称,变量值 三 使用变量 ...

  5. Java 异常处理(2) : 异常处理的方式二:throws + 异常类型

    1 package com.bytezero.throwable; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 impor ...

  6. centos 7与8修改主机名的各种方法

    hostname 查看当前系统主机名,知道当前主机名为localhost 当然在centos7特地添加了hostnamectl命令查看,修改主机名 使用hostnamectl set-hostname ...

  7. 通过debug搞清楚.vue文件怎么变成.js文件

    前言 我们每天写的vue代码都是写在vue文件中,但是浏览器却只认识html.css.js等文件类型.所以这个时候就需要一个工具将vue文件转换为浏览器能够认识的js文件,想必你第一时间就想到了web ...

  8. vagrant 多个box的操作|共享目录失败

    本来机器上已经有一个Ubuntu的box了,今天想在安装一个centos的box,结果还折腾了很长时间. 多个机器的命令 添加box的时候需要使用名称,一个的时候可以忽略名称 vagrant box ...

  9. 分支合并规则 dev master v1.0.XX 三条分支的合并原则

    分支合并规则 dev master v1.0.XX 三条分支的合并原则

  10. Android Studio批量打渠道包

    原文: Android Studio批量打渠道包 - Stars-One的杂货小窝 公司项目渠道包越来越大,每次发版本都是开发人员打包,研究了下如何批量打渠道包,记录过程 步骤 1.gradle配置 ...