STM32F042 CAN使用例子

2023-10-27

代码如下:

#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)=450Kbps

void 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;
#endif
		
		RCC_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_4tq
  	CAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq
  	CAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~	CAN_BS2_8tq
  	CAN_InitStructure.CAN_Prescaler=brp;            //分频系数(Fdiv)为brp+1	//
  	CAN_Init(CAN, &CAN_InitStructure);            // 初始化CAN1 

		CAN_FilterInitStructure.CAN_FilterNumber=0;	  //过滤器0
		CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
		CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位 
		CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;32位ID
		CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
		CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
		CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
		CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
		CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0

		CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化
#if CAN_RX0_INT_ENABLE
	
		CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.		    

		NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
		NVIC_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;					 // 标准标识符为0
  TxMessage.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);会初始化失败

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F042 CAN使用例子 的相关文章

  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re

随机推荐

  • 怎么往服务器里拷贝文件,怎么往云服务器上拷贝文件

    怎么往云服务器上拷贝文件 内容精选 换一换 无法直接从云备份控制台查看备份中的数据 您可以通过以下几种方式进行查看 云服务器备份使用云服务器备份创建镜像后 再使用镜像创建云服务器 登录云服务器 查看服务器中的数据 云硬盘备份使用云硬盘备份创
  • mysql5.7递归查询

    MySQL 5 7支持递归查询 这种查询方式可以在一个表中查找具有父子关系的数据 递归查询通常使用WITH RECURSIVE语句进行构造 这个语句使用两个部分 递归部分和终止部分 递归部分定义了递归查询的开始条件和递归关系 而终止部分定义
  • LVGL使用记 - 数据更新显示

    介绍一下界面数据显示方法 关键API Set a an event handler function for an object Used by the user to react on event which happens with t
  • 数字藏品源码APP商城开发团队

    数字藏品源码APP商城开发团队 数字藏品商城软件开发 数字藏品分销模式开发 数字藏品交易平台开发 数字藏品现成源码软件定制 微信分销返利制度开发 NFT数字藏品平台开发定制 数字藏品系统多少钱 在全世界范围来看 数字藏品的外延更大 通常被称
  • flea-db使用之SQL模板接入

    SQL模板接入 引言 1 准备工作 2 使用讲解 2 1 SQL模板配置 2 2 新增数据 2 3 查询数据 2 4 更新数据 2 5 删除数据 2 6 分页查询 2 7 单个结果查询 计数 2 8 单个结果查询 总和 引言 本篇将要演示
  • 2017-7-28 2-8 编写函数rightrot(x,n),该函数返回将x循环右移(即从最右端移出的位将从最左端移入)n位后所得到的值

    include
  • Prefix Flip【小模拟】

    题目链接CF 1382 C2 题意 有两个字符串 现在我们要让第一个字符串变成第二个字符串 只允许使用2N次操作 问操作 每次操作是选前缀x个 然后首先前缀x全体异或1 然后字符串翻转 于是 很明显的 我们可以按次数每次维护最后一个字符串
  • Python 字符串与二进制串的相互转换

    一个问题 在Python中 如何将一个字符串转换为相应的二进制串 01形式表示 并且能够将这个二进制串再转换回原来的字符串 一个简单版本 def encode s return join bin ord c replace 0b for c
  • 企业实施数字工厂管理系统应对这几个流程进行优化

    在当今快速发展的商业环境中 企业需要不断地提高管理水平以保持竞争优势 数字工厂系统解决方案作为一种先进的信息化管理系统 可以帮助企业在多个方面实现管理改进 本文将探讨数字工厂管理系统对企业管理的九个方面的影响和作用 一 企业信息化管理方面
  • iOS下XMPP开发之XMPP开发环境配置(一)MySQL安装配置

    1 即时通讯技术简介 即时通讯技术 IM Instant Messaging 支持用户在线实时交谈 如果要发送一条信息 用户需要打开一个小窗口 以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容 有许多的IM系统 如AOL Yah
  • 【Note】关于研发合作中spillover(溢出)的理解

    1 文献中的描述 1 1 technology spillover 其中非常重要的一点是 称之为technology spillover 技术溢出 的部分直接影响的是成本 而不是其他的部分 效用之类的 意识到这个关键点之后 才理解了为什么很
  • Qt中静态变量使用方法

    静态变量可以在各个页面之前使用 先定义一个用于存放静态变量的类 例如datavar 在datavar h中添加如下代码 ifndef DATAVAR H define DATAVAR H include
  • Mybatis3 快速入门

    Mybatis3 快速入门 目前常见的持久层java框架有Hibernate Mybatis SpringData 笔者比较喜欢用SpringData Hibernate 和 Mybatis 也经常用 今天通过 Mybatis 的简介 数据
  • js 中的document.open 方法

    转载自 http blog 163 com hanyan102600 126 blog static 438503422008228111841848 document open 定义和用法 open 方法可打开一个新文档 并擦除当前文档的
  • 聊一聊Cookie(结合自己的学习方法分享一篇维基百科和一篇segmentfault(思否)好文)

    一 最近在带着Java服务端同学一起做一个新的项目 有一些基本的概念 无论是前端还是Java服务端 很多同学都是在按照经验办事 在一个公司的经验用很多年 经常容易犯经验主义的错误 很多时候 最基础的概念 最基本的东西还是要懂的 二 首先学习
  • Image Super-Resolution via Sparse Representation——基于稀疏表示的超分辨率重建

    经典超分辨率重建论文 基于稀疏表示 下面首先介绍稀疏表示 然后介绍论文的基本思想和算法优化过程 最后使用python进行实验 稀疏表示 稀疏表示是指 使用过完备字典中少量向量的线性组合来表示某个元素 过完备字典是一个列数大于行数的行满秩矩阵
  • C# 调用Qt 库

    转载 C 调用Qt 库 tangkaixuan 的博客 CSDN博客 c qt Qt创建动态库给C 调用 通过回调完成交互 DS小龙哥的博客 CSDN博客 qt怎么调用c
  • ant design change等方法默认传值加上自定义参数传值

  • 时间序列 R 08 指数平滑 Exponential smoothing

    1 1 简单指数平滑 simple exponential smoothing SES SES适用于不计趋势与季节性的时间序列 我们在可以使用平均值模型和naive模型来做粗略的预测 点击查看 他们懂预测方法分别是 使用最后一个值 naiv
  • STM32F042 CAN使用例子

    代码如下 include mycan h CAN初始化 tsjw 重新同步跳跃时间单元 范围 1 3 CAN SJW 1tq CAN SJW 2tq CAN SJW 3tq CAN SJW 4tq tbs2 时间段2的时间单元 范围 1 8