代码如下:

#include "mycan.h"//CAN初始化
//tsjw:重新同步跳跃时间单元.范围:1~3; CAN_SJW_1tq    CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
//tbs2:时间段2的时间单元.范围:1~8;
//tbs1:时间段1的时间单元.范围:1~16;     CAN_BS1_1tq ~CAN_BS1_16tq
//brp :波特率分频器.范围:1~1024;(实际要加1,也就是1~1024) tq=(brp)*tpclk1
//注意以上参数任何一个都不能设为0,否则会乱.
//波特率=Fpclk1/((tsjw+tbs1+tbs2)*brp);
//mode:0,普通模式;1,回环模式;
//Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Normal_Init(1,8,7,5,1);
//则波特率为:48M/((1+8+7)*5)=450Kbpsvoid CAN_Mode_Init(uint8_t tsjw,uint8_t tbs2,uint8_t tbs1,uint16_t brp,uint8_t mode)
{GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef        CAN_InitStructure;CAN_FilterInitTypeDef  CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE NVIC_InitTypeDef  NVIC_InitStructure;
#endifRCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能PORTA时钟                                                               SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP;                  //RMAP   GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_4);GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_4);RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);//使能CAN时钟  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11|GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);CAN_DeInit(CAN);//CAN单元设置CAN_InitStructure.CAN_TTCM=DISABLE;                       //非时间触发通信模式  //CAN_InitStructure.CAN_ABOM=ENABLE;                      //软件自动离线管理  //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;          //模式设置: mode:0,普通模式;1,回环模式; ////设置波特率CAN_InitStructure.CAN_SJW=tsjw;               //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位  CAN_SJW_1tq   CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tqCAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tqCAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~ CAN_BS2_8tqCAN_InitStructure.CAN_Prescaler=brp;            //分频系数(Fdiv)为brp+1 //CAN_Init(CAN, &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 CAN_RX0_INT_ENABLECAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.            NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
#endif
}
#if CAN_RX0_INT_ENABLE  //使能RX0中断
//中断服务函数
void CEC_CAN_IRQHandler(void)
{CanRxMsg RxMessage;int i=0;CAN_Receive(CAN, 0, &RxMessage);//for(i=0;i<8;i++)//printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data[i]);
}
#endif//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)
//len:数据长度(最大为8)
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
//       其他,失败;
uint8_t Can_Send_Msg(uint8_t* msg,uint8_t len)
{   uint8_t mbox;uint16_t i=0;CanTxMsg TxMessage;TxMessage.StdId=0x12;                     // 标准标识符为0TxMessage.ExtId=0x12;                // 设置扩展标示符(29位)TxMessage.IDE=0;          // 使用扩展标识符TxMessage.RTR=0;         // 消息类型为数据帧,一帧8位TxMessage.DLC=len;                          // 发送两帧信息for(i=0;i<len;i++)TxMessage.Data[i]=msg[i];                 // 第一帧信息          mbox= CAN_Transmit(CAN, &TxMessage);   i=0;while((CAN_TransmitStatus(CAN, mbox)==CAN_TxStatus_Failed)&&(i < 0XFFF))i++; //等待发送结束if(i >= 0XFFF)return 1;return 0;
}
//can口接收数据查询
//buf:数据缓存区;
//返回值:0,无数据被收到;
//       其他,接收的数据长度;
uint8_t Can_Receive_Msg(uint8_t *buf)
{                  uint32_t i;CanRxMsg RxMessage;if( CAN_MessagePending(CAN,CAN_FIFO0)==0)return 0;       //没有接收到数据,直接退出 CAN_Receive(CAN, CAN_FIFO0, &RxMessage);//读取数据   for(i=0;i<8;i++)buf[i]=RxMessage.Data[i];  return RxMessage.DLC;
}

注意:一定要根据自己的封装来设置
SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP;
如果不设置 CAN_Init(CAN, &CAN_InitStructure);会初始化失败

