fmql之CAN调试

刚刚把zynq的CAN调成功。那么现在就要把程序移植到fmql了。

老规矩,Procise导入vivado的.bd和.xci文件。

Procise下create block也可以,但是不能自动约束引脚,只能手动写代码。

PeripheralTest

CanExample中用到了CAN0和CAN1:回环模式下,CAN0发送,CAN1接收。

但是开发板上只有一个CAN,因此注释CAN1的内容,添加CAN0接收中断。实现接收报文后发送报文。

以下为代码:

u8 main()
{u8 Status=FMSH_SUCCESS;int i = 0;TRACE_OUT(DEBUG_OUT, " FMQL Peripheral Test Version: 20211210 \r\n");Status=ps_init();if(Status!=PS_INIT_SUCCESS){TRACE_OUT(DEBUG_OUT, " PS Initial Failed!\r\n");return Status;}#if PSOC_CACHE_ENABLEdcache_enable();
#endifStatus =  FGicPs_SelfTest(&IntcInstance);if(Status!=GIC_SUCCESS)TRACE_OUT(DEBUG_OUT, " GIC Setup Failed!\r\n");elseTRACE_OUT(DEBUG_OUT, " GIC Setup pass!\r\n");#if defined(CANPS_0_DEVICE_ID) Status = FCanPs_example();if(Status == 0)TRACE_OUT(DEBUG_OUT,"CAN example test pass!\n");elseTRACE_OUT(DEBUG_OUT,"CAN example test failed,please check!\n");
#endif
}  
u8 FCanPs_example(void)
{u32 i;u8 ret=FMSH_SUCCESS;u32 tr_val[11];u8 buf_send[8];u8 buf_recv[8];u32 timeout_cnt = CAN_LOOP_TIMEOUT;//  FSlcrPS_setCanLoop(1);for(i = 0; i < 8; i++)buf_send[i] = 0x11 + i;    //发送dataFCanPs_Config* Config=NULL;Config= FCanPs_LookupConfig(FPAR_CANPS_0_DEVICE_ID);if(Config==NULL)return FMSH_FAILURE;ret=FCanPs_init(&g_CAN0, Config);if(ret!=FMSH_SUCCESS)return FMSH_FAILURE;CAN0 发送  FCanPs_setBaudRate(&g_CAN0, CAN_BUAD_1MHZ);FCanPs_setStdSingleACR(&g_CAN0, CAN_0_ID, data_frame, 0x00, 0x00);FCanPs_setAMR(&g_CAN0, 0xff, 0xff, 0xff, 0xff);   g_can_recv_intr_flag = 0;FCanPs_standardFrameTransmit(&g_CAN0, CAN_0_ID, buf_send, 8, data_frame);FCanPs_transmissionRequest(&g_CAN0);          发送while(FCanPs_getTransmissionCompleteStatus(&g_CAN0) == 0){delay_1us();timeout_cnt--;if(timeout_cnt == 0)return FMSH_FAILURE;}Delay_us_for(1000);
///  CAN0 接收  while(1){ can_setHanlder(&g_CAN0, CAN0_INT_ID, (FMSH_InterruptHandler)CAN0_interrupt_hanlder);FCanPs_setReceiveInterrupt(&g_CAN0, CAN_set);if(g_can_recv_intr_flag == 1)//接收到{g_can_recv_intr_flag = 0;for(i = 0; i < 11; i++){ buf_recv[i] = g_can0rbuf[i+3];  }   //CAN0 发送接收到的数据发送的ID         接收的数据0x100        (0x)08, 20, 00, data0x5             08, 00, A0, data0x6             08, 00, C0, data0x88            08, 11, 00, data
//推测:08是报头
//     第2和第3个数据是ID(ID << 5)FCanPs_standardFrameTransmit(&g_CAN0, CAN_0_ID, buf_recv, 8, data_frame);FCanPs_transmissionRequest(&g_CAN0);发送Delay_us_for(1000);}elseTRACE_OUT(DEBUG_OUT,"CAN_receive failed\r\n");    //等待接收//return FMSH_FAILURE;}  return FMSH_SUCCESS;
}

移植程序

Launch IAR后,导入相应的头文件。

注释xparameters.h中的  #include xparameters_ps.h  ,用 #include "fmsh_ps_parameters.h" 代替;

修改xcanps_hw.h:注释  #include "xil_io.h"  ,用  #include "fmsh_common_io.h"  代替;

修改xcanps_hw.h:

宏定义

