看来还是很多人不会设置过滤器,我也看了很久才会,大家先去看一个寄存器 CAN_TIxR(x=0~2) 发送邮箱标识寄存器
标准帧在 31~21 位 共11位 STID[10:0]
扩展帧在 20~3 位 共29位 EXID[17:0]+STID[10:0]
0~2 位分别为 TXRQ ,RTR ,IDE
uint16_t CAN_ID = 0x0101
uint32_t ExCAN_ID= 0x10001
所以设置标位帧ID过滤应该这样设:
CAN_FilterInitStructure.CAN_FilterIdHigh = CAN_ID<<5;
CAN_FilterInitStructure.CAN_FilterIdLow = 0;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC; //RTR 可以为数据帧也可以远帧
//注意接收到对方的数据帧的标志寄存器中的TXRQ肯定是为0的,IDE表示标志符模式(标志or扩展),RTR表示是数据帧还是远程帧
扩展帧ID过滤应该这样设:
CAN_FilterInitStructure.CAN_FilterIdHigh = (uint16_t)(ExCAN_ID>>(29-16)); //取高16位
CAN_FilterInitStructure.CAN_FilterIdLow = (uint16_t)(ExCAN_ID<<3)|CAN_ID_EXT;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow 0xFFFC; //RTR 可以为数据帧也可以远帧
今天刚学会,大家有不懂可以问,不过一般官方资料里就有,仔细阅读就可以了,如果你想两种帧都接收,那就把IDE位也屏蔽掉
可以这样 CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC&(~CAN_ID_EXT);
关键字:STM32 CAN 过滤器设置
引用地址:
STM32 CAN过滤器设置
推荐阅读最新更新时间:2024-03-16 14:34
linux搭建stm32开发环境
下载stm32固件库 创建目录 libs目录放stm32固件库,src放用户源码,inc放用户头文件 # mkdir libs src inc 将STM32F10x_StdPeriph_Lib_V3.5.0复制到libs目录下 创建Makefile.common 在主目录下创建 Makefile .common文件,这个是通用Makefile文件 #This file is included in the general Makefile, the libs Makefile and the src Makefile #Different optimize settings for library and sou
[单片机]
基于ARM处理器的CAN节点设计
引言 随着信息技术的飞速发展,基于ARM在嵌入式系统方面的优势和CAN总线的广泛应用,目前越来越多的ARM处理器内部自带了CAN控制器,极大的方便了开发人员对CAN总线的开发。本课题是基于ARM2104的微处理器CAN总线系统节点开发,采用CAN总线可以将节点控制器直接安装在现场,数据经处理后发送到总线上,实现了信息的全数字方式传输,提高了传输的抗干扰能力,增加了信息的传输量。 总体设计方案 本课题中所设计的是CAN总线系统节点,系统节点结构图如图1。 图1 系统节点结构图 CAN总线系统应用要求:CAN总线接口的扩展、点对点通信。 CAN节点的设计主要是CAN通信控制器与微处理器之间、CAN总线收发器与物理总线之
[单片机]
STM32的ADC和串口
如果简单的使用USART的话配置相当简单,只要配置一下波特率,数据长度,停止位长度,校验位。然后再设置一下串口的引脚,输入为上后输入,输出为利用推挽输出。这样一来串口就配置好了,如果使用库则一目了然,如果使用寄存器操作会繁琐一点找各个寄存器,因为设置波特率和设置数据长度等这些并不在一个寄存器中设置完成,还有可能忘记个别设置而无法找其原因。但寄存器操作的效率会很高。如下配置: void USART_Initial(uint32_t Baud) { USART_InitTypeDef USART_InitStruct; USART_GPIO(); //配置串口引脚 USART_InitStruct.USART_BaudRate=Bau
[单片机]
stm32通过IO口模拟输出多路pwm
这里主要用于控制舵机,使用TIM1模拟了5路50Hz的PWM信号,只调节占空比控制舵机角度。 最大能模拟多少路没有具体测试。 缺点:因为是定时器中断模拟(中断比较频繁),所以会影响main函数运行。 LED p1('A',8); //IO口初始化,这里就不介绍了,推挽输出 LED p2('A',9); LED p3('A',10); LED p4('A',11); LED p5('A',4); u16 count=0; u16 pwm_count=1000; //总计数 周期20ms,20us进次 u16 pwm1=25; u16 pwm2=
[单片机]
STM32笔记——外部中断的配置
一、选择对应芯片 常规操作,这里我们选择F407ZGT6 二、配置sys 选择Serial Wire 三、配置RCC 选择高速外部时钟晶振,系统自动配置相应引脚。 四、配置外部中断引脚 通过查看开发板原理图,找出按键对应引脚 五、设置外部中断引脚 1、上升沿触发(外部中断触发引脚上的电平从低电平跳转到高电平) 2、下降沿触发(外部中断触发引脚上的电平从高电平跳转到低电平) 3、上下边沿均触发 (外部中断触发引脚上有电平变化) 六、开启外部中断 七、配置中断优先级 八、配置时钟 九、生成工程 HAL库GPIO函数库讲解 1、外部中断服务函数 void HAL_GPIO_EXTI_IRQ
[单片机]
STM32笔记---DMA(USART)的演示
这里有个小小的例子,来演示DMA模块与系统程序并行工作。 用串口以低波特率发送一个10K的数据,花费近10s时间,此时按照以往方法,CPU要不断等待数据发送、送数据;或者送数据、进中断、送数据,处理起来比较消耗时间。 使用了DMA功能以后,用户程序中只需配置好DMA,开启传输后,再也不需要操心,10K数据完成后会有标志位或中断产生,期间可以做任何想做的事,非常方便。 这个是相应的代码例子,基于STM32F103VBT6 /****************************************************************************** * 本文件实现串口发送功能(通过重构
[单片机]
STM32 DMA模块的配置与使用
DMA有什么用? 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。 有多少个DMA资源? 有两个DMA控制器,DMA1有7个通道,DMA2有5个通道。 数据从什么地方送到什么地方? 外设到SRAM(I2C/UART等获取数据并送入SRAM); SRAM的两个区域之间; 外设到外设(ADC读取数据后送到TIM1控制其产生不同的PWM占空比); SRAM到外设(SRAM中预先保存的数据送入DAC产生各种波形); ……还有一些目前还搞不清楚的。 DMA可以传递多少数据?
[单片机]
基于VSCode搭建STM32开发环境
众所周知, Keil 是一款收费软件,虽然可以Po解使用,但很多 公司 还是有点害怕,想必有不少读者都收到过**函。 之前,开发 单片机 项目,可以说 Keil 是最佳选择之一,但VSCode横空问世之后,这种格局被打破。 因为 VSCode 免费且好用,可以安装各种插件,很多 工程师 逐渐从Keil 转向了 VSCode。而且,VSCode还能实现 Keil 不能实现的一些功能。 下面就给大家分享一下 VSCode 搭建 STM32 开发环境的一些常规且使用的功能。 一、需要的软件和工具 下载 最新版 VS Code: 安装好插件,具有良好的代码补全与调试功能。 下载 LLVM:用于代码补全,其实可以理解
[单片机]