北京赛车pk10开奖

小用stm32f4-CAN控制器(使用库函数)

2019-09-30来源: eefocus关键字:stm32f4  CAN控制器  库函数

目标实验平台:stm32f4-discovery,板载STM32F407VGT6。


写的时候忘记掉可以用“报文”这个词,于是就很愚昧的都使用了一帧信息这样的表达。。意思是一样的!


这里首先说一下CAN总线。


CAN总线时一种工业总线,展开来说就是控制器局域网,Controller Area Network


常常用在汽车和工业控制的通讯中。也就是说,在汽车上,各种控制器常常是通过CAN总线进行通讯的。


具体到他是谁发明的有什么历史就不详述了,百度百科一大堆我自己看了也记不清~


只是这两天在调两个STM32通过CAN总线进行最简单的收发通信,这里就简要介绍一下其通信的建立过程


也就是简单的收发功能,至于其中更复杂的错误检测等功能我也只看过介绍没有具体实验过,也就不说了。


如果能有机会用到,也会来再记录的。




CAN总线和I2c等总线有所不同,各个节点的通信并不是通过确定发送目标机地址来确定收发方向。


他是采取一种广播的方式,也就是说一个节点向总线发送信号,所有节点都能收到。


但是如果这个信号对自己无用怎么办呢?事实上,在CAN总线上传输的信号并不仅仅只有所需要的数据、控制信号等,


北京赛车pk10开奖更重要的是一帧信号还有一串标识符ID,每个节点可以设置自己想要接收什么样标识符的信息


北京赛车pk10开奖而将不需要的信息通过节点中的过滤器处理掉,就不用担心无用数据的干扰了。这样比需要地址总线通讯方式的好处就是如果同样信息不需要一个一个地址重复发送,只要一次发送就行了,提高效率。

在一个CAN的节点上,除了CPU以外,还需要一个CAN控制器和一个CAN收发器,CAN控制器可以根据当前总线上的数据传输情况以及现在控制器中发送邮箱及接受缓冲器等的情况来实时调整发送和接收。而CAN总线上的电平并不是TTL电平故需要一个CAN收发器进行电平转换的功能。


使用STM32进行CAN通讯的好处之一就是他自带有CAN控制器,而在外面只需要一个CAN收发器即可。至于其他没有CAN控制器的MCU,就需要配备如SJA1000等额外的CAN控制器了。


我这里使用的CAN收发器选用TJA1050,外部接线非常简单,如下图

其中TXD、RXD引脚连接STM32的CANTXCANRX。电源滤波电容可选取0.1uF。Vref可不接,S(RS)端可接GND或不接。至于CANHCANL之间的120欧姆电阻,在节点为CAN总线终端时接上,否则不接。电路非常简单,可以自己制作,我自己淘宝花了10块钱买了两个TJA1050芯片,其中有6元是运费。如果直接买TJA1050的模块的话,基本上网上都是10元一个,还要运费,加起来都快30了,真是不值呀~


进行双机通信时,两个CAN收发器的CANH、CANL连接即可。


如果没有条件进行双机通信,可以在STM32进行CAN控制器初始化时设置成回环模式,也就是STM32的CAN-TX在芯片内部与CAN-RX进行直接连接,而外部的CAN-RX引脚不影响内部。同时可以在外部TX引脚上通过示波器测得输出信号波形。此种方法可以在一定程度上用于测试程序正确与否(因为他隔绝了外部电路的影响,比如因为电路不正确等,但也同时无法使用其总线错误检测等功能)。建议先通过CAN的回环测试,再进行双机通信。


下面再介绍一下stm32的CAN控制器。分为CAN1(主)和CAN2(从)。每个CAN控制器有3个发送邮箱用于存放需要发送的信息。发送顺序可以由软件设置为根据信息优先级还是根据信息的请求时间。它还有2个用于接收的缓冲器队列FIFO0和FIFO1,每个FIFO可以存放3帧信息,如果存满,新来的信息可能会丢失或者被覆盖(依据软件设置)。


他可以被CAN控制器的过滤器(共28组,也就是可以设置28个标识符ID)关联,通过该过滤器的信息就会被存入相应的FIFO中。


再说一下stm32的CAN过滤器。


他共有28组过滤器,每组过滤器有2个32位的存储器。每组过滤器可以设置为:


1、两个32位完全匹配的过滤器 (用于扩展帧)2、4个16位完全匹配的过滤器 (用于标准帧)3、一个32位有位屏蔽功能的过滤器


