1、CAN主控制寄存器(CAN_MCR)

该寄存器的我们仅介绍下INRQ位,该位用来控制初始化请求。

设置INRQ=0,可使CAN从初始化模式进入正常工作模式。

设置INRQ=1,可使CAN从正常工作模式进入初始化模式 。

CAN初始化时,先设置INRQ=1 ,进入初始化模式,进行初始化(尤其是CAN_BTR的设置,该寄存器,必须在CAN正常工作之前设置),之后再设置INRQ=0,进入正常工作模式。

2、CAN位时序寄存器(CAN_BTR)

3、CAN接收FIFO寄存器(CAN_RF0R/CAN_RF1R)

4、CAN发送邮箱标识符寄存器(CAN_TIxR)(x=0~2)

5、CAN发送邮箱数据长度和时间戳寄存器 (CAN_TDTxR) (x=0~2)

6、CAN发送邮箱数据寄存器(CAN_TDLxR/CAN_TDHxR) (x=0~2)

图为CAN_TDLxR寄存器的描述,用于存储低4个字节的数据。CAN_TDHxR寄存器与之类似,用于存储高4个字节的数据。要发送的数据就是存储在这两个寄存器

7、CAN接收FIFO邮箱标识符寄存器(CAN_RIxR)(x=0/1)

8、CAN接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR) (x=0/1)

9、CAN接收FIFO邮箱邮箱数据寄存器(CAN_RDLxR/CAN_RDHxR) (x=0/1)

图为CAN_RDLxR寄存器的描述,用于存储低4个字节的数据。CAN_RDHxR寄存器与之类似,用于存储高4个字节的数据。接收到的数据就存储在这两个寄存器

10、CAN筛选器模式寄存器(CAN_FM1R)

该寄存器设置筛选器的工作模式,必须在CAN_FMR寄存器FINIT=1时配置,对于STM32F103ZET6,只有[13:0]位有效,对于互联性STM32F1或者STM32F407,则全部有效。

11、CAN筛选器尺度寄存器(CAN_FS1R)

该寄存器用于设置筛选器的位宽,必须在CAN_FMR寄存器FINIT=1时配置,对于STM32F103ZET6,只有[13:0]位有效,对于互联性STM32F1或者STM32F407,则全部有效。

12、CAN筛选器FIFO关联寄存器(CAN_FFA1R)

该寄存器设置报文通过筛选器组之后,被存入的FIFO,如果对应位为0,则存放到FIFO0;如果为1,则存放到FIFO1。该寄存器也只能在过滤器处于初始化模式( CAN_FMR 寄存器的FINIT=1 )下配置。

13、CAN筛选器激活寄存器(CAN_FA1R)

该寄存器用于设置筛选器组的开启和关闭。对对应位置1,即开启对应的筛选器组;置0则关闭该筛选器组。

14、CAN筛选器组i寄存器x(CAN_FiRx)(i=0~27,x=1/2)

每个筛选器组的CAN_FiRx都由2个32位寄存器构成,即:CAN_FiR1和CAN_FiR2。根据过滤器位宽和模式的不同设置,这两个寄存器的功能也不尽相同。关于过筛选器的映射,功能描述和屏蔽寄存器的关联,在前面已经介绍过了

15、STM32 CAN控制器简介-初始化流程

①配置相关引脚的复用功能,使能CAN时钟。

要用CAN,先要使能CAN的时钟,CAN的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,这里我们需要设置PA11为上拉输入(CAN_RX引脚)PA12为复用输出(CAN_TX引脚),并使能PA口的时钟

②设置CAN工作模式及波特率等。

通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其他相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。 最后设置INRQ为0,退出初始化模式。

③设置滤波器。

本例程,我们将使用筛选器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,进入初始化模式,然后设置筛选器组0的工作模式以及标识符ID和屏蔽位。最后激活筛选器,并退出初始化模式。

