CAN实验
CAN 寄存器
HAL库函数
代码
#include "./BSP/CAN/can.h"CAN_HandleTypeDef g_can1_handle;
CAN_TxHeaderTypeDef g_can1_txheader;
CAN_RxHeaderTypeDef g_can1_rxheader;/* STM32F103 TS1 = 8 TS2 = 7 BRP = 3 波特率:36000 / [(9 + 8 + 1) * 4] = 500Kbps */
void can_init(void)
{g_can1_handle.Instance = CAN1;g_can1_handle.Init.Mode = CAN_MODE_LOOPBACK;/* 工作模式设置 环回模式:自发自收 *//* 波特率相关 */g_can1_handle.Init.Prescaler = 3 + 1;/* 分频系数 */g_can1_handle.Init.TimeSeg1 = CAN_BS1_9TQ;/* 时间段1 */g_can1_handle.Init.TimeSeg2 = CAN_BS2_8TQ;/* 时间段2 */g_can1_handle.Init.SyncJumpWidth = CAN_SJW_1TQ;/* 重新同步跳跃宽度 *//* CAN功能设置 */g_can1_handle.Init.AutoBusOff = DISABLE;/* 禁止自动离线管理 */g_can1_handle.Init.AutoRetransmission = DISABLE;/* 禁止自动重发 */g_can1_handle.Init.AutoWakeUp = DISABLE;/* 禁止自动唤醒 */g_can1_handle.Init.ReceiveFifoLocked = DISABLE;/* 禁止接收FIFO锁定 */g_can1_handle.Init.TimeTriggeredMode = DISABLE;/* 禁止时间触发通信模式 */g_can1_handle.Init.TransmitFifoPriority = DISABLE;/* 禁止发送FIFO优先级 */HAL_CAN_Init(&g_can1_handle);CAN_FilterTypeDef can_filterconfig = {0};/* 过滤器接收所有报文 不筛选 */can_filterconfig.FilterMode = CAN_FILTERMODE_IDMASK;can_filterconfig.FilterScale = CAN_FILTERSCALE_32BIT;can_filterconfig.FilterIdHigh = 0;can_filterconfig.FilterIdLow = 0;can_filterconfig.FilterMaskIdHigh = 0;can_filterconfig.FilterMaskIdLow = 0;can_filterconfig.FilterActivation = CAN_FILTER_ENABLE;can_filterconfig.FilterBank = 0;can_filterconfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;can_filterconfig.SlaveStartFilterBank = 14;HAL_CAN_ConfigFilter(&g_can1_handle, &can_filterconfig);HAL_CAN_Start(&g_can1_handle);
}void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan)
{GPIO_InitTypeDef gpio_init_struct = {0};__HAL_RCC_CAN1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();gpio_init_struct.Pin = GPIO_PIN_11;gpio_init_struct.Mode = GPIO_MODE_AF_INPUT;/* 复用输入 */gpio_init_struct.Pull = GPIO_PULLUP;gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &gpio_init_struct);gpio_init_struct.Pin = GPIO_PIN_12;gpio_init_struct.Mode = GPIO_MODE_AF_PP;/* 复用推挽输出 */HAL_GPIO_Init(GPIOA, &gpio_init_struct);
}/* 发送消息数据函数 */
void can_send_message(uint32_t id, uint8_t *buf, uint8_t len)
{uint32_t tx_mail = CAN_TX_MAILBOX0;g_can1_txheader.ExtId = id;g_can1_txheader.DLC = len;g_can1_txheader.IDE = CAN_ID_EXT;g_can1_txheader.RTR = CAN_RTR_DATA;HAL_CAN_AddTxMessage(&g_can1_handle, &g_can1_txheader, buf, &tx_mail);while(HAL_CAN_GetTxMailboxesFreeLevel(&g_can1_handle) != 3);
}/* 接收数据函数 */
uint8_t can_receive_message(uint8_t *buf)
{if(HAL_CAN_GetRxFifoFillLevel(&g_can1_handle, CAN_RX_FIFO0) == 0){return 0;}HAL_CAN_GetRxMessage(&g_can1_handle, CAN_RX_FIFO0, &g_can1_rxheader, buf);return g_can1_rxheader.DLC;
}
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./BSP/CAN/can.h"int main(void)
{uint8_t canbuf[8];uint8_t t = 0;uint8_t cnt = 0;uint8_t key = 0;uint8_t i = 0;uint8_t rec_len = 0;uint8_t rec_buf[8];uint8_t x = 0;HAL_Init(); /* 初始化 HAL 库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72); /* 延时初始化 */usart_init(115200); /* 传口初始化 */led_init(); /* LED初始化 */lcd_init(); /* LCD初始化 */key_init(); /* KEY初始化 */can_init(); /* CAN初始化 */lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);lcd_show_string(30, 70, 200, 16, 16, "CAN TEST", RED);lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);lcd_show_string(30, 110, 200, 16, 16, "LoopBack Mode", RED);lcd_show_string(30, 130, 200, 16, 16, "KEY0:Send", RED); /* 显示提示信息 */lcd_show_string(30, 150, 200, 16, 16, "Count:", RED); /* 显示当前计数值 */lcd_show_string(30, 170, 200, 16, 16, "Send Data:", RED); /* 提示发送的数据 */lcd_show_string(30, 230, 200, 16, 16, "Receive Data:", RED); /* 提示接收到的数据 */while(1){key = key_scan(0);if(key == KEY0_PRES)/* KEY0按下一次,发送一次数据 */{for(i = 0; i < 8; i++){canbuf[i] = i + cnt;/* 填充发送缓冲区 */if (i < 4){lcd_show_xnum(30 + i * 32, 190, canbuf[i], 3, 16, 0X80, BLUE); /* 显示数据 */}else{lcd_show_xnum(30 + (i - 4) * 32, 210, canbuf[i], 3, 16, 0X80, BLUE); /* 显示数据 */}}can_send_message(0x12345678, canbuf, 8);/* ID = 0X12345678, 发送8个字节 */}rec_len = can_receive_message(rec_buf);/* 接收数据查询 */if(rec_len)/* 接收到有数据 */{for(x = 0; x < rec_len; x++){if (x < 4){lcd_show_xnum(30 + x * 32, 250, canbuf[x], 3, 16, 0X80, BLUE); /* 显示数据 */}else{lcd_show_xnum(30 + (x - 4) * 32, 270, canbuf[x], 3, 16, 0X80, BLUE); /* 显示数据 */}}}t++;if(t == 20){t = 0;LED1_TOGGLE();/* 提示系统正在运行 */cnt++;lcd_show_xnum(30 + 48, 150, cnt, 3, 16, 0X80, BLUE); /* 显示数据 */}delay_ms(10);}
}
相关文章:

CAN实验
CAN 寄存器 HAL库函数 代码 #include "./BSP/CAN/can.h"CAN_HandleTypeDef g_can1_handle; CAN_TxHeaderTypeDef g_can1_txheader; CAN_RxHeaderTypeDef g_can1_rxheader;/* STM32F103 TS1 8 TS2 7 BRP 3 波特率:36000 / [(9 8 1) * 4] 500Kbps …...

(一)pytest自动化测试框架之生成测试报告(mac系统)
前言 我们可以通过pytest-html插件来生成测试报告,但是pytest-html插件生成的测试报告不够美观,逼格也不够高,通过allure生成的测试报告是比较美观的,花里胡哨的,能够提升一个level。 allure官网: Allure…...

微服务实战系列之Nginx
前言 Nginx?写了那么多文章,为什么今天才轮到它的表演?那是因为它实在太重要了,值得大书特书,特别对待。 当我们遇到单点瓶颈,第一个idea是?Nginx; 当我们需要反向代理,…...
使用rsync从OpenShift的pod复制文件
环境 Red Hat Enterprise Linux release 8.6 (Ootpa)OCP 4.12.22 准备 安装rsync: yum install rsync 查看pod: [rootapi.kai1123.cp.fyre.ibm.com ~]# oc get pod -n cpd-instance | grep dmc ...... ibm-dmc-1700727413211000-monitor-0 …...

解决Activiti5.22流程图部署在Windows上正常,但在linux上部署后出现中文变方块的问题
总结/朱季谦 楼主最近在做公司的工作流平台,发现一个很无语的事情,Activiti5.22的流程图在Windows环境上部署,是可以正常查看的,但发布到公司的Linux服务器上后,在上面进行流程图在线部署时,发现中文都变成…...

EMG肌肉电信号处理合集(三)
本文主要展示常见的肌电信号预处理的实现,开发环境为matlab。 目录 1 肌电信号低通,高通,带通滤波 2 去除DC 0阶偏置,1阶偏置 3 全波整流 4 信号降采样 5 linear envolope / butterworth 低通滤波器 1 肌电信号低通…...

GitHub桌面版
GitHub桌面版 一、GitHub 桌面版二、clone 仓库三、更新仓库 一、GitHub 桌面版 二、clone 仓库 三、更新仓库...