这里再提一下,CAN总线的数据帧有两种,一种是11位标识符的,叫标准帧,另一种除了11位以外还有18位共计29位标识符的叫扩展帧。


所谓完全匹配,即总线上一帧信息的标识符必须与28个过滤器中某一个标识符每一位都相同,才会被过滤器接收到FIFO中。所谓位屏蔽,就是只需要与设定的标识符中某几位相同即可被接收进FIFO中。


絮絮叨叨说了这么多,想必对STM32的CAN控制器也有所了解了。下面根据所写的代码进行操作步骤讲解吧:D


北京赛车pk10开奖我用的是CAN1,使用FIFO0存放接收到的数据


首先是主函数中,首先先通过CAN_Config和NVIC_Config对CAN控制器及其中断进行初始化配置。其他的CAN_打头的函数来源于STM32的函数库,具体功能见注释。

void main()  

{   

  uint8_t TransmitMailbox = 0;

 

 

北京赛车pk10开奖  USART1_Config();//初始化串口,与电脑进行通信,方便调试  下面的printf函数被重载到发送信息到串口

  NVIC_Config();

  CAN_Config();

  RxReset();//将接收缓冲区清空

  CAN_FIFORelease(CAN1,CAN_FIFO0 );//清空接收FIFO

北京赛车pk10开奖  PackTxMessage();//打包要发送的数据到全局结构体变量TxMessage中

  TransmitMailbox = CAN_Transmit(CAN1, &TxMessage);//发送数据,如果发送成功返回存入的邮箱号

  while((CAN_TransmitStatus(CAN1, TransmitMailbox)  !=  CANTXOK))//判断是否成功发送

   {

     printf("nrnrStill transmittingnr");

   }

  printf("nrTransmit OK!nr");

  while(1);

}


下面是CAN_Config函数

首先需要配置使用的GPIO的复用功能,然后配置CAN控制器的收发模式以及过滤器,并打开接收中断。

配置过程可以参照STM32F4的函数库文件stm32f4xx_can.c中前面注释中的介绍“How to use this 。。。”就可以知道要对CAN控制器进行初始化需要用到哪些函数。这也是一个很重要的学习使用STM32外设的方法,就是阅读每一个库文件的源代码及其介绍。


一个经验就是,现在网上STM32的代码和相关资料大部分是针对STM32F10x芯片的,这里使用的F407的寄存器以及库函数与他们有一些不同,如果生搬硬套,首先就可能无法通过编译,提示某些变量或者函数没有定义。即使通过了编译,也很有可能因为某些在F10x中没有的函数没有使用而导致外设无法正常运行。



void CAN_Config()

{

北京赛车pk10开奖  CAN_GPIO_Init();

  CAN_ModeAndFilterInit();

}

void CAN_GPIO_Init()

{

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//打开CAN外设时钟

  //RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 | RCC_APB1Periph_CAN2, ENABLE);//

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

北京赛车pk10开奖  GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_CAN1);//配置功能复用

北京赛车pk10开奖  GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_CAN1);

  

  GPIO_InitTypeDef CANIO;

  CANIO.GPIO_Pin = GPIO_Pin_8;

  CANIO.GPIO_Mode = GPIO_Mode_AF;

  CANIO.GPIO_PuPd = GPIO_PuPd_UP;

  CANIO.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB,&CANIO);

  //Config CANTX

  CANIO.GPIO_Pin = GPIO_Pin_9;

北京赛车pk10开奖  CANIO。GPIO_Mode = GPIO_Mode_AF;

  CANIO.GPIO_OType = GPIO_OType_PP;

  GPIO_Init(GPIOB,&CANIO);

}

void CAN_ModeAndFilterInit()