STM32F042 CAN使用例子相关推荐

  1. 高斯回归过程应用例子

    假设现在已经观察到了6个样本点,x为样本点特征(一维的),y为样本输出值. 现在新来了一个样本点,要求是用高斯回归过程来预测新来样本点的输出值.这些样本点显示如下; 其中前面6个点是已知输出值的训练样 ...

  2. 语义网所谓的“本体”的具体例子是什么?人工智能

    作者:王喆 链接:https://www.zhihu.com/question/19558514/answer/26323766 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  3. pytorch记录:seq2seq例子看看这torch怎么玩的

    https://blog.csdn.net/nockinonheavensdoor/article/details/82320580 先看看简单例子: import torch import torc ...

  4. 适用于CUDA GPU的Numba例子

    • 适用于CUDA GPU的Numba例子 矩阵乘法 这是使用CUDA内核的矩阵乘法的简单实现: @cuda.jit def matmul(A, B, C): """Pe ...

  5. c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...

    这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...

  6. 30 个 php 操作 redis 常用方法代码例子

    这篇文章主要介绍了 30 个 php 操作 redis 常用方法代码例子 , 本文其实不止 30 个方法 , 可以操作 string 类 型. list 类型和 set 类型的数据 , 需要的朋友可以 ...

  7. Ubantu下hadoop运行第一个例子wordcount过程

    Ubantu12.04下hadoop-1.2.1运行第一个例子wordcount过程,分享一下 将WordCount.java文件放在Hadoop安装目录下,并在安装目录下创建输入目录input,目录 ...

  8. C#关于面对象多态例子

    //主的喂狗 class Program     {         static void Main(string[] args)         {             //我们来模拟一个主人 ...

  9. [摘]终于找到一个有助理解left/right/full outer join的例子

    近日在学习<Understading DB2>的时候找到了一个例子,对于理解 left/right/full 三种 outer join 的大有裨益. 先看样本数据,来自DB2的示例数据库 ...

最新文章

  1. 每日一题 -- 11-1
  2. [LeetCode] Maximum Subarray 最大子数组
  3. python写软件-Python是怎么编写软件的?
  4. 程序员获取编程灵感的 10 种方式
  5. 计算机组成原理多层次的存储器,计算机组成原理多层次的存储器
  6. 动态规划再理解(53、121、174)
  7. laravel 分词搜索匹配度_搜索引擎工作原理
  8. 桌面怎么新建html文件夹下,创建文件夹的步骤 怎么往新建的文件夹里写东西呀?...
  9. vs2015调试iisexpress无法启动的问题解决方案整理
  10. 蓝丝雨第十四季商业实战系列(全民奇迹中控台实战)
  11. 干货满满的深度强化学习综述(中文)
  12. 微信小程序开发者代码管理中,不想要的项目怎么删除
  13. 智能世界的罗马是怎样建成的?
  14. 百度地图批量精度和维度Java,关于百度地图API批量转换成坐标的方法
  15. Application.DoEvent使用
  16. .git文件夹过大,给它瘦身
  17. 三国志X威力加强版 解决新武将姓名和列传乱码问题——大五码(BIG5)
  18. ENDNOTE 添加国标参考文献格式
  19. 咦,为什么我的事务回滚不了?
  20. 为什么天才容易患阅读障碍症_阅读障碍症是一种怎样的体验

热门文章

  1. Android12系统上支持Android手机的usb网络共享
  2. execv shell_Linux中exec命令相关
  3. 在线教育的三大主流变现模式
  4. 正向代理反向代理(校园网为例)
  5. swift 保存照片到手机相册中
  6. EPAS1人源重组蛋白:全自动蛋白纯化技术
  7. HDLC、ppp、MGRE实验(1.1)
  8. Zigbee 计量插座
  9. .html 、.htm 、 .shtml 以及 .shtm 四种扩展名的文件区别
  10. Unity内置Built-in到可编程URP函数对应整理