CUBEMX配置

news/2024/12/26 13:07:51/文章来源:https://www.cnblogs.com/AdonisJin/p/18550424

遥控器配置

cubemx配置

  1. 在 Connectivity 标签页下将 USART3 打开,将其 Mode 设置为 Asynchronous 异步通讯方式
    image

  2. 将其波特率设置为 100000,数据帧设置为9位数据位(实测8位有错误),单校验位,1 位停止位

  3. 接着开启USART3 的 DMA 功能,在 USART3 下找到 DMA Settings 标签呀,在 USART3 中将 DMA Request 选 为 USART3_RX,数据从外设流向存储器,Priority 选为 low,Mode 选择Circular
    image

keil配置

dbus.h
#ifndef __DBUS_H__
#define __DBUS_H__#include "main.h"
#include "stdbool.h"
#define MISSING_TIMEOUT 100#define KEY_V	16384
#define KEY_Q	64
#define KEY_W	1
#define KEY_A 4
#define KEY_S 2
#define KEY_D	8#define KEY_E	128
#define KEY_R	256
#define KEY_B	32768
#define KEY_Z	2048
#define KEY_X	4096
#define KEY_SHIFT 16/* ----------------------- RC Channel Definition---------------------------- */#define    RC_CH_VALUE_MIN       ((int16_t)-660 )
#define    RC_CH_VALUE_OFFSET    ((int16_t)0)
#define    RC_CH_VALUE_MAX       ((int16_t)660)/* ----------------------- RC Switch Definition----------------------------- */#define    RC_SW_UP              ((uint16_t)1)
#define    RC_SW_MID             ((uint16_t)3)
#define    RC_SW_DOWN            ((uint16_t)2)/* ----------------------- PC Key Definition-------------------------------- */#define    KEY_PRESSED_OFFSET_W        ((uint16_t)0x01<<0)
#define    KEY_PRESSED_OFFSET_S        ((uint16_t)0x01<<1)
#define    KEY_PRESSED_OFFSET_A        ((uint16_t)0x01<<2)
#define    KEY_PRESSED_OFFSET_D        ((uint16_t)0x01<<3)
#define    KEY_PRESSED_OFFSET_SHIFT    ((uint16_t)0x01<<4)
#define    KEY_PRESSED_OFFSET_CTRL     ((uint16_t)0x01<<5)
#define    KEY_PRESSED_OFFSET_Q        ((uint16_t)0x01<<6)
#define    KEY_PRESSED_OFFSET_E        ((uint16_t)0x01<<7)
#define    KEY_PRESSED_OFFSET_R        ((uint16_t)0x01<<8)
#define    KEY_PRESSED_OFFSET_F        ((uint16_t)0x01<<9)
#define    KEY_PRESSED_OFFSET_G        ((uint16_t)0x01<<10)
#define    KEY_PRESSED_OFFSET_Z        ((uint16_t)0x01<<11)
#define    KEY_PRESSED_OFFSET_X        ((uint16_t)0x01<<12)
#define    KEY_PRESSED_OFFSET_C        ((uint16_t)0x01<<13)
#define    KEY_PRESSED_OFFSET_V        ((uint16_t)0x01<<14)
#define    KEY_PRESSED_OFFSET_B        ((uint16_t)0x01<<15)typedef struct
{struct{ short ch0;short ch1;short ch2;short ch3;char s1;char s2;short wheel;}rc;struct {short x;short y;short z;char press_l;char press_r;}mouse;struct{uint16_t v;}key;uint32_t misstimeout;struct{bool CTRL;bool F;bool X;bool C;bool Q;bool E;}flag;//标志位,用来切换模式,保证按键瞬间只进入函数一次}RC_Ctl_t;/* 获取遥控器摇杆偏移量根据遥控器文档:左摇杆:    右摇杆:
左右为ch2   左右为ch0
上下为ch3   上下为ch1上   660
左    中       右
-660   0      660       中   0下  -660  *//* 获取遥控器摇杆偏移值RLR:右摇杆左右移动  LUD:左摇杆上下移动	*/
#define    RC_CH0_RLR_OFFSET    (RC_Ctl.rc.ch0 - RC_CH_VALUE_OFFSET)
#define    RC_CH1_RUD_OFFSET  	(RC_Ctl.rc.ch1 - RC_CH_VALUE_OFFSET)
#define    RC_CH2_LLR_OFFSET  	(RC_Ctl.rc.ch2 - RC_CH_VALUE_OFFSET)
#define    RC_CH3_LUD_OFFSET  	(RC_Ctl.rc.ch3 - RC_CH_VALUE_OFFSET)/* 检测遥控器开关状态 */
#define    IF_RC_SW1_UP      (RC_Ctl.rc.sw1 == RC_SW_UP)
#define    IF_RC_SW1_MID     (RC_Ctl.rc.sw1 == RC_SW_MID)
#define    IF_RC_SW1_DOWN    (RC_Ctl.rc.sw1 == RC_SW_DOWN)
#define    IF_RC_SW2_UP      (RC_Ctl.rc.sw2 == RC_SW_UP)
#define    IF_RC_SW2_MID     (RC_Ctl.rc.sw2 == RC_SW_MID)
#define    IF_RC_SW2_DOWN    (RC_Ctl.rc.sw2 == RC_SW_DOWN)/* 获取鼠标三轴的移动速度 */
#define    MOUSE_X_MOVE_SPEED    (RC_Ctl.mouse.x)
#define    MOUSE_Y_MOVE_SPEED    (RC_Ctl.mouse.y)
#define    MOUSE_Z_MOVE_SPEED    (RC_Ctl.mouse.z)/* 检测鼠标按键状态按下为1,没按下为0*/
#define    IF_MOUSE_PRESSED_LEFT    (RC_Ctl.mouse.press_l == 1)
#define    IF_MOUSE_PRESSED_RIGH    (RC_Ctl.mouse.press_r == 1)/* 检测键盘按键状态若对应按键被按下,则逻辑表达式的值为1,否则为0 */
#define    IF_KEY_PRESSED         (  RC_Ctl.key.v  )
#define    IF_KEY_PRESSED_W       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_W)    != 0 )
#define    IF_KEY_PRESSED_S       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_S)    != 0 )
#define    IF_KEY_PRESSED_A       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_A)    != 0 )
#define    IF_KEY_PRESSED_D       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_D)    != 0 )
#define    IF_KEY_PRESSED_Q       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_Q)    != 0 )
#define    IF_KEY_PRESSED_E       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_E)    != 0 )
#define    IF_KEY_PRESSED_G       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_G)    != 0 )
#define    IF_KEY_PRESSED_X       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_X)    != 0 )
#define    IF_KEY_PRESSED_Z       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_Z)    != 0 )
#define    IF_KEY_PRESSED_C       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_C)    != 0 )
#define    IF_KEY_PRESSED_B       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_B)    != 0 )
#define    IF_KEY_PRESSED_V       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_V)    != 0 )
#define    IF_KEY_PRESSED_F       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_F)    != 0 )
#define    IF_KEY_PRESSED_R       ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_R)    != 0 )
#define    IF_KEY_PRESSED_CTRL    ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_CTRL) != 0 )
#define    IF_KEY_PRESSED_SHIFT   ( (RC_Ctl.key.v & KEY_PRESSED_OFFSET_SHIFT) != 0 )#define    IF_KEY_PRESSED_LAST         (  RC_Ctl.key.v_last  )
#define    IF_KEY_PRESSED_W_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_W)    != 0 )
#define    IF_KEY_PRESSED_S_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_S)    != 0 )
#define    IF_KEY_PRESSED_A_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_A)    != 0 )
#define    IF_KEY_PRESSED_D_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_D)    != 0 )
#define    IF_KEY_PRESSED_Q_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_Q)    != 0 )
#define    IF_KEY_PRESSED_E_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_E)    != 0 )
#define    IF_KEY_PRESSED_G_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_G)    != 0 )
#define    IF_KEY_PRESSED_X_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_X)    != 0 )
#define    IF_KEY_PRESSED_Z_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_Z)    != 0 )
#define    IF_KEY_PRESSED_C_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_C)    != 0 )
#define    IF_KEY_PRESSED_B_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_B)    != 0 )
#define    IF_KEY_PRESSED_V_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_V)    != 0 )
#define    IF_KEY_PRESSED_F_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_F)    != 0 )
#define    IF_KEY_PRESSED_R_LAST       ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_R)    != 0 )
#define    IF_KEY_PRESSED_CTRL_LAST    ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_CTRL) != 0 )
#define    IF_KEY_PRESSED_SHIFT_LAST   ( (RC_Ctl.key.v_last & KEY_PRESSED_OFFSET_SHIFT) != 0 )extern RC_Ctl_t RC_Ctl;
extern uint8_t dbus_connect;void dbus_read(void);
void DBUS_Init(void);#endif
dbus.c
#include "dbus.h"
#include "dma.h"
#include "usart.h"// 声明接收DBUS数据的变量
uint16_t dbus_receive;// 声明遥控器数据结构体
RC_Ctl_t RC_Ctl;// 声明遥控器缓存数组
uint8_t sbus_rx_buffer[18];//// 声明一个变量,用于表示DBUS连接状态
//uint8_t dbus_connect = 0;/*** @brief 初始化DBUS接收功能* @details 使用DMA方式接收18字节的SBUS数据*/
void DBUS_Init(void)
{HAL_UART_Receive_DMA(&huart3, sbus_rx_buffer, 18);
}// 定义DBUS使用的UART设备
#define DBUS_HUART       huart3 /* for dji remote controler reciever */// 定义DBUS最大接收长度
#define DBUS_MAX_LEN     (50)// 定义DBUS缓冲区长度
#define DBUS_BUFLEN      (18)/*** @brief 解析接收到的DBUS数据* @details 从sbus_rx_buffer中解析出各个通道和开关的状态*/
void dbus_read(void)
{RC_Ctl.rc.ch0 = (sbus_rx_buffer[0] | (sbus_rx_buffer[1] << 8)) & 0x07ff; RC_Ctl.rc.ch0 -= 1024;RC_Ctl.rc.ch1 = ((sbus_rx_buffer[1] >> 3) | (sbus_rx_buffer[2] << 5)) & 0x07ff; RC_Ctl.rc.ch1 -= 1024;RC_Ctl.rc.ch2 = ((sbus_rx_buffer[2] >> 6) | (sbus_rx_buffer[3] << 2) | (sbus_rx_buffer[4] << 10)) & 0x07ff;RC_Ctl.rc.ch2 -= 1024;RC_Ctl.rc.ch3 = ((sbus_rx_buffer[4] >> 1) | (sbus_rx_buffer[5] << 7)) & 0x07ff;RC_Ctl.rc.ch3 -= 1024;	// 摇杆防抖处理if (RC_Ctl.rc.ch0 <= 8 && RC_Ctl.rc.ch0 >= -8)RC_Ctl.rc.ch0 = 0;if (RC_Ctl.rc.ch1 <= 8 && RC_Ctl.rc.ch1 >= -8)RC_Ctl.rc.ch1 = 0;if (RC_Ctl.rc.ch2 <= 8 && RC_Ctl.rc.ch2 >= -8)RC_Ctl.rc.ch2 = 0;if (RC_Ctl.rc.ch3 <= 8 && RC_Ctl.rc.ch3 >= -8)RC_Ctl.rc.ch3 = 0;RC_Ctl.rc.s1  = ((sbus_rx_buffer[5] >> 4) & 0x000C) >> 2;                           RC_Ctl.rc.s2  = ((sbus_rx_buffer[5] >> 4) & 0x0003);    RC_Ctl.rc.wheel = (sbus_rx_buffer[16] | sbus_rx_buffer[17] << 8) - 1024;RC_Ctl.mouse.x = sbus_rx_buffer[6] | (sbus_rx_buffer[7] << 8);                    // 鼠标X轴RC_Ctl.mouse.y = sbus_rx_buffer[8] | (sbus_rx_buffer[9] << 8);                    // 鼠标Y轴RC_Ctl.mouse.z = sbus_rx_buffer[10] | (sbus_rx_buffer[11] << 8);                  // 鼠标Z轴if (RC_Ctl.mouse.x <= 1 && RC_Ctl.mouse.x >= -1)RC_Ctl.mouse.x = 0;if (RC_Ctl.mouse.y <= 1 && RC_Ctl.mouse.y >= -1)RC_Ctl.mouse.y = 0;	RC_Ctl.mouse.press_l = sbus_rx_buffer[12];                                        // 鼠标左键RC_Ctl.mouse.press_r = sbus_rx_buffer[13];                                        // 鼠标右键RC_Ctl.key.v = sbus_rx_buffer[14] | (sbus_rx_buffer[15] << 8);                    // 键盘值RC_Ctl.misstimeout = 0;  // 失联保护
}
stm32f4xx_it.c中的
void DMA1_Stream1_IRQHandler(void)
void DMA1_Stream1_IRQHandler(void)
{/* USER CODE BEGIN DMA1_Stream1_IRQn 0 */dbus_read();/* USER CODE END DMA1_Stream1_IRQn 0 */HAL_DMA_IRQHandler(&hdma_usart3_rx);/* USER CODE BEGIN DMA1_Stream1_IRQn 1 *//* USER CODE END DMA1_Stream1_IRQn 1 */
}
main.c添加DBUS_Init();

CAN

CUBEMX

使能can1
改GPIO
image
image

CAN的通信速率按照C620手册要求的1Mbps配置

71.42857142857143𝑛𝑠 ∗(10 +3+1) = 1000𝑛𝑠 = 1𝑢𝑠=1mbps
image

开启接收中断

image

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

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

相关文章

GPR模型的一些高斯原理介绍

一、几个概念区分:高斯的几个概念:高斯分布(Gaussian Distribution):高斯分布是统计学中最常见的概率分布之一,也称为正态分布。它具有钟形曲线的形状,由两个参数决定:均值(mean)和方差(variance)。 高斯分布在自然界和工程应用中经常出现,其形状由均值和方差决定…

20222411 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 1.1 实践内容 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,search一下就可以use) ②端口扫描:可以直接用nmap,也可以用Aux中的portscan/tcp等。 ③选做:也可以扫系统版本、漏洞等。 (2)Vsftpd源码包后门漏洞(21端口) 漏洞原理:在特定版本的vsftpd服务…