//CAN初始化
//tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1tq~ CAN_SJW_4tq
//tbs2:时间段2的时间单元.   范围:CAN_BS2_1tq~CAN_BS2_8tq;
//tbs1:时间段1的时间单元.   范围:CAN_BS1_1tq ~CAN_BS1_16tq
//brp :波特率分频器.范围:1~1024; tq=(brp)*tpclk1
//波特率=Fpclk1/((tbs1+1+tbs2+1+1)*brp);
//mode:CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,回环模式;
//Fpclk1的时钟在初始化的时候设置为42M,如果设置CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_LoopBack);
//则波特率为:42M/((6+7+1)*6)=500Kbps
//返回值:0,初始化OK;
//    其他,初始化失败;
u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef        CAN_InitStructure;CAN_FilterInitTypeDef  CAN_FilterInitStructure;
#if CAN1_RX0_INT_ENABLE //中断使用 默认不使用NVIC_InitTypeDef  NVIC_InitStructure;
#endif//使能相关时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PORTA时钟                                                               RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟 //初始化GPIOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12//引脚复用映射配置GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1); //GPIOA11复用为CAN1GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12复用为CAN1//CAN单元设置CAN_InitStructure.CAN_TTCM=DISABLE;  //非时间触发通信模式   CAN_InitStructure.CAN_ABOM=DISABLE;  //软件自动离线管理    CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)CAN_InitStructure.CAN_NART=ENABLE; //禁止报文自动传送 CAN_InitStructure.CAN_RFLM=DISABLE; //报文不锁定,新的覆盖旧的  CAN_InitStructure.CAN_TXFP=DISABLE;    //优先级由报文标识符决定 CAN_InitStructure.CAN_Mode= mode;     //模式设置 //设置波特率CAN_InitStructure.CAN_SJW=tsjw; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tqCAN_InitStructure.CAN_BS1=tbs1; //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tqCAN_InitStructure.CAN_BS2=tbs2;//Tbs2范围CAN_BS2_1tq ~    CAN_BS2_8tqCAN_InitStructure.CAN_Prescaler=brp;  //分频系数(Fdiv)为brp+1   CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1 //配置过滤器CAN_FilterInitStructure.CAN_FilterNumber=0;      //过滤器0CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //屏蔽位模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;32位IDCAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASKCAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化#if CAN1_RX0_INT_ENABLECAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.           NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
#endifreturn 0;
}   
//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)
//len:数据长度(最大为8)
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
//       其他,失败;
u8 Can_Send_Msg(u8* msg,u8 len)
{   u8 mbox;u16 i=0;CanTxMsg TxMessage;TxMessage.StdId=0x12;      // 标准标识符 TxMessage.ExtId=0x12;     // 设置扩展标示符 TxMessage.IDE=CAN_Id_Standard;  // 标准帧TxMessage.RTR=CAN_RTR_Data;      // 数据帧TxMessage.DLC=len;           // 要发送的数据长度for(i=0;i<len;i++)TxMessage.Data[i]=msg[i]; mbox= CAN_Transmit(CAN1, &TxMessage);   i=0;while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;//等待发送结束if(i>=0XFFF)return 1;return 0;
}
//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)
//len:数据长度(最大为8)
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
//       其他,失败;
u8 Can_Send_Msg(u8* msg,u8 len)
{   u8 mbox;u16 i=0;CanTxMsg TxMessage;TxMessage.StdId=0x12;      // 标准标识符 TxMessage.ExtId=0x12;     // 设置扩展标示符 TxMessage.IDE=CAN_Id_Standard;  // 标准帧TxMessage.RTR=CAN_RTR_Data;      // 数据帧TxMessage.DLC=len;           // 要发送的数据长度for(i=0;i<len;i++)TxMessage.Data[i]=msg[i]; mbox= CAN_Transmit(CAN1, &TxMessage);   i=0;while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;//等待发送结束if(i>=0XFFF)return 1;return 0;
}
//can口接收数据查询
//buf:数据缓存区;
//返回值:0,无数据被收到;
//       其他,接收的数据长度;
u8 Can_Receive_Msg(u8 *buf)
{                  u32 i;CanRxMsg RxMessage;if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;   //没有接收到数据,直接退出 CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);    //读取数据  for(i=0;i<8;i++)buf[i]=RxMessage.Data[i];  return RxMessage.DLC;
}

