起因:在使用stm32单片机can通讯时,参考手册的介绍与寄存器封装有差别,不好理解怎么去设置寄存器。在参考一些代码时,对怎么去设置过滤器还是难以理解。
解决:
在寄存器封装库中,我们发现CAN过滤器设置寄存器封装有CAN1->sFilterRegister[ x ].FR1 和 CAN1->sFilterRegister[ x ].FR2 两个寄存器,其封装如下:
typedef struct
{
__IO uint32_t FR1;
__IO uint32_t FR2;
} CAN_FilterRegister_TypeDef;
我所碰到的问题便是这两个寄存器的如何设置问题。
首先我们得理解过滤器的格式,如下:
我们所要设置的寄存器CAN1->sFilterRegister[ x ].FR1便是如上图所说的标识符屏蔽模式中的 ID,
而CAN1->sFilterRegister[ x ].FR2, 就是屏蔽寄存器; 在标识符列表模式中,两者都是ID。
我们按上面的格式去设置寄存器: 标准ID / 拓展ID + IDE + RTR + x 。
已知 IDE = 0 代表标准ID, IDE =1 代表拓展ID; RTR = 0代表数据帧,RTR = 1代表远程帧;
那么,我们给个例子:
标识符列表 ID = 0x09 拓展帧 :
CAN1->sFilterRegister[0].FR1=0x09<<3|0x04; //id=0x01,拓展帧数据
CAN1->sFilterRegister[0].FR2=0x09<<3|0x04; //标识符列表,相同
过滤寄存器如此设置就能过滤拓展帧的id为0x09的数据了
标识符屏蔽 ID = 0x11 标准帧 :
CAN1->sFilterRegister[1].FR1=0x11<<21|0x04; //标准id, 0x04为屏蔽模式,
CAN1->sFilterRegister[1].FR2=0xffc00004; //id全部屏蔽,IDE屏蔽,RTR屏蔽
过滤器如此设置就能过滤标准帧id为0x11的数据。
到这里基本上写完了,这些都是通过验证得到的。如果有问题的欢迎交流。
关键字:stm32 Can通讯 过滤器 寄存器设置
引用地址:
stm32 Can通讯过滤器寄存器设置
推荐阅读最新更新时间:2024-03-16 16:08
STM32 串口例程之查询收发
有了STM32,使用串口简直就是玩游戏的感觉。这里鄙人就不谈STM32串口的happy了,直接上代码,读者从代码中体会乐趣。发送接受均采用查询方式,串口调试工具使用超级终端或者这货--SecureCRT 5.5(传说比超级终端还超级),在中端里面输入什么,同步接受与发送,感觉就像是在文本框里面打字。 还是甩一张工程结构图正面: 代码鄙人偷懒,所有代码在main.c里面一锅煮:
[单片机]
STM32 UART DMA实现未知数据长度接收
串口通信是经常使用到的功能,在STM32中UART具有DMA功能,并且收发都可以使用DMA,使用DMA发送基本上大家不会遇到什么问题,因为发送的时候会告知DMA发送的数据长度,DMA按照发送的长度直接发送就OK了,但是使用DMA接收时候就不同了,因为有时候数据接收并不是每一次都是定长的,但是DMA只在接收数据长度和设定数据长度相同的时候才可以触发中断,告诉MCU数据接收完毕,针对这个问题,解决方法如下,有一点复杂,但是很管用。 UART在传输一个字节的时候,首先拉低,传输起始位,然后在是LSB MSB,最后是停止位,停止位是高电平 超时时间 搞过串口通信的都知道,如果串口有协议,一般都是有个超时时间的,超时时间是定义两个帧之间的间
[单片机]
STM32学习笔记(6.2):LCD的显示
7.程序源代码 main.c文件中的代码: #include stm32f10x_lib.h #include stm32f10x_lcd.h extern unsigned char LCD_Image_BIT ; extern unsigned char LCD_Image_HIT ; void RCC_cfg(); void FSMC_cfg(); void LCD_cfg(); void GPIO_cfg(); void LCD_Show(unsigned char * LCD_Image); int main() { RCC_cfg(); GPIO_cfg(); FSMC_cfg(); LCD_cfg();
[单片机]
STM32学习之路-LCD(3)<显示图片>
函数是照搬奋斗的例子,算是些笔记吧.不过奋斗的例子注释的不是很详细.今天去看了正点原子的论坛,唉..瞬间感觉正点原子做得真的很好 能把所有的资料都开源,并且论坛上大多问题都耐心的解答了.这实在是非常非常好的售后服务了!!自己也偷偷的去下了写资料来看看,(*^__^*) 嘻嘻…… 好,进入主题: 开发板:奋斗V5 LCD:3寸 400X240 直接上代码吧 void lcd_DrawPicture(u16 StartX,u16 StartY,u8 Dir,u8 *pic) { u32 i=8, len; u16 temp,x,y; /******************************
[单片机]
stm32---输入捕获
输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。STM32 的输入捕获,简单地说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)中。 1. 相关寄存器介绍 1) 捕获/比较模式寄存器 (TIMx_CCMRx) 当在输入捕获模式下使用的时候,对应上图的第二行描述,从图中可以看出,TIMx_CCMR1 明显是针对 2 个通道的配置,低八位 用于捕获/比较通道 1 的控制,而高八位 则用于捕获/比较通道 2 的控制。同
[单片机]
STM32的串口发送数据(字符,字符串,数字.......)
#include stm32f10x.h #include stdio.h //下面strlen函数需要此头文件 #include USART.h /********************************************************** ** 函数名:u32tostr ** 功能描述: 将一个32位的变量dat转为字符串,比如把1234转为 1234 ** 输入参数: dat:带转的long型的变量 str:指向字符数组的指针,转换后的字节串放在其中 ** 输出参数: 无 ***************************************************
[单片机]
STM32 进阶教程 8 - 位带操作
前言 有过51单片机开发经历的朋友应该都对51的IO口或一些特殊寄存器可以直接按位操作的方式不陌生吧,那么在stm32中有没有类似的操作呢,答案是肯定的,本节将给大家介绍如何在STM32中实现位带操作。 在《ARM Cortex-M3权为指南》中的第87页对位带操作如下描述: 位带操作 支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。在 CM3中,有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过
[单片机]
STM32串口中断使用
简介:STM32串口中断使用:配置串口时钟在void Rcc_Configuration(void)函数中实现,配置串口管脚在void UsartGPIO_Configuration(void)中实现;初始化参数设置串口中断配置。 以提高CPU的利用率。在程序中处理流程如下: 一:串口初始化 1.配置串口时钟 在void Rcc_Configuration(void)函数中实现 1.void Rcc_Configuration(void) 1.{ 2. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); 3.
[单片机]