报错:(没有如下宏定义

#define CAN_DEVICE_ID		XPAR_XCANPS_0_DEVICE_ID
#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID
#define CAN_INTR_VEC_ID		XPAR_XCANPS_0_INTR

 fmql只有:

#define SGI_ID          0U    /*   fmsh_gic_selftest.c */
#define CPU_ID          1U

所以SCU GIC是什么?(之后再学习)

但是推测 SGI_ID等价于INTC_DEVICE_ID   ,CAN0_INT_ID等价于CAN_INTR_VEC_ID。

 修改xil_printf

#define xil_printf fmsh_print

gic

 GIC的头文件定义冲突了(但是gic.h的内容大致相同

gic.h基本相同;gic.c大致相同(个别地方不一样)

fmq多了:

#define FMSH_CPU_ID = 0U;  //定义默认的CPU ID号/*****    以下函数zynq没有    *******/s32 FGicPs_registerInt(FGicPs *InstancePtr, u32 Int_Id,FMSH_InterruptHandler Handler, void *CallBackRef)
{s32 Status;	Status = FGicPs_Connect(InstancePtr, Int_Id, Handler, CallBackRef);if (Status != GIC_SUCCESS){return Status;}FGicPs_Enable(InstancePtr, Int_Id);return GIC_SUCCESS;
}/******Interrupt Setup********/
u32  FGicPs_SetupInterruptSystem(FGicPs *InstancePtr)
{u32 RegValue1 = 0U;u32 Index;u32 Status;static FGicPs_Config* GicConfig; GicConfig = FGicPs_LookupConfig(GIC_DEVICE_ID);if (NULL == GicConfig) {return GIC_FAILURE;}InstancePtr->Config = GicConfig;/** Read the ID registers.*/for(Index=0U; Index<=3U; Index++) {RegValue1 |= FGicPs_DistReadReg(InstancePtr,((u32)FGicPs_PCELLID_OFFSET + (Index * 4U))) << (Index * 8U);}if(FGicPs_PCELL_ID != RegValue1){return GIC_FAILURE;} /*FGicPs_DistWriteReg(InstancePtr,FGicPs_INT_CFG_OFFSET_CALC(32U),0U);*/{//int Status;Status = FGicPs_CfgInitialize(InstancePtr, GicConfig,GicConfig->CpuBaseAddress);if (Status != GIC_SUCCESS) {return GIC_FAILURE;}}//FMSH_ExceptionEnable();  return Status;
}
/******Enable interrupt  Group********/
void   FGicPs_EnableSelGroup(FGicPs *InstancePtr)
{FGicPs_DistWriteReg(InstancePtr, FGicPs_DIST_EN_OFFSET,0x03);     FGicPs_CPUWriteReg(InstancePtr, FGicPs_CONTROL_OFFSET, 0x1FU);    }
/******Set interrupt  Group********/
void FGicPs_SetGroup(FGicPs *InstancePtr, u32 Int_Id, u8 groupNo)
{u32 RegValue;RegValue = FGicPs_DistReadReg(InstancePtr,FGicPs_SECURITY_OFFSET_CALC(Int_Id));/** Enable the selected interrupt source by setting the* corresponding bit in the Enable Set register.*/RegValue &= ~(0x00000001 << (Int_Id%32U));RegValue |= ((u32)groupNo <<(Int_Id%32U));FGicPs_DistWriteReg(InstancePtr,(u32)FGicPs_SECURITY_OFFSET + ((Int_Id / 32U) * 4U), RegValue);
}u32 FMSH_In32(u32 Addr)
{return *(volatile u32 *) Addr;
}void FMSH_Out32(u32 Addr, u32 Value)
{u32 *LocalAddr = (u32 *)Addr;*LocalAddr = Value;
}

有差别的函数:

static void CPUInitialize(FGicPs *InstancePtr)void FGicPs_InterruptMaptoCpu(FGicPs *InstancePtr, u8 Cpu_Id, u32 Int_Id)

 XScuGic

XScuGic等价于FGicPs

 因此helloworld.c中涉及到的都要改:(后面添加了宏定义,这里就不用改了)

添加宏定义:

#define XScuGic_CfgInitialize   FGicPs_CfgInitialize
#define XScuGic_Connect         FGicPs_Connect
#define XScuGic_Enable          FGicPs_Enable
#define XScuGic_Config          FGicPs_Config
#define XScuGic_LookupConfig    FGicPs_LookupConfig
#define XScuGic                 FGicPs

还在报错:

把gic相关的头文件删除,只保留fmql原来的。

已经include了xil_exception.h,为什么undefined

 添加宏定义试试看:

#define XScuGic_InterruptHandler     FGicPs_InterruptHandler_IRQ   

exception.c

XExc_VectorTable重复定义:

xil_exception.c和exception_handler.c有相同的定义,但是不一样的地方不少,所以决定把exception_handler.c中的XExc_VectorTable注释掉。

xparameters.h和xcanps_hw.h明明已经改过了,但是再打开工程又要重新改。。。

不能注释XExc_VectorTableEntry,因为.c文件下其他的函数等需要用到这个。

那么两个.c文件重复定义结构体的解决方法是?

解决C语言重复定义:multiple definition of“xxx”问题-CSDN博客

百度安全验证

 结构体定义 typedef struct 用法详解和小结-CSDN博客

mtcpsr在xil_exception.h中用到,在xpseudo_asm_gcc.h中定义。也就是说xil_exception.h必须要#include了。

exception头文件的作用是:

Xilinx zynq嵌入式vitis使用之中断设计_xilinx vitis 2021.2 嵌入式-CSDN博客

 选择了比较笨的办法:(改名称)

还是报错:

 

 有个疑问,以下代码到底要不要?

#ifndef TESTAPP_GEN#endif

总结

添加的头文件:

删除的头文件:

fmsh的头文件都没删。也没修改内容。

添加的宏定义:

因为gic的头文件内容差不多,所以zynq的头文件就没添加,用fmsh本来的,把函数名称修改成fmsh对应的(上面的宏定义)。

用到了xparameters_ps.h中的宏定义,对应在fmsh_gic_hw.h中。(所以如果要用zynq的gic头文件的话,就要添加相关的宏定义。)

本来是想用xil_exception.h代替exception_handler.h的,因为两者的内容差别会比gic的差别大一些。

但是编译总报错(__asm__:但是fmsh中也有用到__asm__),目前以自己的水平不足以看懂这些,所以就用fmsh的exception代替了。虽然函数中的内容会有差别,但至少现在用到的函数都是fmsh中有的。比如:

运行

既然编译不报错了,就下载进去看看能不能行吧。

在CAN_SelfTest出问题:

因为zynq定义的CAN地址为0xE0008000,而fmsh为0xE0005000

但是LookupConfig()还是读取到0xE0008000。单步调试发现需要修改这里:(xcanps_g.c)

或者修改这里:

 

 还是不行。

看以下fmsh配置CAN的流程:LookupConfig  -->  init  -->  set : Baudrate & ...

要修改寄存器配置?还是程序移植时头文件里内容的影响?

下周再继续思考吧

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

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

相关文章

msvcp140.dll是什么东西?如何修复电脑提示msvcp140.dll丢失的多种方法

文件名为 msvcp140.dll&#xff0c;这是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;属于Microsoft Visual C 2015 Redistributable的一部分。全称为 "Microsoft C Runtime Library" 或 "Microsoft C Runtime Library"&#xff0c;表明该文…

如何使用 Connector API 将数据提取到 Elasticsearch Serverless 中

作者&#xff1a;来自 Elastic Jedr Blaszyk Elasticsearch 支持一系列摄取方法。 其中之一是 Elastic Connectors&#xff0c;它将 SQL 数据库或 SharePoint Online 等外部数据源与 Elasticsearch 索引同步。 连接器对于在现有数据之上构建强大的搜索体验特别有用。 例如&…

ESP32入门:1、VSCode+PlatformIO环境搭建(离线快速安装)

文章目录 背景安装vscode安装配置中文 安装Platform IO安装PIO 新建ESP32工程参考 背景 对于刚接触单片机的同学&#xff0c;使用vscodeplatformIO来学习ESP32是最方便快捷的&#xff0c;比IDF框架简单&#xff0c;且比arduino文件管理性能更好。但是platformIO安装较为麻烦&a…

uniapp 添加字体ttf

效果图如下 一、逻辑概述 在uniapp中使用字体&#xff0c;一共分成两种情况&#xff0c;一种是普通vue页面&#xff0c;一种是nvue页面引入字体。。 1.vue页面引入字体需要如下步骤 1. 先选择下载一种字体&#xff1a;字体格式一般为 ttf后缀名 黄凯桦律师手写体免费下载和在线…

代码随想录算法训练营第三十二 | ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

122.买卖股票的最佳时机II 讲解链接&#xff1a;https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.html 简单思路&#xff1a;逐个计算连续两天的股票差值&#xff0c;sum初始为零&…

期末速成 ——计算机组成原理(2)数值的表示与运算

目录 一、定点数的表示 &#xff08;一&#xff09;无符号数和有符号数的表示 &#xff08;二&#xff09;机器数的定点表示 &#xff08;三&#xff09;原码、补码、反码、移码 (1)原码表示法 二、浮点数的表示 三、溢出判断 (一)采用一位符号位 (二)采用双符号位 四…

Qt Creator(Qt 6.6)拷贝一行

Edit - Preference - Environment&#xff1a; 可看到&#xff0c;拷贝一行的快捷键是&#xff1a; ctrl Ins

Django——Admin站点(Python)

#前言&#xff1a; 该博客为小编Django基础知识操作博客的最后一篇&#xff0c;主要讲解了关于Admin站点的一些基本操作&#xff0c;小编会继续尽力更新一些优质文章&#xff0c;同时欢迎大家点赞和收藏&#xff0c;也欢迎大家关注等待后续文章。 一、简介&#xff1a; Djan…

Firefox国际版

Firefox国际版官方网址&#xff1a; Download the Firefox Browser in English (US) and more than 90 other languagesEveryone deserves access to the internet — your language should never be a barrier. That’s why — with the help of dedicated volunteers around…

基础—SQL—DQL(数据查询语言)案例练习

一、需求 0、emp 表的初始数据 1、查询年龄为20,21,22,23岁的员工信息。 SELECT * FROM emp WHERE gender女AND age IN(20,21,22,23); 2、查询性别为男&#xff0c;并且年龄在20-40岁(含)以内的姓名为三个字的员工。 SELECT * FROM emp WHERE gender男 AND age BETWEEN 20 AND …

记 Codes 开源免费研发管理平台 —— 日报与工时融合集中式填报的创新实现

继上一回合生成式全局看板的创新实现后&#xff0c;本篇我们来讲一讲日报与工时融合集中式填报的创新实现。 市面上所有的研发管理软件&#xff0c;大多都有工时相关功能&#xff0c;但是却没有日报功能&#xff0c;好像也没什么问题&#xff0c;但是在使用过程中体验非常不…

LeetCode-131 分割回文串

LeetCode-131 分割回文串 题目描述解题思路C 代码 题目描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串。返回 s 所有可能的分割方案。 示例 1&#xff1a; 输入&#xff1a;s “aab” 输出&#xff1a;[[“a”,“a”,“b”],…

Docker安装Redis(云服务器)

准备&#xff1a; 在云服务器中开启6370端口号 docker run -d --name redis -p 6379:6379 redis 这条命令使用docker运行一个名为"redis"的容器&#xff0c;映射容器的6379端口到主机的6379端口&#xff0c;并且使用redis镜像来运行容器。REDIS是一个开源的内存数据…

线上 | OpenSergo - [规范]

INDEX 1 参考资料2 OpenSergo 与 Sentinel 关系3 规范体系3.1 服务元数据ReportMetadataRequest 信息![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ffba569841ae4668b4cff74e4d41d21f.png)##### ReportMetadataReply 信息![在这里插入图片描述](https://img-blog…

MMrotate报错AttributeError: ‘NoneType‘ object has no attribute ‘shape‘

使用MMrotate训练自定义数据集报错&#xff1a; AttributeError: ‘NoneType’ object has no attribute ‘shape’ 2024-05-31 17:48:06,121 - mmrotate - INFO - workflow: [(train, 1)], max: 12 epochs 2024-05-31 17:48:06,121 - mmrotate - INFO - Checkpoints will be …

【高校科研前沿】南大王栋、吴吉春教授团队在深度学习助力水库生态调度和优化管理方面取得新进展,成果以博士生邱如健为一作发表于水环境领域国际权威期刊

1.文章简介 论文名称&#xff1a;Integration of deep learning and improved multi-objective algorithm to optimize reservoir operation for balancing human and downstream ecological needs 第一作者及单位&#xff1a;邱如健&#xff08;博士生 南京大学&#xff09;…

JSON Web Token

JWT 什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一种用于在各方之间作为JSON对象安全地传输信息的开放标准&#xff08;RFC 7519&#xff09;。该信息经过数字签名&#xff0c;因此是可验证和可信的。JWT 可以使用HMAC算法或使用RSA的公钥/私钥对进行签名 JWT的…

【C++】——string模拟实现

前言 string的模拟实现其实就是增删改查&#xff0c;只不过加入了类的概念。 为了防止与std里面的string冲突&#xff0c;所以这里统一用String。 目录 前言 一 初始化和销毁 1.1 构造函数 1.2 析构函数 二 迭代器实现 三 容量大小及操作 四 运算符重载 4.1 bool…

SpringCloud学习笔记(一)

SpringCloud、SpringCloud Alibaba 前置知识&#xff1a; 核心新组件&#xff1a; 所用版本&#xff1a; 学习方法&#xff1a; 1.看理论&#xff1a;官网 2.看源码&#xff1a;github 一、微服务理论知识 二、关于SpringCloud各种组件的停更/升级/替换 主业务逻辑是&#x…

中建环能 | “农村生活污水治理稳质增效与智能运维技术研究及成套装备应用” 科技成果评价

中华环保联合会组织召开了中建环能科技股份有限公司申请的“农村生活污水治理稳质增效与智能运维技术研究及成套装备应用”技术成果评价会。会议由中华环保联合会水环境治理专业委员会秘书长刘愿军主持。 评审会委员 本次评价会邀请了7位相关专业领域的专家组成专家评价委员会。…