STM32下调试CAN通信

基本流程:

1、初始化CAN模块:

启用CAN时钟

配置CAN功能寄存器(包括位定时,分频等等)

配置CAN过滤器

打开中断

2、初始化I/O口

启用GPIO时钟

打开CAN对应的GPIO引脚

配置重映射(根据实际情况)

3、定义CAN发送结构体,接收结构体

4、开始发送并准备接收总线上信号

5、检查接收邮箱收的数据是否正确

 1 void    CAN_Config()
 2 {
 3     CAN_InitTypeDef         CAN_InitStructure;
 4     CAN_FilterInitTypeDef     CAN_FilterInitStructure;
 5     GPIO_InitTypeDef         GPIO_InitStructure;
 6     RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);
 7     /**Configure the PA11 PA12 to CAN1*/
 8     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
 9     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
10     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
11     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
12     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
13     GPIO_Init(GPIOA,&GPIO_InitStructure);
14     GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1);
15     GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1);
16
17     CAN_DeInit(CAN1);
18     CAN_InitStructure.CAN_ABOM = DISABLE;        //自动离线
19     CAN_InitStructure.CAN_AWUM = DISABLE;        //自动唤醒
20     CAN_InitStructure.CAN_TTCM = DISABLE;        //触发通讯模式
21     CAN_InitStructure.CAN_NART = ENABLE;        //禁止报文自动重传
22     CAN_InitStructure.CAN_RFLM = DISABLE;        //报文自动覆盖¨
23     CAN_InitStructure.CAN_TXFP = DISABLE;        //优先级判定
24     CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;    //工作模式
25     /**configure baudrate 1M */
26     CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
27     CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;
28     CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
29     CAN_InitStructure.CAN_Prescaler =20;
30     CAN_Init(CAN1, &CAN_InitStructure);
31
32     CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;                //启用过滤
33     CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FilterFIFO0;    //过滤邮箱0
34     CAN_FilterInitStructure.CAN_FilterIdHigh= 0x0000;                    //过滤ID
35     CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
36     CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;                //过滤ID掩码
37     CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
38     CAN_FilterInitStructure.CAN_FilterMode =CAN_FilterMode_IdMask;
39     CAN_FilterInitStructure.CAN_FilterNumber = 0;
40     CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
41     CAN_FilterInit(&CAN_FilterInitStructure);
42
43     CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
44 }

定义CAN结构体:

1 CanTxMsg msg;
2 CanRxMsg RxMsg;
3
4     msg.StdId = 0x09;
5     msg.IDE = CAN_Id_Standard;
6 msg.Data[0]=0x01;
7     msg.DLC=1;
 1 void CAN1_RX0_IRQHandler(void)
 2 {
 3       if(CAN_MessagePending(CAN1,CAN_FIFO0) != RESET)
 4         {
 5             CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
 6             CAN_Receive(CAN1,CAN_FIFO0,&RxMsg);
 7           msg.Data[0] = RxMsg.Data[2]+1;
 8             msg.DLC =1;
 9             msg.StdId = 0x02;
10             msg.IDE = CAN_Id_Standard;
11             if(RxMsg.Data[0] ==0x01)
12             {
13                 GPIO_ToggleBits(GPIOD,GPIO_Pin_14);
14             }
15             CAN_Transmit(CAN1,&msg);
16         }
17 }

经过实验,在通信波特率为20K下可以正常工作。建议在低速下测试,若通信正常,可以逐步提高通信速率。

时间: 2024-10-10 21:39:24

STM32下调试CAN通信的相关文章

STM32下波特率计算详解

波特率的计算 STM32下的波特率和串口外设时钟息息相关,USART 1的时钟来源于APB2,USART 2-5的时钟来源于APB1.在STM32中,有个波特率寄存器USART_BRR,如下: STM32串口波特率通过USART_BRR进行设置,STM32的波特率寄存器支持分数设置,以提高精确度.USART_BRR的前4位用于表示小数,后12位用于表示整数.但是它还不是我们想要设置的波特率,想要设置我们串口的波特率大小还需要进行计算.其实有关波特率的计算是下面这一条表达式: 从上面的表达式,我们

