文章目录

  • 型号
  • MDS新建GPIO工程
  • 命令行运行
  • rtfnode rtfevent
  • SOMEIP Event定义
  • 程序的调用关系

型号

MDC300F, 刷的新的101版本, 操作系统是Ubuntu18. 有3路GPI和3路GPO:

  • GPI输入0~12V, 可以接 急停开关, 进入自动驾驶按钮等
  • GPO不太清楚怎么用

这里主要是GPI的使用, 借着这个熟悉下MDS的应用.

MDS新建GPIO工程

板子有3路GPI, 12V时表示输入1, 默认输入0. MDC会采集接入低速连接器的GPIO管脚的电平,供客户APP订阅。电平的更新周期为100ms。

官方给的Platform Example中, 删掉 camera_ap_to_ros_sampledvpp_decode_sample 两个工程, 可以全部导入编译, 也可以按照下面的例子, 单个导入.

打开 MDC Development Studio -> File -> New -> MDC Project, 新建一个tk_gpio的工程

默认的文件树为

$ tree
.
├── cmake
│   └── toolchain.cmake
├── CMakeLists.txt
├── modules
│   └── CMakeLists.txt
└── tests└── CMakeLists.txt3 directories, 4 files

删掉tests文件夹, 最外层的CMakeLists.txt也删除最后一行

add_subdirectory(tests)

从工程例子中拷贝 modules 文件夹中的 gpio_sample, 拷贝整个 manifest 文件夹, 删除不必要的文件, 现在文件树看起来这个样子

$ tree
.
├── cmake
│   └── toolchain.cmake
├── CMakeLists.txt
├── manifest
│   ├── application_sample
│   │   └── gpio_sample
│   │       └── gpio_abstract_sample.arxml
│   └── common
│       ├── data_type
│       │   ├── mdc_data_type.arxml
│       │   └── mdc_mode_declaration.arxml
│       ├── machine
│       │   ├── dmini0_machine.arxml
│       │   ├── dmini1_machine.arxml
│       │   ├── dmini2_machine.arxml
│       │   ├── dmini3_machine.arxml
│       │   └── host_machine.arxml
│       └── service_interface
│           └── canfd_can_uart_gpio_sample
│               └── gpio_rx_service_interface.arxml
└── modules├── CMakeLists.txt└── gpio_sample├── CMakeLists.txt└── src├── gpio_msg_init.cpp├── gpio_msg_init.h├── gpio_msg_rx.cpp└── main.cpp12 directories, 17 files

依次点击 Generate 和 Reload Cmake 按钮

这时Targets下面已经有了gpio_sample, 双击编译

点击齿轮图标进行设置

Executable 和 Manifest 要一一对应

点击上图中的New…按钮, SSH, OK

输入mdc账户

点击Browse...可以选择MDC300F中应用程序放置的位置, 然后点击 Applay and Close 按钮

点击运行按钮

可以看到Console已经打印出了信号值, 10个里面有用的是前3个, 接12V信号就变成了1, 悬空或接地是0

点击上图红色方块可以停止运行

命令行运行

如果想在命令行里运行, 根据提示(小bug, 换行处多了个字母)

切换到mdc或者root账户, 在命令行里输入

# 工程路径 /home/mdc/wks, 工程名 tk_gpio
# 路径里面是json和xml文件的配置
$ export CM_CONFIG_FILE_PATH=/home/mdc/wks/tk_gpio/etc/HostMachine/mdcgpio/MdcGpioProcess
$ /home/mdc/wks/tk_gpio/bin/gpio_sample

程序的名字还是 gpio_sample而不是tk_gpio, 这在top中也可以看出来

$ top | grep -i gpio
20127 root      20   0 1267572  22868   9700 S   0.3  0.1   0:00.19 gpio_sample
20127 root      20   0 1267572  22868   9700 S   0.3  0.1   0:00.20 gpio_sample
20127 root      20   0 1267572  22868   9700 S   0.3  0.1   0:00.21 gpio_sample
20127 root      20   0 1267572  22868   9700 S   0.3  0.1   0:00.22 gpio_sample

rtfnode rtfevent

可以用 rtfnode info 来查看APP进程信息

$ rtfnode list | grep -i gpio
/HuaweiMDC/PlatformApplication/MdcGpioCenterApplication/SwComponent/mdcgpio/MdcGpioProcess[mdchost]$ rtfnode info /HuaweiMDC/PlatformApplication/MdcGpioCenterApplication/SwComponent/mdcgpio/MdcGpioProcess[mdchost]
Node [/HuaweiMDC/PlatformApplication/MdcGpioCenterApplication/SwComponent/mdcgpio/MdcGpioProcess[mdchost]]
ServiceInstance:
* /HuaweiMDC/PlatformApplication/MdcGpioCenterApplication/Service/Consumer/MdcGpioRxServiceInstance[SOME/IP]Event Publications: None Event Subscriptions:
* /HuaweiMDC/MdcPlatformServices/GpioRxServiceInterface/GpioRxServiceInterface/GpioDataRxEventMethod: None Field: None Pid: 13848

