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. Java中的POJO是什么?

    1.介绍 在这个简短的教程中,我们将研究"普通Java对象"(Plain Old Java Object)的定义,简称POJO.我们将看看POJO与JavaBean的比较,以及如何 ...

  2. win32-CreateDIBSection的使用

    使用CreateDIBSection 可以创建一个设备无关位图 #include <windows.h> using namespace std; int main() { HDC hdc ...

  3. golang常用库包:redis操作库go-redis使用(02)-Redis5种基本数据类型操作

    第一篇:go-redis使用,介绍Redis基本数据结构和其他特性,以及 go-redis 连接到Redis https://www.cnblogs.com/jiujuan/p/17207166.ht ...

  4. 【Android逆向】破解看雪test3.apk方案二

    方案二就是要hook那三个条件,不让追加字符串变成false v20 = "REAL"; clazz = _JNIEnv::FindClass(env, "android ...

  5. flutter——android报错Manifest merger failed : Attribute application@allowBackup value=(false)

    与这个https://www.cnblogs.com/MaiJiangDou/p/13848658.html 报错类似. 报错: Manifest merger failed : Attribute ...

  6. Qt+QtWebApp开发笔记(二):http服务器日志系统介绍、添加日志系统至Demo测试

    前言   上一篇使用QtWebApp的基于Qt的轻量级http服务器实现了一个静态网页返回的Demo,网页服务器很重要的就是日志,因为在服务器类上并没有直接返回,所以,本篇先把日志加上.   Demo ...

  7. 【Azure 环境】 介绍两种常规的方法来监视Window系统的CPU高时的进程信息: Performance Monitor 和 Powershell Get-Counter

    问题描述 部署在Azure上的VM资源,偶尔CPU飙高,但是发现的时候已经恢复,无法判断当时High CPU原因. 在Windows系统中,有什么方式能记录CPU被进程占用情况,查找出当时是排名前列的 ...

  8. 【Azure 环境】当在Azure 环境中调用外部接口不通时,如何定位SSL Certificate Problem

    问题描述 如果在Azure VM中,发现同一个API,一台VM可以访问成功,另外一台访问失败.如何来调试并定位问题呢? 问题分析 第一步,查看访问外部API不通时候出现什么错误.如果没有明确的错误消息 ...

  9. gorm整理

    目录 1. 约定 2. 结构体标签 3. 创建记录 4. 更新 5.删除 6. 查询 7.关联 8.链式操作 9.范围 10.多个立即执行方法的注意事项 11.错误处理 12.钩子 13.事务 14. ...

  10. 初识JavaScript逆向——以网易云音乐和招标网站为例

    前言:需要掌握一定的JavaScript基础,能看懂基础的JavaScript代码. 我们平常在浏览网站的时候会看到许多加密的参数,如果需要知道它的原始数据,就需要知道整个加密过程,所以本篇文章就来介 ...