Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
N32L40XCL-STB
N32L40XCL-STB 开发板模块评测任务大挑战 之新建CAN测试工程
发布于 2023-04-10 22:16:09 浏览:391
订阅该版
[tocm] # 资料下载 国民技术提供了ftp://58.250.18.138网址下载。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230410/3f356f1e1a64f7b0ae2c1868e792a3e7.png.webp) 找到N32L40xxx_2.1.0.zip ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230410/42b62a6ac729dc22a7c634c0f8380bad.png.webp) 复制粘帖到本地文件夹: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230410/34515d1477d96003e6db72a64c9b63ce.png.webp) 下载速度非常快,下载完后解压,资料非常齐全,如下图: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230410/fc77a5b3302bce226916303135ba2977.png.webp) 大家如果是第一次使用国民技术的开发,一定先记得读一遍用户手册 # 开发工具选择 国民技术提供了MDK以及IAR的example工程示例。在N32L40x\N32L40xxx_V2.1.0\6-软件开发套件(Software Development Kit)\Nationstech.N32L40x_Library.1.2.1\projects\n32l40x_EVAL\examples目录下面对应为MDK-ARM与EWARM ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230410/957796afdc8bb04d76dcc7e4a41a0f31.png) 当然也可以选择其的工具,如vscode、clion等,在目录M:\N32L40x\N32L40xxx_V2.1.0\7-应用笔记(Application Note)\AN_N32G43x_N32L43x_N32L40x_GCC Development Environment Application Note_V3.0\Nationstech.N32L43x_Library.1.0.1下面有vscode的基础工程包。 我这次选择的是RT-Thread Studio工具,由于我是第N次RT-Thread studio了,这里就不展示安装,给出官方的安装教程:https://www.rt-thread.org/document/site/#/development-tools/rtthread-studio/um/studio-user-begin。 这里介绍非常详细,上手极快。 # 下载SDK支持包 按下图操作,下载开发板SDK支持包 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230410/44965c1aef6b8ca79c60719939f75bd1.png.webp) # 新建工程 菜单-文件-》新建-》RT-Thread项目 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230410/2f434585c0c72b8738fccf5fd0634255.png.webp) 选中对应的开发板 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230410/bda46bfcb69a80cf40a21f3a8c93e491.png.webp) 在project Name对话框中输入项目名称:我这里写N32L40——CAN基他的选默认配置。然后安完成,等待工程生成。 # 配置CAN 1、打开RT-Thread Settings,按下图指示,使能CAN: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230410/d2f7db585814ce7dde3fe51e9b76f237.png.webp) 2、保存,关闭RT-Thread stettings,等待自动生成工程: # 创建CAN测试工程: 在applications目录下面添加一个test_can.c,内容如下: ```c /* * 程序清单:这是一个 CAN 设备使用例程 * 例程导出了 can_sample 命令到控制终端 * 命令调用格式:can_sample can1 * 命令解释:命令第二个参数是要使用的 CAN 设备名称,为空则使用默认的 CAN 设备 * 程序功能:通过 CAN 设备发送一帧,并创建一个线程接收数据然后打印输出。 */ #include
#include "rtdevice.h" #define CAN_DEV_NAME "can1" /* CAN 设备名称 */ static struct rt_semaphore rx_sem; /* 用于接收消息的信号量 */ static rt_device_t can_dev; /* CAN 设备句柄 */ /* 接收数据回调函数 */ static rt_err_t can_rx_call(rt_device_t dev, rt_size_t size) { /* CAN 接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */ rt_sem_release(&rx_sem); return RT_EOK; } static void can_rx_thread(void *parameter) { int i; rt_err_t res; struct rt_can_msg rxmsg = {0}; /* 设置接收回调函数 */ rt_device_set_rx_indicate(can_dev, can_rx_call); #ifdef RT_CAN_USING_HDR struct rt_can_filter_item items[5] = { RT_CAN_FILTER_ITEM_INIT(0x100, 0, 0, 0, 0x700, RT_NULL, RT_NULL), /* std,match ID:0x100~0x1ff,hdr 为 - 1,设置默认过滤表 */ RT_CAN_FILTER_ITEM_INIT(0x300, 0, 0, 0, 0x700, RT_NULL, RT_NULL), /* std,match ID:0x300~0x3ff,hdr 为 - 1 */ RT_CAN_FILTER_ITEM_INIT(0x211, 0, 0, 0, 0x7ff, RT_NULL, RT_NULL), /* std,match ID:0x211,hdr 为 - 1 */ RT_CAN_FILTER_STD_INIT(0x486, RT_NULL, RT_NULL), /* std,match ID:0x486,hdr 为 - 1 */ {0x555, 0, 0, 0, 0x7ff, 7,} /* std,match ID:0x555,hdr 为 7,指定设置 7 号过滤表 */ }; struct rt_can_filter_config cfg = {5, 1, items}; /* 一共有 5 个过滤表 */ /* 设置硬件过滤表 */ res = rt_device_control(can_dev, RT_CAN_CMD_SET_FILTER, &cfg); RT_ASSERT(res == RT_EOK); #endif while (1) { /* hdr 值为 - 1,表示直接从 uselist 链表读取数据 */ rxmsg.hdr = -1; /* 阻塞等待接收信号量 */ rt_sem_take(&rx_sem, RT_WAITING_FOREVER); /* 从 CAN 读取一帧数据 */ rt_device_read(can_dev, 0, &rxmsg, sizeof(rxmsg)); /* 打印数据 ID 及内容 */ rt_kprintf("ID:%x", rxmsg.id); for (i = 0; i < 8; i++) { rt_kprintf("%2x", rxmsg.data[i]); } rt_kprintf("\n"); } } int can_sample(int argc, char *argv[]) { struct rt_can_msg msg = {0}; rt_err_t res; rt_size_t size; rt_thread_t thread; char can_name[RT_NAME_MAX]; if (argc == 2) { rt_strncpy(can_name, argv[1], RT_NAME_MAX); } else { rt_strncpy(can_name, CAN_DEV_NAME, RT_NAME_MAX); } /* 查找 CAN 设备 */ can_dev = rt_device_find(can_name); if (!can_dev) { rt_kprintf("find %s failed!\n", can_name); return RT_ERROR; } /* 初始化 CAN 接收信号量 */ rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); /* 以中断接收及发送方式打开 CAN 设备 */ res = rt_device_open(can_dev, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX); RT_ASSERT(res == RT_EOK); /* 设置 CAN 通信的波特率为 500kbit/s*/ res = rt_device_control(can_dev, RT_CAN_CMD_SET_BAUD, (void *)CAN500kBaud); /* 创建数据接收线程 */ thread = rt_thread_create("can_rx", can_rx_thread, RT_NULL, 1024, 25, 10); if (thread != RT_NULL) { rt_thread_startup(thread); } else { rt_kprintf("create can_rx thread failed!\n"); } msg.id = 0x78; /* ID 为 0x78 */ msg.ide = RT_CAN_STDID; /* 标准格式 */ msg.rtr = RT_CAN_DTR; /* 数据帧 */ msg.len = 8; /* 数据长度为 8 */ /* 待发送的 8 字节数据 */ msg.data[0] = 0x00; msg.data[1] = 0x11; msg.data[2] = 0x22; msg.data[3] = 0x33; msg.data[4] = 0x44; msg.data[5] = 0x55; msg.data[6] = 0x66; msg.data[7] = 0x77; /* 发送一帧 CAN 数据 */ size = rt_device_write(can_dev, 0, &msg, sizeof(msg)); if (size == 0) { rt_kprintf("can dev write data failed!\n"); } return res; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(can_sample, can device sample); ``` 然后编译工程: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230410/f1025dfc9af5de2f116c457a17725d69.png.webp) 【小结】到此,基于CAN测试的工程就建好了,等开发板到位,就可以用CAN分析仪来验证了。
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Lu_盼盼
这家伙很懒,什么也没写!
文章
35
回答
20
被采纳
0
关注TA
发私信
相关文章
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
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组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
SFUD
msh
ulog
C++_cpp
MicroPython
本月问答贡献
三世执戟
5
个答案
1
次被采纳
KunYi
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
JonasWen
1
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部