查看event

$ rtfevent list | grep -i gpio
/HuaweiMDC/MdcPlatformServices/GpioRxServiceInterface/GpioRxServiceInterface/GpioDataRxEvent[/UnknownPubEvent_212_1_SOMEIP]$ rtfevent info /HuaweiMDC/MdcPlatformServices/GpioRxServiceInterface/GpioRxServiceInterface/GpioDataRxEvent[/UnknownPubEvent_212_1_SOMEIP]
Event type:/HuaweiMDC/MdcPlatformServices/GpioRxServiceInterface/GpioRxServiceInterface/GpioDataRxEvent
Publishers:NoneSubscribers:
* /HuaweiMDC/PlatformApplication/MdcGpioCenterApplication/SwComponent/mdcgpio/MdcGpioProcess[mdchost]

SOMEIP Event定义

gpio_abstract_sample.arxml 中定义的 udp 端口是 54864(这是host的, mcu的为51381).
gpio_rx_service_interface.arxml有部分 SOME/IP Event 的定义:

<EVENT-ID>32769</EVENT-ID>
...
<SERVICE-INTERFACE-ID>212</SERVICE-INTERFACE-ID>
...
<EVENT-GROUP-ID>1</EVENT-GROUP-ID>

arxml中是十进制, 换算成十六进制:

  • EventID, 32769=0x8001, GPIO, UART和CAN上行的EventID都是0x8001(32769), 而CANFD短包上行为0x8002(32770), CANFD长包上行为0x8003(32771), EventID对应的还有MethodID, 两种方式
  • ServiceID, 212=0xd4, GPIO(只上行?)为0xd4(212), UART上下行均为0xd3(211), CAN/CANFD上行和CANFD Method方式下行为0xd0(208), CAN下行为0xd1(209), CANFD Event下行为0xa1(161)
  • InstanceID看有多少外设, GPIO数据量少, 3路GPI合并编成一组可用GPIO, 编号就是1. UART可用的只有1路, 编号也是1. CAN有12路, 每路单独编组, InstanceID就有1~12. 程序里初始化中服务发现直接指定这个Instance Id就可以
  • EventGroupID 手册是0x10, 十进制应该是16, 不知道为什么这里是1, 用于服务发现

手册中的GPIO的SOME/IP Event定义

  • EventID:0x8001
  • ServiceID:0xd4
  • InstanceID:1
  • EventGroupID:0x10

即便停止掉程序的运行, MCU还是会不断往外发布

# gpio_abstract_sample.arxml 中定义了 54864 端口
$ tcpdump port 54864
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:28:15.592031 IP 192.168.1.66.51381 > mdchost.54864: UDP, length 83
10:28:15.692039 IP 192.168.1.66.51381 > mdchost.54864: UDP, length 83
10:28:15.792039 IP 192.168.1.66.51381 > mdchost.54864: UDP, length 83
...

这在主程序中也能看出来

int main(int argc, char *argv[])
{McuApInterface mcuApInterfaceNode;mcuApInterfaceNode.Init();// 注册GPIO帧处理回调函数mcuApInterfaceNode.RegisterRxEventCallBackFunc(std::bind(&OnGpioRawDataRecieved, std::placeholders::_1));while (1) {usleep(SLEEP_TIME);}return 0;
}

相当于这个程序只是个使能开关, 录下数据

$ tcpdump port 54864 -w /home/sftpuser/uploads/tk_gpio.pcap -v
# tcpdump port 30491 -w /home/sftpuser/uploads/tk_gpio.pcap -v# 获取Host和MCU通信的所有报文,存为pcap文件
# tcpdump host 192.168.1.66 -w /home/sftpuser/uploads/gpio.pcap -v

图中, 圈中的就是3路的值

54864这个端口是被占用的, 不能用其它程序或者脚本 bind. 需要用SOME/IP的 30491 的组播服务

程序的调用关系

AP的接口(ara::)可以在产品文档查看帮助.