{

北京赛车pk10开奖    CAN_InitTypeDef        CAN_InitStructure;

    CAN_FilterInitTypeDef  CAN_FilterInitStructure;

    CAN_DeInit(CAN1);//首先使用默认配置,减少配置数量

   

  /* CAN cell init */

   CAN_InitStructure。CAN_TTCM = DISABLE;//关闭时间触发通信使能(我也不知道这个干嘛用的。。)

   CAN_InitStructure.CAN_ABOM = ENABLE;//自动离线管理,也就是如果检测到总线上出错,本节点自动离线

  CAN_InitStructure.CAN_AWUM = ENABLE;//设置当需要时自动唤醒,如果DISABLE,则需要软件唤醒

   CAN_InitStructure.CAN_NART = DISABLE;//如果报文发送不成功,就自动重发

   CAN_InitStructure。CAN_RFLM = DISABLE;//在接收的FIFO中如果溢出,自动覆盖原有报文

  CAN_InitStructure。CAN_TXFP = DISABLE;//发送邮箱优先级取决于报文标识符

   CAN_InitStructure。CAN_Mode = CAN_Mode_Normal;//正常工作模式,如果是回环模式,这里要更改为CAN_Mode_Loopback

/* CAN Baudrate = 700kbps (CAN clocked at 42 MHz) */

/*以下5行设置CAN传送速率为700kbps,CAN的最高传输速率为1Mbps*/

   CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;

CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler = 4; CAN_Init(CAN1, &CAN_InitStructure); /* CAN filter init *///设置CAN过滤器 CAN_FilterInitStructure.CAN_FilterNumber = 1;//使用1号过滤器,(共28组,编号0~27) CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;//标识符屏蔽位模式 CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;//32位标识符

/*以下4句分析见后文,用于设置过滤器的标识符和屏蔽位*/

   CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)0x1314<<3)&0xffff0000)>>16;//0x0000;

CAN_FilterInitStructure.CAN_FilterIdLow = ((

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

上一篇:STM32的CAN总线的接收双FIFO使用方法
下一篇:stm32与伺服驱动器进行can通信

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

推荐阅读

stm32f103 c6t6 CAN总线的配置
KEIl5 环境下 中文显示复制过来有问题又懒得打字
发表于 2019-11-13
stm32f103 c6t6 CAN总线的配置
STM8L051F3_01_GPIO应用
本章介绍STM8L051F3的GPIO相关知识。内容分为以下几部分:GPIO简介点亮LED1、GPIO简介GPIO:通用输入/输出口,用于芯片与外部进行数据传输;STM8L051F3的一个I/O端口最多可以有8个Pins(引脚),每个引脚可以独立地配置为数字输入或数字输出。此外,一些I/O端口可能有一些复用功能如模拟输入、外部中断、片上外设的输入输出等,一个引脚不能同时使用多种复用功能。每个I/O端口都分配有一个输出数据寄存器、输入数据寄存器、数据方向寄存器、两个配置寄存器,一个I/O端口工作在输入或输出状态取决于数据方向寄存器。STM8L051F3的GPIO主要性能如下:端口的位(引脚)能独立配置可选择的输入模式:浮空输入
发表于 2019-11-13
STM32F0x2 IWDG(独立看门狗)
单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。 以下为stm32f042单片机独立看门狗相关代码:/***********************************************************函数描述:初始化独立看门狗,timeout为1s*函数:void IWDG_Init(unsigned char usb_sw) *参数:无*作者:*日期
发表于 2019-11-12
STM32F1小白系列之四、独立看门狗(IWDG)
:T(ms) == [(4 * 2^pre_Scaler) * reload] / 40;    IWDG_ReloadCounter();//第一次喂狗    IWDG_Enable();//使能看门狗}//喂狗APIvoid feed_iwdg(void){    IWDG_ReloadCounter();//喂狗,使STM32重新加载【IWDG_RLR中的值】到【看门狗计数器里面】。}2、直接配置寄存器/*    函数功能:初始化独立看门狗    函数名:init_iwdg    返回值:void 
发表于 2019-11-12
stm32f0 hal adc配置
Clock Prescaler:和系统时钟同步并且二分频Sampling Time :采样时间,采样时间是你通过寄存器告诉STM32采样模拟量的时间,设置越长越精确
发表于 2019-11-11
stm32f0 hal adc配置
STM32F0xx_看门狗(独立+窗口)配置详细过程
Ⅰ、概述对于看门狗,我觉得做单片机或者嵌入式开发的人员来说并不陌生,今天总结STM32F0看门狗的功能,F0的看门狗有两种:独立和窗口看门狗。今天提供两种看门狗的软件工程实例,供大家下载。两种看门狗各有各的特点,应用在不同的场合,下面将分别简单总结一下独立和窗口看门狗的功能。Ⅱ、下载文章提供的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘,请放心下载测试,如有问题请检查一下你的板子是否有问题。ST标准外设库和参考手册、数据手册等都可以在ST官网下载,你也可以到我的360云盘下载。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文
发表于 2019-11-08
STM32F0xx_看门狗(独立+窗口)配置详细过程
小广播
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 2689mr.com, Inc. All rights reserved
天音彩票注册 北京赛车 微彩彩票投注计划官网 北京赛车pk10计划 北京赛车 北京赛车pk10开奖 天游彩票开户注册网 我赢彩票注册开户投注 万彩彩票开户投注注册 我赢彩票注册开户投注