如何控制java虚拟线程的并发度?

jdk 21中的虚拟线程已经推出好一段时间了,确实很轻量,先来一段示例: 假如有一段提交订单的业务代码:1 public void submitOrder(Integer orderId) { 2 sleep(1000); 3 System.out.println("order:" + orderId + " is submitted");…

保险行业客户服务优化:客户运营知识库的实战应用

在保险行业,客户服务优化是提升客户满意度、增强企业竞争力的关键。客户运营知识库作为客户服务的重要支撑,其实战应用对于提升客户服务质量具有重要意义。本文将探讨保险行业客户服务优化的重要性、客户运营知识库的实战应用以及如何利用“HelpLook”工具实现客户服务优化。…

2024-11-18纯碱行情的解浪

图中蓝色线为调整浪ABC线 黄色线为5浪线 纯碱现在走的是ABC-C---->C-5---------5-4 总体来说是大级别的C浪,C浪的5浪,5浪的4浪回调,由于5浪的子2浪是都直的简单调整,5浪的一浪是启动三角形,趋势非常丝滑。这个5浪的子4浪会是大概率 的ABC调整,现在在走B浪还未完成,还…

2024-11-18 PVC分析

5182将是相当长时间的历史大底,这波不会破新低,以后N年也大概率不会破了。多头网格的好品种

ESP32蓝牙学习--蓝牙概念学习

前言 ESP32 是一款同时包含WIFI 蓝牙两者通信方式的芯片,之前学习过WIFI,这次学习一下其蓝牙功能,虽然之前有使用过其他的蓝牙芯片,但大多数都是使用应用层,很少去了解底层协议相关的知识,这一次从概念入手,细致了解一下蓝牙的相关概念,及ESP32相关的工程说明。 蓝牙的…

网络配置及进程-系统性能和计划任务

目录虚拟机联网 shell脚本实例 索引数组和关联数组,字符串处理,高级变量 进程管理 计划任务虚拟机联网 查看IP地址 #centos系列![root@localhost ~]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.93.200 netmask 255.255.255.…

2024-11-18 大盘分析

牛市已经开始 首先上证季线级别4浪已经完美完成 本次上涨预计最高点位突破11000点再看商品市场 季线级别的3浪已经走完了前4浪,3-5已经启动,3浪的5浪 5of3 与3of3同样的强.3浪的上涨空间是100多一些,5浪可能 会更长。

【Project 2024软件下载与安装教程-亲测好用】

‌Project 2024的操作系统要求是Windows 10及以上版本‌。这意味着用户需要在Windows 10或更高版本的操作系统上安装和使用Project 2024‌1。 Project 2024是由Microsoft开发的一款高效实用的项目管理工具,旨在帮助项目经理发展计划、为任务分配资源、跟踪进度、管理预算和分析…

20222420 2024-2025-1 《网络与系统攻防技术》实验六实验报告

20222420 2024-2025-1 《网络与系统攻防技术》实验六实验报告 1.实验内容 (1)前期渗透①主机发现(可用Aux中的arp_sweep,search一下就可以use) ②端口扫描:可以直接用nmap,也可以用Aux中的portscan/tcp等 ③选做:也可以扫系统版本、漏洞等。(2)Vsftpd源码包后门漏洞(…