MDC300F MDS新建工程 GPIO相关推荐

  1. STM32F103标准库入门——新建工程、初识GPIO

    自古逢秋悲寂寥,我言秋日胜春朝. 晴空一鹤排云上,便引诗情到碧霄.--刘禹锡<秋词二首·其一> 一.新建工程 芯片型号: STM32F103C8T6 (SMT32最小系统开发版) 新建工程 ...

  2. STM32CubeMX5.1.0使用教程,以STM32L431为例(二):新建工程、时钟、gpio

    这里,我们使用STM32CubeMX新建一个工程感受其强大 文章目录 一.新建工程 二.保存工程 三.时钟配置 四.GPIO设置 五.生成代码 六.GPIO基本输入输出函数(HAL库) 七.结语 一. ...

  3. MDC300F CANFD应用笔记

    文章目录 型号 CAN端口分配 SOME/IP定义 发送参数下发 新建工程 默认工程的运行效果 接收 发送 cantools dbc 数据解析 透传模式发送 维稳周期模式发送 MMC的CANFD配置 ...

  4. STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结

    摘自:STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结 作者:自信且爱笑' 发布时间: 2021-04-28 21:17:40 网址:https://blog. ...

  5. stm32cubeide外部中断_【STM32】HAL库 STM32CubeMX教程三----外部中断(HAL库GPIO讲解)

    前言 上一节我们讲解了STM32CubeMX的基本使用和工程的配置,那么这一节我们正式来学习CubeMX配置STM32的各个外设功能了 今天我们会详细的带你学习STM32CubeMX配置外部中断,并且 ...

  6. MSP430 GPIO概述 第六章

    2.1 MSP430 GPIO概述 通用输入/输出接口(General Purpose Input/Output,简称GPIO)是单片机通过引脚来控制或者采集外部电路的接口,是单片机最基础的功能之一. ...

  7. 华芯微特SWM181学习笔记--GPIO应用与环境搭建

    华芯微特SWM181 系列 32 位 MCU(以下简称 SWM181)内嵌 ARM® CortexTM-M0 内核, SWM181 支持片上包含精度为 1%以内的 24MHz.48MHz 时钟,并提供 ...

  8. 1.合宙Air32F103调试GPIO

    一.简介 合宙Air32F103开发板板载Air32F103CBT6,兼容STM32F103C8T6,价格太香了,首发9.9包邮.自带DAPLink固件,可以直接当DAPLink使用. 官方详细介绍( ...

  9. MPC5748G S32_SDK_PA_RTM_3.0.0 GPIO 调试仿真设置

    文章目录 前言 新建工程 PE配置 补全代码 调试设置 仿真出错解决 工程代码下载 微信公众号 前言 MPC5748G开发环境搭建 上一篇搭建了MPC5748G的开发环境 S32 Design Stu ...

最新文章

  1. 无限互联新浪微博项目(视频)分享
  2. python百度网盘-bypy-百度网盘Python客户端 linux
  3. 【Java并发编程】—–“J.U.C”:ConcurrentLinkedQueue
  4. Javascript JSON 序列化和反序列化
  5. python response.json_Python - Django - JsonResponse 对象
  6. 容器编排技术 -- 基于Docker本地运行Kubernetes
  7. linux 复用寄存器,I/O多路复用一些概念
  8. Input Output
  9. JUnit 5 对比 TestNG
  10. react引入静态图片的方式
  11. 如何用html制作彩虹,javascript – 如何使用HTML5画布生成彩虹圈?
  12. AMD 宣布开源 Linux 显卡驱动与 GPUOpen 工具
  13. java定义一个eat方法_小黄鸭系列java基础知识 | java中的方法
  14. 15个经典面试问题及回答思路,很多人死在了最后一个问题上
  15. Microbiome | 二氧化碳浓度升高改变小麦根际微生物群落组成和代谢以矿化有机磷...
  16. Web基础与apache讲解
  17. 区块链100讲:Hyperledger Cello简介
  18. MATLAB 矩阵的NAN值怎么删+绘图颜色设定
  19. SkeyeVSS矿山采盗监控系统智能化管控非法采矿解决方案
  20. 生意人告诉你闷声发大财的2个小技巧

热门文章

  1. 分享2018版最新AiJiaCMS爱家房产网站商业版源码,开源版本
  2. 小程序 自定义开关组件
  3. 计算机动漫设计比赛策划书
  4. 肥波效果器插件合集 – FabFilter Total Bundle 2020.6 WiN
  5. 楚留香服务器维护3月8,楚留香手游3月8日更新了什么_3月8日更新内容介绍_3DM手游...
  6. 唐宇迪Pytorch笔记(附课程资料)
  7. 转关于一些计算机面试知识总结
  8. pr导出html,你好,PR导出视频的时候怎样设置最清楚?
  9. 用Python一键分析你的上网行为,看是在认真工作还是摸鱼
  10. 使用devSidecar github加速器,导致的连不上网络的问题