stm32与三菱PLC通信

一.三菱PLC通讯概要   三菱PLC FX系列通信结构如下图所示: 三菱PLC FX系列的通信规格如下图所示: 三菱PLC FX系列一般有以下几种通信模块,以FX2N为例: FX2N-232-BD FX2N-232IF FX2N-232ADP FX2N-485-BD FX2N-422-BD .......... 无协议通讯情况下,以BD结尾的模块一般是使用RS通信指令,以IF结尾的模块一般使用对应的模块指令. 个人觉得BD模块操作起来更简单方便. 具体通信看对应PLC的通讯用户手册,RS-23

qt在windows下的udp通信(最简单)

qt编程:windows下的udp通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:win7 开发环境:qt 功能: 用udp进行收发通信 界面: 源代码: LssHost.pro: [cpp] view plain copy #------------------------------------------------- # # Project created by QtCreator 2013-09-22T09:36:44

VC下调试内存泄漏的办法

VC的控制台程序不会跟踪内存泄漏,如果需要调试控制台程序的内存情况,需要_CrtSetDbgFlag 详细原理我也不太懂,我也是从网上摘过来的,直接帖代码 // 内存泄漏跟踪 #ifdef WIN32 #include <SDKDDKVer.h> #ifdef _DEBUG #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> #define VC_MemLeakCheck() _CrtSet

前端利器,如何使用fiddle拦截在线css进行先下调试

fiddle的功能相当的强悍,用户也非常广,不过今天我就教大家用fiddle进行前端调试. 首先下载软件fiddle,点击对应的版本下载安装. 安装成功后打开看到右侧的导航栏: 点击AutoResponder 接下来出现的三个选项全部都要勾选,具体什么意思就是英文翻译了. 然后: 添加一个rule 在rule editor中第一个文本框里粘贴你要替换的原地址,比如: 然后进行下一步,在第二个框中点击选择find a file,具体意思你懂得,找个本地的文件替换上个url文件: 接下来就是最后一步

使用ffmepg的lib库调试,debug版本下调试无问题,但release版本会出现跑飞的现象

如题(“使用ffmepg的lib库调试,debug版本下调试无问题,但release版本会出现跑飞的现象”). 今天使用ffmpeg进行宿放和颜色格式转换,很简单的代码,却折腾了我一天,这里说来就气啊,全是一顿的蛋疼,这里记下来,防止以后再蛋疼.呵呵 开始的时候,我以为是我的代码问题,然后我把我的代码很多地方都注释了,发现debug没问题,release还是不断跑飞,啥原因? 于是我从新建了一个测试工程,很简单,就调用一句话. 整个工程的代码如下: 1 // ffmpegtest.cpp : 定

(转)&lt;Unity3D&gt;Unity3D在android下调试

转自:http://blog.csdn.net/zuoyamin/article/details/11827309 一.工具准备 1.JDK——由于android是基于Java平台开发的,jdk是必须要安装的.下载地址:http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe 2.Android SDK——这个就不多说了,要开发a

VS2005--设置Release模式下调试

今天初略看了下,所谓Release和Debug只是大家和编译器约定的一些生成规则而已,所以调试是无所谓Release和Debug的,只是由于生成的规则不同,可能Release的一些调试结果没Debug精确详细而已. 下面是设置在Release模式下调试的方法: 1.工程项目上右键 -> 属性 2.c++ -> 常规 -〉调试信息格式    选  程序数据库(/Zi)或(/ZI), 注意:如果是库的话,只能(Zi) 3.c++ -> 优化 -〉优化            选  禁止(/Od

VS调试过程中不可理解的问题----release下调试的悲剧

昨天晚上到现在,一直在调试一个代码,结果发现进入一个类的成员函数中以后,某些变量不能显示观察,什么局部变量,自动变量,监视窗口,都看了,就是某些变量不显示,程序不按照自己想要的步骤执行,竟然出现紊乱状态,头大啊!  实在不行,请大神指点,结果发现自己竟然是在release状态下调试的,所以各种不可理喻就都出来了,转成Debug版本下调试,终于程序可控了.真的是教训啊!写此博客以做警戒!