Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CAN总线
stm32f10x关于CAN驱动调试的一些经验
发布于 2017-12-12 22:00:19 浏览:6174
订阅该版
[align=center]![未标题-1.jpg](/uploads/201712/13/151255ub1neg0ergnafrne.jpg) 这几天因为要在stm32f103上用CAN,发现已有大神在rtthread里移植好了CAN驱动,所以打算直接拿来用,使用过程中也遇到了一些问题,总算都解决了,在这里把一些问题记录一下,希望大家用的时候少走点弯路. 1, CAN总线至少要有2个设备才能使用,否则是发不出数据的,我一开始就是犯了这个错误. 2, 我用的是F103的芯片,里面的中断函数和自带的不一样, 接收和发送分别是 ```USB_LP_CAN1_RX0_IRQHandler USB_HP_CAN1_TX_IRQHandler``` 原来的是 ```CAN1_RX0_IRQHandler CAN1_TX_IRQHandler``` 这里我用宏定义把它分开了 ```#ifdef STM32F10X_HD void USB_LP_CAN1_RX0_IRQHandler(void) #else void CAN1_RX0_IRQHandler(void) #endif // #ifdef STM32F10X_HD``` 3, 过滤器说明,filter的结构是,我在后面加了注释,分别初学者查看 ```struct rt_can_filter_item { rt_uint32_t id : 29; //实际的ID rt_uint32_t ide : 1; //0标准 1扩展 rt_uint32_t rtr : 1; //0数据帧 1远程帧 rt_uint32_t mode : 1; //过滤模式 0list 1mask rt_uint32_t mask; rt_int32_t hdr; #ifdef RT_CAN_USING_HDR rt_err_t (*ind)(rt_device_t dev, void *args , rt_int32_t hdr, rt_size_t size); void *args; #endif /*RT_CAN_USING_HDR*/ };``` 4, 我要使用的是32位的mask,程序默认的是2个16位,需要把 ```static struct stm_bxcan bxcan1data 中的0改为以下值 [0] = { .id32mask_cnt = 1, .id32bit_cnt = 32, .id16mask_cnt = 0, .id16bit_cnt = 0, },``` 5, CAN的过滤器的mask模式还是有点复杂的,查了网上很多资料来搞明白,简单来说 设置中需要设置一个32位filter和一个32位的mask,当收到一个数据扩展帧,如果 (ID<<3)&mask==filter&mask的时候,就能通过过滤器. 6, 程序中过滤器设置针对扩展帧有点问题,在bxmodifyfilter函数中,我看在最新的代码里面已经修复了,用老版本的时候要注意,修复后的代码如下. ```if (pitem->ide) { CAN_FilterInitStructure.CAN_FilterIdHigh = (ID[0] & 0xFFFF0000) >> 16; CAN_FilterInitStructure.CAN_FilterIdLow = ID[0] & 0x0000FFFF; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (ID[1] & 0xFFFF0000) >> 16; CAN_FilterInitStructure.CAN_FilterMaskIdLow = ((ID[1]) & 0x0000FFFF); } else { CAN_FilterInitStructure.CAN_FilterIdHigh = ((ID[1]) & 0x0000FFFF); CAN_FilterInitStructure.CAN_FilterIdLow = ID[0] & 0x0000FFFF; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (ID[1] & 0xFFFF0000) >> 16; CAN_FilterInitStructure.CAN_FilterMaskIdLow = (ID[0] & 0xFFFF0000) >> 16; } ```
查看更多
3
个回答
默认排序
按发布时间排序
moss
2017-12-13
这家伙很懒,什么也没写!
接收中断在stm32f10x_it.c中已经有了,最新版中。
bernard
2017-12-13
这家伙很懒,什么也没写!
赞分享!
李明
2017-12-18
这家伙很懒,什么也没写!
楼主是在哪里找到别人已经弄好的啊,我也想Down下来参考一下。
撰写答案
登录
注册新账号
关注者
0
被浏览
6.2k
关于作者
kklili
这家伙很懒,什么也没写!
提问
11
回答
13
被采纳
0
关注TA
发私信
相关问题
1
我也来传一个CANOpen移植,RTT+STM32F107+CanOpenNode
2
谁有STM32裸跑的CANopen程序啊???
3
CAN驱动程序框架
4
CAN驱动接口如何规范一下
5
RTT无法进入线程.Cannot access Memory
6
编译提示arm-none-eabi/bin/ld: cannot find crt0.o: No such file o
7
rtt 2.1.0 正式版 mdk4 bsp/stm32 编译canapp.c错误
8
STM32F10XCAN驱动使用的问题
9
2.1版本stm32f10x分支bxcan驱动波特率设置的bug
10
rtthread2.1.0下,找不到can1设备
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
[RA8D1-Vision Board] sd卡实践
2
FRDM-MCXN947开发板之RGB LED驱动
3
NXP MCXN947 测评(2)基于GPIO 控制实现DHT11 温湿度采集
4
RT-Thread Vision Board - Bare Metal Project with VSCode/PyOCD/Cortex-Debug
5
【学习分享】libc切换 -- 从newlib切换到mlibc
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
Bootloader
AT
ART-Pi
Hardfault
CAN总线
FinSH
USB
文件系统
DMA
RT-Thread
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
ota在线升级
WIZnet_W5500
I2C_IIC
UART
flash
cubemx
packages_软件包
freemodbus
潘多拉开发板_Pandora
PWM
定时器
ADC
BSP
中断
编译报错
socket
keil_MDK
GD32
MicroPython
msh
Debug
ulog
SFUD
flashDB
SDIO总线
rt_mq_消息队列_msg_queue
本月问答贡献
用户名由3_15位
19
个答案
3
次被采纳
踩姑娘的小蘑菇
16
个答案
3
次被采纳
xiaorui
7
个答案
3
次被采纳
sakumisu
5
个答案
3
次被采纳
三世执戟
32
个答案
1
次被采纳
本月文章贡献
比特饼干
3
篇文章
10
次点赞
Z_Y
2
篇文章
5
次点赞
xusiwei1236
2
篇文章
3
次点赞
yinxiangxv
2
篇文章
3
次点赞
Alipay
2
篇文章
3
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部