gd32F470配置CAN通信

can.c

#include "can.h"can_trasnmit_message_struct transmit_message;//传入参数为0,则初始化CAN0的GPIO引脚;传入参数为1,则初始化CAN1的GPIO引脚
void CanGpioInit(void)
{/* enable can clock */rcu_periph_clock_enable(RCU_CAN0);rcu_periph_clock_enable(RCU_GPIOD);/* configure CAN0 GPIO, CAN0_TX(PD1) and CAN0_RX(PD0) */gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1);gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1);gpio_af_set(GPIOD, GPIO_AF_9, GPIO_PIN_1);gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_0);gpio_af_set(GPIOD, GPIO_AF_9, GPIO_PIN_0);
}
//初始化CAN和配置过滤器,不过滤任何ID
void can_networking_init(void)
{can_parameter_struct can_parameter;can_filter_parameter_struct can_filter;/* initialize CAN structures */can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);/* initialize CAN register */can_deinit(CAN0);/* initialize CAN */can_parameter.time_triggered = DISABLE;can_parameter.auto_bus_off_recovery = ENABLE;can_parameter.auto_wake_up = DISABLE;can_parameter.auto_retrans = ENABLE;can_parameter.rec_fifo_overwrite = DISABLE;can_parameter.trans_fifo_order = DISABLE;can_parameter.working_mode = CAN_SILENT_LOOPBACK_MODE;can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;can_parameter.time_segment_1 = CAN_BT_BS1_7TQ;can_parameter.time_segment_2 = CAN_BT_BS2_2TQ;/* baudrate 1Mbps */can_parameter.prescaler = 5;can_init(CAN0, &can_parameter);/* initialize filter *//* CAN0 filter number */can_filter.filter_number = 0;/* initialize filter */can_filter.filter_mode = CAN_FILTERMODE_MASK;can_filter.filter_bits = CAN_FILTERBITS_32BIT;can_filter.filter_list_high = 0x0000;can_filter.filter_list_low = 0x0000;can_filter.filter_mask_high = 0x0000;can_filter.filter_mask_low = 0x0000;can_filter.filter_fifo_number = CAN_FIFO0;can_filter.filter_enable = ENABLE;can_filter_init(&can_filter);//使能CAN0的接收中断nvic_irq_enable(CAN0_RX0_IRQn, 0, 0);can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0);
}uint8_t can_send_msg(uint32_t id, uint8_t *msg, uint8_t len)
{uint32_t timeout = 0xFFFF;uint8_t transmit_mailbox = 0;transmit_message.tx_sfid = id;transmit_message.tx_efid = id;transmit_message.tx_ft = CAN_FT_DATA;transmit_message.tx_ff = CAN_FF_STANDARD;transmit_message.tx_dlen = len;for(int i=0;i<len;i++){transmit_message.tx_data[i] = msg[i];}transmit_mailbox = can_message_transmit(CAN0, &transmit_message);/* waiting for transmit completed */timeout = 0xFFFF;while((CAN_TRANSMIT_OK != can_transmit_states(CAN0, transmit_mailbox)) && (0 != timeout)){timeout--;}if(timeout==0){return 1;//发送失败} return 0;//发送成功
}

can.h

#ifndef __CAN_H
#define __CAN_H#include "head.h"void CanGpioInit(void);
void can_networking_init(void);
uint8_t can_send_msg(uint32_t id, uint8_t *msg, uint8_t len);extern can_trasnmit_message_struct transmit_message;#endif

中断处理函数

char receive_flag;
can_receive_message_struct receive_message;void CAN0_RX0_IRQHandler(void)
{/* check the receive message */can_message_receive(CAN0, CAN_FIFO0, &receive_message);if((0x7ab == receive_message.rx_sfid)&&(CAN_FF_STANDARD == receive_message.rx_ff) && (8 == receive_message.rx_dlen)){receive_flag = 1;}
}

主函数

	CanGpioInit();can_networking_init();uint8_t buf[8];buf[0] = 0xA0;buf[1] = 0xA1;buf[2] = 0xA2;buf[3] = 0xA3;buf[4] = 0xA4;buf[5] = 0xA5;buf[6] = 0xA6;buf[7] = 0xA7;while(1){can_send_msg(0x7ab,buf,8);if(1 == receive_flag){receive_flag = 0;for(int i = 0; i < receive_message.rx_dlen; i++){printf(" %02x", receive_message.rx_data[i]);}}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/668105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最大子数组(c++题解)

题目描述 题目描述 给你一个长度为 的整数数组 。 求长度为 的 的连续子数组 中 的最大值。 连续子数组定义&#xff1a; 一个数列的连续子数组是指从原数组中连续若干个元素组成的子数组。 例如&#xff0c;和是的连续子数组&#xff0c;但和不是的连续子数组。 输…

【Golang】自定义logrus日志保存为日志文件

背景 为了方便查看日志&#xff0c;项目中需要把日志保存到对应的日志文件中&#xff0c;所以需要当前的配置&#xff0c;以使得日志能够保存到对应的日志文件中。 代码 import ("github.com/orandin/lumberjackrus""github.com/sirupsen/logrus" )func …

骨传导是表示啥?骨传导耳机有什么优势

最近市场上兴起了一股骨传导耳机的热潮&#xff0c;它引起了广泛的关注并带来了许多用户的好奇&#xff1a;骨传导是表示啥&#xff1f;骨传导耳机有什么优势&#xff1f;接下来我们将深入探讨骨传导是表示啥以及骨传导耳机有什么优势。 骨传导是表示啥 简而言之&#xff0c;骨…

[office] Excel表格中画出对角线打字的操作方法 #微信#知识分享

Excel表格中画出对角线打字的操作方法 Excel单元格中加斜线非常的简单&#xff0c;但如何在加斜线的单元格内打字却成了一大难题&#xff0c;既要设置好文字位置&#xff0c;又要利用Alt回车键进行换行。今天&#xff0c;小编就教大家在Excel表格中画出对角线打字的操作方法。 …

c实现顺序表

目录 c语言实现顺序表 完整代码实现 c语言实现顺序表 顺序表的结构定义&#xff1a; typedef struct vector {int size; // 顺序表的容量int count; // 顺序表现在存储了多少个数据int *data; // 指针指向连续的整型存储空间 } vector;顺序表的结构操作&#xff1a; 1、初始化…

VSCode 安装LLDB调试器(OS X)并启动调试

插件&#xff1a;&#xff08;LLDB插件安装&#xff09; 安装这个版本不好弄错了&#xff0c;CodeLLDB&#xff08;名字&#xff09; 配置&#xff1a;&#xff08;LLDB启动调试&#xff09; {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更…

Python循环语句——while循环的嵌套应用

一、引言 在Python编程中&#xff0c;循环结构是必不可少的。其中&#xff0c;while循环因其灵活性而备受青睐。嵌套while循环&#xff0c;即将一个while循环放置在另一个while循环内部&#xff0c;能让我们编写更为复杂的程序逻辑。本文将详细介绍嵌套while循环的基本概念、使…

day32 买卖股票的最佳时机Ⅱ 跳跃游戏 跳跃游戏Ⅱ

题目1&#xff1a;122 买卖股票的最佳时机Ⅱ 题目链接&#xff1a;122 买卖股票的最大时机Ⅱ 题意 整数数组prices[i]表示某股票的第i天的价格&#xff0c;每天可买卖股票且最多持有1股股票&#xff0c;返回最大利润 利润拆分&#xff0c;拆分为每天的利润 每天的正利…

李沐《动手学深度学习》循环神经网络 经典网络模型

系列文章 李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 李沐《动手学深度学习》线性神经网络 线性回归 李沐《动手学深度学习》线性神经网络 softmax回归 李沐《动手学深度学习》多层感知机 模型概念和代码实现 李沐《…

从0开始搭建、上传npm包

从0开始搭建、上传npm包 1、上传一个简单获取水果价格的包创建 vite 项目在项目根目录 src 文件夹中创建 index.ts 文件&#xff0c;文件内容如下&#xff1a;在 main.ts 文件中导入、导出上面创建的方法创建 vite.config.ts 配置文件&#xff0c;文件内容如下配置 package.jso…

Matplotlib热力图的创意绘制指南【第54篇—python:Matplotlib热力图】

文章目录 Matplotlib热力图的创意绘制指南1. 简介2. 基本热力图3. 自定义颜色映射4. 添加注释5. 不同形状的热力图6. 分块热力图7. 多子图热力图8. 3D热力图9. 高级颜色映射与颜色栏设置10. 热力图的动态展示11. 热力图的交互性12. 标准化数据范围13. 导出热力图 总结&#xff…

51单片机实验课二

实验任务一&#xff1a; 用C语言设计实现8个led灯左右移动显示效果。具体要求如下&#xff1a; 左移时&#xff0c;8个灯中的奇数位灯依次点亮&#xff1b; 右移时&#xff0c;8个灯中的偶数灯依次点亮&#xff1b; 如此循环往 #include <REGX52.H> void Delay(unsi…

【从0上手Cornerstone3D】如何使用CornerstoneTools中的工具之工具介绍

简单介绍一下在Cornerstone中什么是工具&#xff0c;工具是一个未实例化的类&#xff0c;它至少实现了BaseTool接口。 如果我们想要在我们的代码中使用一个工具&#xff0c;则必须实现以下两个步骤&#xff1a; 使用Cornerstone的顶层addTool函数添加未实例化的工具 将工具添…

esp8266 步骤

安装驱动 http://arduino.esp8266.com/stable/package_esp8266com_index.json oled库 esp8266-oled-ssd1306

RabbitMQ 部署指南

RabbitMQ部署指南 1.单机部署 在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一&#xff1a;在线拉取 docker pull rabbitmq:3.8-management方式二&#xff1a;从本地加载 加载镜像包&#xff1a; 上传到虚拟机中后&#xff0c;使用命令加载镜像即可&#xff1…

RNN(神经网络)

目录 介绍&#xff1a; 数据&#xff1a; 模型&#xff1a; 预测&#xff1a; 介绍&#xff1a; RNN&#xff0c;全称为循环神经网络&#xff08;Recurrent Neural Network&#xff09;&#xff0c;是一种深度学习模型&#xff0c;它主要用于处理和分析序列数据。与传统…

08-常用集合(容器)

上一篇&#xff1a; 07-使用Package、Crates、Modules管理项目 Rust 的标准库包含许多非常有用的数据结构&#xff0c;称为集合。大多数其他数据类型表示一个特定值&#xff0c;但集合可以包含多个值。与内置的数组和元组类型不同&#xff0c;这些集合指向的数据存储在堆上&…

uniapp /微信小程序 使用map组件实现手绘地图方案

获取地图范围 点图拾取坐标-地图开放平台|腾讯位置服务 获取需要手绘地图左下角和右上角GPS坐标 以北京故宫为例&#xff1a; 截取需要手绘地图进行手绘地图制作 ​​​​​​​​​​​​​​ 素材处理 由于地图素材文件比较大&#xff0c;小程序又限制包大小<2M,无…

clickhouse query log

查询当前进行中的query SELECT query_id, read_rows, total_rows_approx, memory_usage, initial_user, initial_address, elapsed, query, client_hostname FROM system.processes; 查询最后一个状态为”查询完成“的query SELECT * FR…

Ps:文档窗口状态栏

状态栏 Status Bar位于每个文档窗口的底部&#xff0c;可显示诸如视图的缩放比例及文件相关的有用信息。 ◆ ◆ ◆ 缩放比例 显示当前视图的放大比例&#xff0c;例如 100% 表示实际大小。 有关视图的缩放&#xff0c;请参阅&#xff1a; 《Ps&#xff1a;缩放工具》 可以直接…