记录一下关于MPC5744P CAN总线学习

2023-05-16

记录一下关于MPC5744P CAN总线学习

主要是针对开发出BUSOFF管理,NXP感觉都是一个套路,无论powerpc,还是arm_m

status_t FLEXCAN_DRV_Init(uint8_t instance,flexcan_state_t *state,const flexcan_user_config_t *data)

先从这个函数起

 if(FLEXCAN_IsEnabled(base))
    {
        /* To enter Disable Mode requires FreezMode first */
        FLEXCAN_EnterFreezeMode(base);
        FLEXCAN_Disable(base);
    }

首先是判断当前CAN是否ENABLE ,如果是ENABLE,比如你是从error_handle调用这个初始化函数,那么首先进入FLEXCAN_EnterFreezeMode(base);下面分析下这个函数

 base->MCR = (base->MCR & ~CAN_MCR_FRZ_MASK) | CAN_MCR_FRZ(1U);
 base->MCR = (base->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(1U);
 首先将MCR reg中的FRZ HALT bit 清除 然后置位 
 if (((base->MCR & CAN_MCR_MDIS_MASK) >> CAN_MCR_MDIS_SHIFT) == 0U)
	{
		enabled = true;
	}
else
	{
		base->MCR &= ~CAN_MCR_MDIS_MASK;
	}

如果enable==true,就不用开启和关闭时钟,如果enable==false,则先开启,后面又关闭时钟

/* Check Low-Power Mode Acknowledge Cleared */
while (((base->MCR & CAN_MCR_LPMACK_MASK) >> CAN_MCR_LPMACK_SHIFT) == 1U) {}//Freeze mode cannot be entered while FlexCAN is in a low power mode.

如果是从低功耗模式唤醒的话,就等待LPMACK清零,否则该位直接为0,跳过

if ((((base->ESR1 & CAN_ESR1_FLTCONF_MASK) >> CAN_ESR1_FLTCONF_SHIFT) & 2U) != 0U)//ESR1 reg Fault_Confinement_State(第26-27位),01代表主动错误状态,11代表busoff,这里只要处于这两种状态之一,就进入以下流程
    {
    	/* Save registers before Soft Reset */
    	uint32_t tempIMSK[2],tempMCR;
    	tempIMSK[0] = base->IMASK1;//保存MB 中断寄存器状态
    	tempIMSK[1] = base->IMASK2;
    	tempMCR = base->MCR;//将整个MCR保存
    	/* Soft Reset FlexCan */
    	base->MCR |= CAN_MCR_SOFTRST(1U);//软重启一次
    	while (((base->MCR & CAN_MCR_SOFTRST_MASK) >> CAN_MCR_SOFTRST_SHIFT) != 0U) {}//等待软重启完毕
    	/* Restore registers after Soft Reset */
    	base->IMASK1 = tempIMSK[0];
    	base->IMASK2 = tempIMSK[1];
    	base->MCR = tempMCR;
    	}
    	else
	    {
	    	base->MCR = (base->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(1U);//不知道为啥再次置位,注意这句 No reception or transmission is performed by FlexCAN before
this bit is cleared.
	    }
    while (((base->MCR & CAN_MCR_FRZACK_MASK) >> CAN_MCR_FRZACK_SHIFT) == 0U) {}//轮询该位等待确切进入frz mode
    if (false == enabled)
    {
    	base->MCR |= CAN_MCR_MDIS_MASK;
    	/* Wait until disable mode acknowledged */
        while (((base->MCR & CAN_MCR_LPMACK_MASK) >> CAN_MCR_LPMACK_SHIFT) == 0U) {}
    }

然后调用void FLEXCAN_Disable(CAN_Type * base)。关闭时钟。。。。
感觉和闹着玩一样,总之BUSOFF是从err_handle 进入的,肯定是FLEXCAN_IsEnabled(base)==true
下面梳理一下这个流程,感觉只要在err_handle中调用FLEXCAN_DRV_Init,然后在这个基础上修改,比如增加定时器,增加恢复次数计数,就可以进行BUSOFF快慢恢了。

中间一些设置波特率,运行模式之类的就不说了,无非就是一会开一会关反复横跳,说一下调用到FLEXCAN_Init 函数,这个函数里面会清除所有err_flag

/* Clear all error interrupt flags */
    (base->ESR1) = FLEXCAN_ALL_INT;

好了,不接着上面分析了,这两天简单搞了下BUSOFF机制,直接上代码

void Xcp_Can_Init(void)
{
	FLEXCAN_DRV_Init(INST_CANCOM1, &canCom1_State, &canCom1_InitConfig0);
	for(uint8_t i=0;i<16;i++)
	{
		XcpCan_Fliter_Config[i].isRemoteFrame=false;
		XcpCan_Fliter_Config[i].isExtendedFrame=false;
		XcpCan_Fliter_Config[i].id=XcpCan_Fliter_Table[i];
	}
	FLEXCAN_DRV_ConfigRxFifo(INST_CANCOM1,FLEXCAN_RX_FIFO_ID_FORMAT_A,XcpCan_Fliter_Config);
	CAN_2->CTRL1 |=CAN_CTRL1_BOFFREC_MASK;
	FLEXCAN_DRV_SetRxMaskType(INST_CANCOM1,FLEXCAN_RX_MASK_INDIVIDUAL);
	FLEXCAN_DRV_InstallEventCallback(INST_CANCOM1,XcpRxCallback,NULL);
	FLEXCAN_DRV_InstallErrorCallback(INST_CANCOM1, Xcp_err_callback, NULL);
	FLEXCAN_DRV_RxFifo(INST_CANCOM1,&XcpCan_RxFrame);
}

初始化CAN的时候要注册FLEXCAN_DRV_InstallErrorCallback(INST_CANCOM1, Xcp_err_callback, NULL);SDK里面ERR_INT,RXWARN,TXWARN,BUSOFF中断都是默认打开的,这里如果要使用这些中断,就要注册回调函数,所有这些中断的回调函数都是同一个函数,即FLEXCAN_DRV_InstallErrorCallback注册的函数,函数名由你自己定义,反正函数名不就是个地址嘛。这里推荐一下程序小拜的blog,里面也有讲解

void Xcp_err_callback(uint8_t instance, flexcan_event_type_t eventType,flexcan_state_t *flexcanState)
{
	uint32_t err_count=(uint32_t)(CAN_2->ECR);
	uint32_t rx_err_count=((err_count&0xffffffff00)>>8)&0xff;

	if(rx_err_count>=120)
	{
		rx_err_times++;
		if(pit_ch0_count >= 60)
		{
			can_bus_breakdown=1;
			PIT_DRV_StopChannel(INST_PIT1,0);
		}
		else
		{
			if(((PIT_0->TIMER[0].TCTRL)&0x1)==0)
			{
				PIT_DRV_StartChannel(INST_PIT1,0);
			}
		}
	}

	if(((FLEXCAN_DRV_GetErrorStatus(INST_CANCOM1)&CAN_ESR1_FLTCONF_MASK)>>4)==0x3)
	{
		busoff_count++;
		if(fast_recovery_times <5)
		{
			if(((PIT_0->TIMER[1].TCTRL)&0x1)==0)
			{
			  pit1_ChnConfig1.period=(uint32_t)fast_recovery_delay;
				PIT_DRV_InitChannel(INST_PIT1, &pit1_ChnConfig1);
				INT_SYS_SetPriority(PIT_Ch1_IRQn, 1U);
				PIT_DRV_StartChannel(INST_PIT1,1);
				fast_recovery_times++;
			}
		}
		else
		{
			PIT_DRV_StopChannel(INST_PIT1,1);
			pit1_ChnConfig1.period=(uint32_t)slow_recovery_delay;
			PIT_DRV_InitChannel(INST_PIT1, &pit1_ChnConfig1);
			INT_SYS_SetPriority(PIT_Ch1_IRQn, 1U);
			PIT_DRV_StartChannel(INST_PIT1,1);
			slow_recovery_times++;
		}
	}
};
  • 在err_callback里面if(((FLEXCAN_DRV_GetErrorStatus(INST_CANCOM1)&CAN_ESR1_FLTCONF_MASK)>>4)==0x3)代表ESR1寄存器FLTCONF位为0b11,表示从CAN控制器从Active_ERR状态转换为了BUSOFF状态,当然你也可以屏蔽ERR_INT,RXWARN,TXWARN这些中断,这样就只有当BUSOFF发生时才进入中断处理函数,进而进入回调函数,进入BUSOFF的原因只能是tx_err_cnt>255,也就是发送错误计数超过255,而rx_err_count最大只能增加到127,到127时使CAN控制器从Pasive_ERR进入Active_ERR,但绝不会再增加使其进入BUSOFF,这个时候就算你吧CAN_RX拔了,只要再插上,然后CAN控制器接收到一帧数据,tx_err_count就会清零,控制器又恢复到正常状态(Pasive_ERR)。

  • 只要FLTCONF位为0b11,CAN控制器就不能收发了,相当于死机了,然后这个时候你就要关闭CAN,重新初始化,FLTCONF位直接赋值是不能清除的,即SDK中的

 /* Clear all error interrupt flags */
    (base->ESR1) = FLEXCAN_ALL_INT;
  • 清除该位后CAN控制器才能从新恢复功能,然后去和总线同步,恢复通信,清除的办法就是
 * Reset the FLEXCAN */
    base->MCR = (base->MCR & ~CAN_MCR_SOFTRST_MASK) | CAN_MCR_SOFTRST(1U);
  • 让CAN控制器软重启,为了不出错,所以就直接从新走一遍初始化流程,在void Xcp_Can_Init(void)中的FLEXCAN_DRV_Init这个函数中如果判断if(FLEXCAN_IsEnabled(base))(表示当前是从CAN控制器使能状态),就会有以下操作
if ((((base->ESR1 & CAN_ESR1_FLTCONF_MASK) >> CAN_ESR1_FLTCONF_SHIFT) & 2U) != 0U)
    {
    	/* Save registers before Soft Reset */
    	uint32_t tempIMSK[2],tempMCR;
    	tempIMSK[0] = base->IMASK1;
    	tempIMSK[1] = base->IMASK2;
    	tempMCR = base->MCR;
    	/* Soft Reset FlexCan */
    	base->MCR |= CAN_MCR_SOFTRST(1U);
    	while (((base->MCR & CAN_MCR_SOFTRST_MASK) >> CAN_MCR_SOFTRST_SHIFT) != 0U) {}
    	/* Restore registers after Soft Reset */
    	base->IMASK1 = tempIMSK[0];
    	base->IMASK2 = tempIMSK[1];
    	base->MCR = tempMCR;
#if FEATURE_CAN_HAS_MEM_ERR_DET
    /* Disable the Protection again because is enabled by soft reset */
    FLEXCAN_DisableMemErrorDetection(base);
#endif
    }
  • 保存寄存器,软重启,也就清除了BUSOFF,CAN逐渐恢复正常。其实SDK中已经考虑得比较全面了,我们只要确定好调用时机就好,要做到快慢恢复,我们需要增加一个定时器,这里得定时器就用MPC5744P得PIT
    CH1。
#define fast_recovery_delay 100000
#define slow_recovery_delay 1000000
uint8_t fast_recovery_times=0;
uint8_t slow_recovery_times=0;
  • 定义快慢恢复时间和记录快慢恢复次数,当
if(fast_recovery_times <5)
		{
			if(((PIT_0->TIMER[1].TCTRL)&0x1)==0)
			{
			  pit1_ChnConfig1.period=(uint32_t)fast_recovery_delay;
				PIT_DRV_InitChannel(INST_PIT1, &pit1_ChnConfig1);
				INT_SYS_SetPriority(PIT_Ch1_IRQn, 1U);
				PIT_DRV_StartChannel(INST_PIT1,1);
				fast_recovery_times++;
			}
		}
		else
		{
			PIT_DRV_StopChannel(INST_PIT1,1);
			pit1_ChnConfig1.period=(uint32_t)slow_recovery_delay;
			PIT_DRV_InitChannel(INST_PIT1, &pit1_ChnConfig1);
			INT_SYS_SetPriority(PIT_Ch1_IRQn, 1U);
			PIT_DRV_StartChannel(INST_PIT1,1);
			slow_recovery_times++;
		}
  • 快恢复次数大于5就进入慢恢复,而恢复是在PIT得中断处理函数中进行的(计时时间到),相当于增加了一个延迟。
void PIT_Ch1_IRQHandler (void)
{
	pit_ch1_count++;
	PIT_DRV_StopChannel(INST_PIT1,1);
	PIT_DRV_DisableChannelInterrupt(INST_PIT1,1);
	Xcp_Can_Init();
  PIT_DRV_ClearStatusFlags(INST_PIT1, 1U);
}
  • 直接调用Xcp_Can_Init就好,记得在中断处理函数中停掉PIT,不然会一直中断,也就一直调用CAN初始化,而再次开启PIT取决于下次进入BUSOFF的时机(如果前一个BUSOFF没有被处理,即FLTCONF没有被清除,这个时候就算短接CAN_H,CAN_L也不会再次进入err_callback,相当于CAN死机了,在你下一次重启电脑之前,你对他继续破坏他也不会做出反应)
  • 当PIT中断调用Xcp_Can_Init,CAN控制器重启后,只要同步完成(自动的,128连续11个隐性位),并成功发出去一帧数据后,说明BUSOFF恢复成功,故障清除,否则就会再次进入BUSOFF(你可以拔掉CAN_TX试试),又进入快慢恢复流程。
  • 发出去数据后,只要使fast_recovery_times=0;就可以重设快慢恢复节奏,具体如下
void XcpRxCallback(uint8_t instance, flexcan_event_type_t eventType,uint32_t buffIdx, flexcan_state_t *flexcanState)
{
	switch(eventType)
  {
    case FLEXCAN_EVENT_TX_COMPLETE:
    	  can_tx_count++;
    	  fast_recovery_times=0;
        FLEXCAN_DRV_RxFifo(instance,&XcpCan_RxFrame);
        break;
    case FLEXCAN_EVENT_RXFIFO_COMPLETE:
    	  can_rx_count++;
    	  if((XcpCan_RxFrame.msgId == Xcp_RXID) && (XcpCan_RxFrame.data[0]==0XF4))
				{
    	  	if(((PIT_0->TIMER[0].TCTRL)&0x1)!=0)
					{
						PIT_DRV_StopChannel(INST_PIT1,0);
						PIT_DRV_InitChannel(INST_PIT1, &pit1_ChnConfig0);
					}
				}
        FLEXCAN_DRV_RxFifo(instance,&XcpCan_RxFrame);
        break;
    default:
        break;
  }
};

这个函数是由FLEXCAN_DRV_InstallEventCallback(INST_CANCOM1,XcpRxCallback,NULL);注册的,就是CAN的发送和接收完成中断回调,在这个函数里判断event,就可以处理CAN消息。
就写这么多,如有不足,忘大神指教。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记录一下关于MPC5744P CAN总线学习 的相关文章

  • 自动驾驶之——CAN总线简介

    自动驾驶技术之 无人驾驶中的CAN总线 CAN 是Controller AreaNetwork 的缩写 xff0c 中文名为控制器局域网络 xff0c 是ISO国际标准化的串行通信协议 xff0c 是一种用于实时应用的串行通讯协议总线 xf
  • RS232/RS485/CAN_BUS 通信原理总结与通信波形分析

    分析一 xff1a 232串口信号 要点 xff1a RS232 xff0c 全双工 xff0c 采用三线制传输分别为TXD RXD GND xff0c 其中TXD为发送信号 xff0c RXD为接收信号 在RS232中任何一条信号线的电压
  • CAN通信讲解(2)——数据帧和遥控帧

    本文注意参考了 CAN入门书 xff0c 源于此书图片不再特殊标注 目录 2 1 帧的种类2 2 数据帧和遥控帧2 3 仲裁过程2 4 各段详解2 5 小结 数据帧和遥控帧格式类似 xff0c 放在一起串讲 2 1 帧的种类 CAN协议帧分
  • CAN报文解析—案例

    1 CAN报文定义 CAN报文是指发送单元向接受单元传送数据的帧 我们通常所说的CAN报文是指在CAN线 xff08 内部CAN 整车CAN 充电CAN xff09 上利用ECU和CAN卡接收到的十六进制报文 2 CAN协议中CAN报文种类
  • CAN报文格式简析

    Date xff1a 2022 5 11 Author xff1a MJQ Meta xff1a CAN CAN基础篇 CAN报文格式简析 1 Motornala和Intel格式 建议直接看图 xff0c 小白也能秒懂 xff01 注 xf
  • c#通过串口及CAN模块实现上位及下位机通讯

    目录 前言 一 串口 CAN总线 二 使用步骤 1 RS232串口通讯 xff08 指令下发与接收 xff09 2 CAN总线通讯 总结 前言 学习及工作中我们经常会遇到上位机与下位机通讯等工作 xff0c 结合场景使用不同的通讯方式实时通
  • CAN总线通信协议详讲

    CAN简介 CAN是Controller Area Network 的缩写 xff08 以下称为CAN xff09 xff0c 是ISO国际标准化的串行通信协议 由德国电气商博世公司在1986 年率先提出 此后 xff0c CAN 通过IS
  • 基于NRF24L01的CAN数据透传

    闲谈 xff1a 闲来无聊 xff0c 恰好公司又经常用CAN数据的传输 xff0c 自己觉得要是用无线传送多好 xff0c 然后 xff0c 就是一个奇想 xff0c 就想做一个无线数据的透传 xff0c 恰好身边又有NRF24L01 那
  • 使用STM32F103做CAN的收发通信

    下面也是搭建嵌入式系统所必须的一个部分 参考网站 xff1a https www cnblogs com craigtao p 3645148 html https blog csdn net qq 29413829 article det
  • linux的socket CAN驱动介绍

    https blog csdn net linyangspring article details 27186911 在linux中 xff0c CAN总线的驱动有两种实现方式 xff1a 字符设备以及socket can驱动 Socket
  • Linux下配置虚拟CAN

    1 加载vcan模块 sudo modprobe vcan 2 添加vcan0网卡 sudo ip link add dev vcan0 type vcan 3 查看当前CAN网络 ifconfig a 4 开启vcan0 sudo ip
  • QT5使用PCAN读取CAN数据

    文章目录 QT5使用PCAN读取CAN数据 CAN Bus example 重点讲解 pro文件 创建CAN bus Device 参数设置 接收报文 PCAN支持的QCanBusDevice ConfigurationKey类型 QT5使
  • CAN学习笔记3:STM32 CAN控制器介绍

    STM32 CAN控制器 1 概述 STM32 CAN控制器 bxCAN 支持CAN 2 0A 和 CAN 2 0B Active版本协议 CAN 2 0A 只能处理标准数据帧且扩展帧的内容会识别错误 而CAN 2 0B Active 可以
  • Ubuntu系统周立功CAN驱动安装及常见问题

    文章目录 前言 一 步骤 1 检查是否安装libusb的库 2 驱动安装 3 测试 部分常见问题 前言 系统是ubuntu16系列 周立功的是usbcan 提示 以下是本篇文章正文内容 下面案例可供参考 一 步骤 1 检查是否安装libus
  • CAN总线的EMC设计方案

    一 CAN接口EMC设计概述 Controller Area Network简称为CAN 多用于汽车以及工业控制 用于数据的传输控制 在应用的过程中通讯电缆容易耦合外部的干扰对信号传输造成一定的影响 单板内部的干扰也可能通过电缆形成对外辐射
  • CAN 为什么需要收发器

    在RTL代码中集成了两个CAN node 打算直接连接将两个node的Rx和Tx对接 发现两个CAN Node无法通信 询问技术支持后才知道必须要收发器 那为什么一定需要收发器呢 除了转换单端的CAN信号用于不同的传输 收发器也会将CANT
  • STM32 CAN通信的学习笔记总结(从小白开始)

    知识来源于互联网 回馈于互联网 目录 1 总体概述 1 1 基本概念 1 2 通讯方式 1 3 为什么使用CAN 1 4 CAN的协议及组成 2 上帝视角看CAN的通讯过程 2 1 数据传输原理实现 2 2 通信的整个过程 2 2 1 空闲
  • CAN协议详解-01

    CAN 是控制器局域网络 Controller Area Network 的简称 它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的 并最终成为国际标准 ISO11519以及ISO11898 是国际上应用最广泛的现场总线之一 差
  • pico示波器使用

    文章目录 Pico示波器保存波形 Pico示波器录制数据 Pico示波器解析CAN报文 Pico示波器保存波形 Pico示波器可以通过以下步骤保存波形 在示波器上选择要保存的波形 连接示波器到计算机上 可以使用USB或者Ethernet连接
  • 功放诊断测试

    1 切换trace显示时间模式 Toggle time mode 2 测seedkey 需要加载seednkey dll 3 功能寻址和物理寻址切换

随机推荐

  • STM32 FreeRTOS 队列 及 xQueueGenericSend使用

    1 xff0c 队列中比较重要的结构体 xff1a xQUEUE xff08 Queue t xff09 2 xff0c 入队相关API xff1a xQueueSendToFront xQueueSendToBack xQueueSend
  • 移植FreeRTOS到 Xilinx ZYNQ Microblaze IP核

    1 xff0c 运行环境vivado2019 2 xff0c win10 ZYNQ 7000系列 2 xff0c FreeRTOS官网源码下载 https www freertos org 3 xff0c FreeRTOS 是一个迷你的实时
  • linux下网络设备驱动开发

    一 xff0c 网络OSI参考模型分为 从上到下 应 xff0c 表 xff0c 会 xff0c 传 xff0c 网 xff0c 数链 xff0c 物 物理层 gt 数据链路层 gt 网络层 gt 传输层 gt 会话层 gt 表示层 gt
  • freeRTOS系统静态与动态建立任务

    一 xff0c 静态建立任务 1 xff0c 定义任务函数 xff08 一个无限循环且不带返回值的函数 xff09 任务必须是死循环 xff0c 否则任务将经过 LR 返回 xff0c 如果 LR 指向了非法内存就会产生HardFault
  • Ubuntu18.04安装Ceres1.14

    Ubuntu18 04安装Ceres1 14 1 下载Ceres2 安装依赖项3 编译4 安装 1 下载Ceres 链接Github下载地址 2 安装依赖项 sudo apt get install liblapack dev libsui
  • SSH登录出现REMOTE HOST IDENTIFICATION HAS CHANGED故障的解决办法

    今天登录一台交换机 xff0c 出现如图错误 xff1a 原因 该IP分配给过另一台交换机 xff0c 在knows hosts文件中保留了当时的rsa信息 xff0c 将这个IP有分配给新设备 xff0c SSH登录时会提示RSA key
  • 外贸函电常用词汇

    外贸函电常用词汇 xff1a xff08 1 xff09 贵函 Your letter Your favour your esteemed letter Your esteemed favour Your valued letter You
  • 匿名拓空者Pro开源飞控使用介绍-1-飞控特点

    匿名团队 是一个爱好技术 xff0c 爱好创新的团队 做自己 xff0c 发现兴趣 xff0c 追随兴趣 xff0c 分享兴趣 非常欢迎大家关注我们匿名 xff0c 交流群 xff1a 190169595 匿名拓空者Pro 飞控 xff0c
  • 匿名拓空者Pro开源飞控使用介绍-2-硬件配置及拓展接口

    硬件配置 主控 STM32F407 xff1a 1M FLASH xff0c 192K RAM xff0c 运行频率168MHz xff1b 惯性传感器 icm20602 xff1a 3轴陀螺 43 3轴加速度 43 恒温设计 xff08
  • 匿名拓空者Pro开源飞控使用介绍-3-连接上位机及基本测试

    飞控连接上位机方法 飞控可以通过底板上的USB端口连接上位机 xff0c 使用USB线连接飞控和电脑 xff0c 飞控买家版程序会将USB端口初始化成HID设备 xff0c 免安装驱动程序 xff0c 只要打开匿名上位机 xff0c 打开程
  • 匿名拓空者Pro开源飞控使用介绍-4-飞控安装及坐标系定义

    飞控安装 将机架组装好 xff0c 电机安装于机架上 xff0c 飞控安装于机架重心位置 xff08 一般为机架中心板中心位置 xff0c 也就是两条电机对角线交点 注意 xff0c 飞控尽量水平安装于机架上 xff0c 飞行效果最好 xf
  • 匿名拓空者Pro开源飞控使用介绍-5-接收机连接

    确定使用何种接收机连接方式 匿名拓空者PRO飞控支持SBUS PPM PWM型接收机 xff0c 根据推荐程度依次为SBUS gt PPM gt PWM SBUS PPM均可以实现1根信号线传输多通道遥控数据的功能 xff0c SBUS为串
  • 匿名科创--匿名拓空者PRO—TI版全开源飞控使用入门—TM4C123

    1 飞控介绍 匿名团队针对TI芯片的强烈学习需求 xff0c 推出了匿名拓空者PRO飞控的TI版 使用TI公司的 TM4C123G 主控芯片 xff0c 打造了一款完全开源的飞控产品 xff0c 提供完全开源的飞控整体工程文件 xff0c
  • 匿名科创--ANO_OPENMV视觉开发板介绍

    1 ANO OPENMV介绍 官方OPENMV体积大 xff1f 在飞行器上不方便安装 xff1f 串口通过杜邦线容易接触不良 xff1f 不可否认 xff0c OPENMV为大家提供了一个非常方便 易用的视觉开发环境 xff0c 但是在实
  • 匿名科创--匿名拓空者PRO--开源光流融合算法使用教程

    1 总体介绍 为了更好的支持匿名TI飞控买家 xff0c 匿名团队开源了基于优象光流模块的飞控算法 xff0c 光流传感器直接连接至匿名拓空者PRO TI版飞控 xff0c 由飞控读取原始光流传感器的光流数据 xff0c 结合高度传感器以及
  • Linux 设备驱动开发实例

    编译和运行 驱动编译要用到kernel的Makefile文件 也就是源码树的编译系统 因此 xff0c 源码需要被配置和编译 xff0c 以ubuntu自带的源码为例 xff1a 编译外部模块 ko 的编译命令是 xff1a make C
  • 匿名科创-匿名光流V3版对天安装介绍

    安装介绍 光流模块对天安装时 xff0c 方向参考上图 注意 xff0c 只有光流模块对上安装 xff0c 激光或超声波测距模块仍然对地安装 配置介绍 如需使用对天模式 xff0c 硬件安装好后 xff0c USB线连接光流模块至上位机 x
  • 从 C51+uCos-II 近距离了解操作系统任务切换原理

    前言 从 C51 43 uCos II 简单介绍下任务切换的原理 方便大家更形象的理解多任务怎么切换 为后续写 x86 43 Linux 任务切换做铺垫练手吧 参考资料如下 xff1a uCos II 源码 单片机原理与应用及 C51 编程
  • Keil+Simulink生成Xcp标定协议A2L文件

    Keil 43 Simulink生成Xcp标定协议A2L文件 由于最近要为ECU移植XCP协议 xff0c 所以记录一下 xff0c 我使用的MCU为NXP S32K144 IDE选用MDK 官方IDE S32DS无代码联想功能 xff0c
  • 记录一下关于MPC5744P CAN总线学习

    记录一下关于MPC5744P CAN总线学习 主要是针对开发出BUSOFF管理 xff0c NXP感觉都是一个套路 xff0c 无论powerpc xff0c 还是arm m status t span class token functi