STM32 CAN控制器简介-寄存器简介相关推荐

  1. stm32 HAL库 Flash操作简介

    stm32 HAL库 Flash操作简介 目录 第一stm32,flash介绍 查看代码段,以判断代码长度 flash的基本操作规则 stm32 HAL库 Flash操作指南 stm32f1xx_ha ...

  2. 8086芯片寄存器简介

    8086芯片寄存器简介 通用寄存器: 数据寄存器: AX (Accumulator):累加寄存器 BX (Base):基地址寄存器 CX (Count):计数器寄存器 DX (Data):数据寄存器 ...

  3. JESD204接口调试总结——Xilinx JESD204B IP AXI寄存器简介

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 JESD204接口调试总结--Xilinx JESD204B IP AXI寄存器简介 一般来说,如果在IPcore配置正确的话,不太需 ...

  4. JESD204接口调试总结——Xilinx JESD204C IP AXI寄存器简介

    JESD204接口调试总结--Xilinx JESD204C IP AXI寄存器简介 关于JESD204C的寄存器如下所示: 重要的寄存器: 020: 复位 这个复位和JESD204B的复位不太一样, ...

  5. 8086寄存器简介 (转载从 博客园-首页原创精华区 作者:Zachary.XiaoZhen)

    引子 打算写几篇稍近底层或者说是基础的博文,浅要介绍或者说是回顾一些基础知识, 自然,还是得从最基础的开始,那就从汇编语言开刀吧, 从汇编语言开刀的话,我们必须还先要了解一些其他东西, 像  CPU ...

  6. WLAN控制器 - CAPWAP协议简介

    WLAN控制器 - CAPWAP协议简介 1.   背景介绍 传统的WLAN网络都是为家庭内少量移动用户的接入而组建的.因此,只需要一个无线路由器(AP)就可以搞定了,无线路由器承担了所有的网络配置和 ...

  7. STM32——CAN控制器原理与配置

    一.CAN控制器简介 STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下: 1.支持CAN协议2.0A和2.0B主动模式 2.波特率最高达1Mbps 3.支持时间触发通信 4.具 ...

  8. Swagger 学习笔记 | Swagger 简介 | Springfox 简介 | Springfox 2.9.2 常用注解 | Spring Boot 整合 Swagger2 案例

    文章目录 一.Swagger 简介 二.Springfox 简介 三.Springfox2.9.2 常用注解 四.SpringBoot 整合 Swagger2 4.1 引入Maven依赖 4.2 项目 ...

  9. 嵌入式系统(四):STM32微控制器及最小系统(1)

    文章目录 一.STM32微控制器概述 1.控制器主要参数: 2.内部资源情况: 3.STM32总线系统 4.存储器映射 5.STM32启动模式 6.程序下载调试电路 7.STM32最小系统 电源: 复 ...

最新文章

  1. 如何读取比机器内存大的文件(内存4G,文件 8G,读取大文件) ?
  2. 宝塔linux计划任务ftp,宝塔面板定时备份网站及数据库至FTP存储空间图文教程
  3. 既是移动硬盘也是微型计算机,既是移动硬盘也是微型计算机 Gnarbox 2.0 SSD让你随时随地备份自己的照片...
  4. codeforces 450B. Jzzhu and Sequences 解题报告
  5. linux搜索文件内容含有星号,文本内容查找grep、文件查找find、正则匹配
  6. VC6下使用WebLink控件
  7. php服务器怎么设置cookie,php服务器如何清除浏览器cookie
  8. 第一章:1-01、计算机网络的发展可划分为几个阶段?每个阶段各有何特点?
  9. jsp转换java_JSP编码转换
  10. python填充_python 实现矩阵填充0的例子
  11. GCD(Grand Central Dispatch)和Block 使用-浅析
  12. 随机效应估算与固定效应估算_纯电动汽车的电池价格,可以怎么估算?
  13. 【正点原子STM32连载】第三十七章 触摸屏实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
  14. php字符串指定长度截取,php 截取指定长度字符串的代码分享
  15. sl400通过ac无法连接psk加密无线网络
  16. numpy的choose 函数实现条件筛选
  17. ubuntu测试键盘工具_Lubuntu安装屏幕键盘onboard,使触摸屏可以登录和输入
  18. 【ZJOI2007】【BZOJ1059】矩阵游戏
  19. Word格式处理控件Aspose.Words for .NET教程——设置字体格式并获取行距
  20. Android开发三:数据库设计及应用(一)

热门文章

  1. (1)计算机技术影响公共景观的营造模式,论计算机技术在园林设计中的应用
  2. 重返德军总部全攻略(一)
  3. 计算机常用英语1000个,1000个最常用英语单词以及翻译
  4. 上海软件自动化测试培训,上海培训自动化测试(工业机器)
  5. 几乎涵盖了近半年90%的Java面试题,可以肝起来了
  6. 文档,数据和粘贴板 目录 AppKit 文档
  7. CSS特性 之渐变 (全网最全)
  8. 什么是ZooKeeper?可以做什么?ZooKeeper分布式事务详解篇
  9. 官方直播demo 音频处理Mct
  10. php 创建 map,golang如何创建map