【广州华锐互动】昆虫3D虚拟动态展示:探索神奇的微观世界
在这个充满科技魅力的时代,我们可以通过各种方式去了解和探索自然界的奥秘。而昆虫作为地球上最为丰富多样的生物群体之一,其独特的生活习性和形态特征一直吸引着人们的目光。 由广州华锐互动开发的昆虫3D虚拟动态展示系统,成为了一种全新的科…...

《QT从基础到进阶·三十六》QWidget实现收缩栏的效果
功能: 1、可以在收缩栏插件中添加界面 2、可以把界面展开或收缩 3、可以用鼠标拖动界面改变界面的排放顺序 源码放在最下方 1、可以在收缩栏插件中添加界面 virtual void addWidget(QWidget* widget, const QString& label, const QIcon& icon QIcon())…...

运行软件报错找不到vcruntime140.dll无法继续执行代码怎么办-6个解决方法
vcruntime140.dll是一个由Microsoft Visual C提供的运行时库文件,它为许多Microsoft Visual Studio开发的应用程序提供了必要的支持。这个文件对于许多Windows应用程序的正常运行至关重要。然而,有时会出现vcruntime140.dll缺失的问题,导致应…...

从Discord的做法中学习 — 使用Golang进行请求合并
正如你可能之前看到的,Discord去年发布了一篇有价值的文章,讨论了他们成功存储了数万亿条消息。虽然有很多关于这篇文章的YouTube视频和文章,但我认为这篇文章中一个名为“数据服务为数据服务”的部分没有得到足够的关注。在这篇文章中&#…...

【教3妹学编程-算法题】统计和小于目标的下标对数目
2哥 : 3妹,OpenAI的宫斗剧迎来了大结局!OpenAI宣布阿尔特曼复职CEO,董事会重组 3妹:啊?到底谁才是幕后操纵者啊,有咩有揪出来 2哥 : 也不是很清楚,据说在被开除的几周前,前CEO曾谴责…...

OSG粒子系统与阴影-雾效模拟(1)
虚拟现实中有很多效果,如雨效、雪效、雾效等,这些都可以通过粒子系统来实现。一个真实的粒子系统的模式能使三维场景达到更好的效果。 本章对OSG粒子系统的使用以及生成自定义粒子系统的方法进行了详细介绍最后还附带说明了阴影的使用方法。在实时的场景…...

Windows power shell for循环
有时候需要重复执行某个shell命令 for($i1;$i -lt 10;$i$i1){echo $i}如果是cmd for /l %i in (1,1,5) do echo %i...

GIT实践与常用命令---回退
实践场景 场景1 回退提交 在日常工作中,我们可能会和多个同事在同一个分支进行开发,有时候我们可能会出现一些错误提交,这些错误提交如果想撤销,可以有两种解决办法:回退( reset )、反做(revert) keywords:reset、rev…...

Python-Django的“日志功能-日志模块(logging模块)-日志输出”的功能详解
01-综述 可以使用Python内置的logging模块来实现Django项目的日志记录。 所以与其说这篇文章在讲Django的“日志功能-日志模块-日志输出”,不如说是在讲Pthon的“日志功能-日志模块-日志输出”,即Python的logging模块。 下面用一个实例来进行讲解。 …...
C现代方法(第23章)笔记——库对数值和字符数据的支持
文章目录 第23章 库对数值和字符数据的支持23.1 <float.h>: 浮点类型的特性23.2 <limits.h>: 整数类型的大小23.3 <math.h>: 数学计算(C89)23.3.1 错误23.3.2 三角函数23.3.3 双曲函数23.3.4 指数函数和对数函数23.3.5 幂函数23.3.6 就近舍入、绝对值函数和取…...

NSGA-II求解微电网多目标优化调度(MATLAB)
一、NSGA-II简介 NSGA-Ⅱ算法是Kalyanmoy Deb等人于 2002年在 NSGA 的基础上提出的,它比 NSGA算法更加优越:它采用了快速非支配排序算法,计算复杂度比 NSGA 大大的降低;采用了拥挤度和拥挤度比较算子,代替了需要指定的…...
7-9 jmu-python-班级人员信息统计
7-9 jmu-python-班级人员信息统计 分数 15 作者 郑如滨 单位 集美大学 输入a,b班的名单,并进行如下统计。 输入格式: 第1行::a班名单,一串字符串,每个字符代表一个学生,无空格,可能有重复字符。 第2行:&am…...
Doris分区与分桶(八)
接上篇----------Doris 建表示例 Doris 支持两层的数据划分。第一层是 Partition,支持 Range 和 List 的划分方式。第二层是 Bucket(Tablet),仅支持 Hash 的划分方式。 也可以仅使用一层分区。使用一层分区时,只支持…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...