MCU通用移植方案

news2025/1/23 21:12:47

MCU通用移植方案

目录

  • MCU通用移植方案
    • 前言
    • 1 硬件移植
    • 2 软件移植
      • 2.1 底层移植方法
        • 2.1.1 移植原理
        • 2.1.2 移植方法
      • 2.2 中间层移植方法
        • 2.2.1 移植原理
        • 2.2.2 移植方法
      • 2.3 两种移植方法比对
    • 3 结束语

前言

因为项目的需求或者成本控制等因素,我们经常会遇到更换MCU的情况,这时我们可能需要将以前项目使用的代码移植到新的MCU上面。可能是同系列的不同型号,也可能是不同系列不同架构的MCU,对于一些新手来说,这个事情乍一看好像挺简单,但是上手之后又发现好像无从下手。我也经常收到一些关于移植问题的私信,所以这一期就大概讲一下如何从一款MCU移植到另一款MCU,大概讲一下方法和思路。

1 硬件移植

硬件层面上的移植其实是比较简单的,因为不管是什么单片机,在功能上其实基本差不多,比如GPIO,GPIO在所有单片机上面都是最基本的接口,而且基本一样,最常见的区别无非是能不能做外部中断,有些单片机是所有IO都可以做外部中断,有些则不是。其次就是一些外设常用的接口,如串口,IIC,SPI等,不同型号的单片机区别可能只是接口的数量,引脚号等等,这些在硬件上的使用基本一样,所以移植的时候按照原有的功能重新布线即可。

2 软件移植

2.1 底层移植方法

2.1.1 移植原理

底层移植顾名思义就是在原有的软件工程上,用新MCU的底层库替换掉原有旧的库,并且对原有的应用层做一些兼容性的修改,最后得到一个新的工程,示意图如下:
在这里插入图片描述

2.1.2 移植方法

1、修改系统时钟
系统时钟是MCU运行的基准,如果移植双方的时钟频率不一致,那么跟时间相关的一些函数就要做相应的改变才能保证原有的功能正常运行。比如串口波特率,I2C时钟频率,延时函数,定时器等,定时的时间是基于系统时钟计算出来的,如果系统时间变快了,这些定时的时间也会变短,像有些模拟I2C的驱动是用delay()函数来模拟I2C的时序,一旦这个延时时间变了,可能就直接导致I2C通讯异常。我们可以通过修改系统时钟,或者改变定时器分频等方法,让这部分的功能跟原有保持一致。
2、修改初始化函数
MCU在启动的时候都要先对各个模块进行初始化。比如GPIO初始化(包括时钟、引脚号、模式、速率等等)、I2C初始化,SPI初始化等等。不同型号的MCU用的可能是不一样的库,因此初始化这部分代码的写法上可能会有差异,这个时候我们还是按照功能移植的原则,把整个初始化部分替代掉。
当然,这个部分其实可以参考新固件库的demo,一般固件库都是有一些常用的Example,比如GPIO、UART、IIC、SPI、EXTI等等。我们可以先看下人家的demo是怎么用的,然后再按照自己的需求改。
3、修改底层接口
在应用或者驱动部分,我们经常会去调用一些底层的接口。比如GPIO拉高拉低,IIC读写、串口收发等等。
这些地方如果移植前后函数名或者用法不一致的话就需要修改成一致。主要是保证功能一致即可,命名或者入参这些其实不是最重要的。比如我在代码的某个地方需要用IIC发送一个数据,代码怎么改,结构怎改,这些不重要,只要能正确发出这个数据,那功能上就是一致的,就是成功替代过去了。
4、修改include包含
原有的工程文件在应用部分(c文件)会包含很多底层库的头文件(h文件),但因为移植了底层库进来,很多头文件的命令不一样,因此,这些也需要修改,和底层库保持一致。

2.2 中间层移植方法

2.2.1 移植原理

在应用层和底层之间添加一个中间层作为上层和底层用来交互数据的接口通道,而这个中间层又可以匹配多个MCU的底层库,从而实现多种单片机之前的移植.
而且添加中间层以后,上层可以不用考虑底层的硬件实现,只需要做好应用部分的需求即可,而底层也不需要考虑上层复杂的逻辑关系,只需把每个硬件接口做好接口,这有利于项目的分工和细化。
层级关系如下所示:
在这里插入图片描述
在这里插入图片描述

2.2.2 移植方法

1、添加应用层访问接口
为了方便应用层访问和调度底层的各种硬件接口,中间层作为信号的中转站,最好是做一个通用的接口供应用层去调用,比如open(),read(),write(),set(),get()等,应用层可以通过open()函数打开和配置任意一个外设,可以通过read()获取到任意一个外设的数据。
2、封装底层外设接口
中间层需要把底层接口封装成通用API供应用层使用,而且针对不同的单片机,还需要对底层的接口做兼容,比如串口,I2C,SPI等外设接口,需要根据不同的底层库进行修改适配。
3、修改时间函数
时钟对于单片机运行至关重要,它是代码运行的一个基准,因此,为了保持应用层和底层的时间片一致,中间层应对时间做一个同步,比如软件延时,滴答时钟延时,定时器延时等,需要做到上下一致。
4、数据类型重定义
数据类型虽然都是按照编程语言的规定来定义的,但实际使用中,根据个人的使用习惯,往往会把常规的类型进行重定义,比如“unsigned char”,“ uchar”,“uint8_t”,“u8”等等。不同单片机的底层库也是一样,可能会使用不同的方式来表示,因此,为了在不修改应用层的基础上完成移植,中间层就需要对底层的数据类型进行重定义,保持和应用层一致。还有,为了方便上层对中间层的访问,也可以自定义一些结构体类型,比如可以定义一个设备句柄,用来指向具体的硬件外设,这样一来应用层就可以通过同一个API接口入参不同的设备句柄来访问不同的底层外设。

2.3 两种移植方法比对

移植方法优点缺点适用范围
底层移植移植操作简单直接,应用层可以直接访问底层,运行效率高每次更换移植时,都需要对应用部分做改动功能较为单一的项目
中间层移植层次分明,应用层和底层之前互不干扰上层和底层的交互需要中间层作为中转,运行效率相对来说低一些功能多,应用部分逻辑复杂的项目

3 结束语

好了,关于MCU移植的介绍就讲到这里,本文其实讲的还是比较笼统的,不够全面,列举的例子也不多,实际的情况可能会更复杂,可能两个库之间差异很大,可能有些函数没看懂,不知道是做什么用的,可能在底层的基础上还有操作系统,文件结构更加复杂了,等等。这些情况我也没法一一列举,需要你根据实际情况去移植,但是基本原理是一样的,最终的目标都是功能替代,而实现的方法也不是唯一的,需要你灵活使用。
本文只是提供一个思路,不是唯一的方法,讲的也不全面,如果你有什么问题或者有更好的方法,欢迎在评论区留言。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华硕 PRIME H610M-A D4 i5-12490F 1060电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网,转载需注明出处。(下载请直接百度黑果魏叔) 硬件型号驱动情况 主板华硕 PRIME H610M-A D4(LPC Controller/eSPI Controller H610芯片组) 处理器12th Gen Intel Core i5-12490F 六核已驱动 内…

Mysql的重要知识点以及问题

查看索引的命令 show index from mytable 索引的原理 索引用来快速地寻找那些具有特定值的记录。如果没有索引,⼀般来说执行查询时遍历整张表。 索引的原理:就是把无序的数据变成有序的查询 把创建了索引的列的内容进行排序 对排序结果生成倒排表…

货运物流小程序开发功能有哪些?

移动互联网的深入发展让网购等线上交易更加盛行,货运快递物流也随之增多,成为我们日常生活的重要组成部分。传统的货运物流管理主要依赖人工,不仅效率慢还容易出错。随着市场的发展以及人们对服务质量要求的提高,现在很多中大型货…

Oracle 12c安装

前言 版本:12c第二版 检查弹出窗口程序,需要安装xmanager,并执行以下命令: xhost 192.168.194.91 安装步骤如下 安装必须的安装包: rpm -q bc binutils compat-libcap1 compat-libstdc-33 glibc glibc-devel ksh libaio libaio…

c++ 多态与虚函数

c中多态分为静态多态和动态多态,静态多态是函数重载,在编译阶段就能确定调用哪个函数。动态多态是由继承产生的,指不同的对象根据所接收的消息(成员函数)做出不同的反应。例如,动物都能发出叫声,但不同的动物能发出不同…

esp32之解析json

文章目录 前言一、json的作用二、json结构三、esp32 json解析安装库解析StaticJsonDocumentDynamicJsonDocument 四、解析今天的北京天气总结 前言 在现代Web开发中,JSON(JavaScript Object Notation)已成为常用的数据传输格式。ESP32是一款…

Netty 爱好者必看!一文详解 ChannelHandler 家族,助你快速掌握 Netty 开发技巧!

1 Channel 接口的生命周期 Channel 定义了一组和 ChannelInboundHandler API 密切相关的简单但功能强大的状态模型 1.1 Channel 的状态 状 态描 述ChannelUnregisteredChannel 已经被创建,但还未注册到 EventLoopChannelRegisteredChannel 已经被注册到了 EventL…

Wealth 开源的账本响应式网站系统免费部署

演示网站: https://wealth.willin.wang 前置准备 首先需要注册一个 Github 账号,Fork 这个开源项目: https://github.com/willin/wealth (欢迎 Star) 然后使用 Github 账号分别注册 Vercel 和 Planetscale&#xf…

【Linux 】 ps命令详解,查看进程pid

文章目录 ps概述ps语法指定pid进行查看 ps概述 ps 命令是最常用的监控进程的命令,通过此命令可以查看系统中所有运行进程的详细信息。 ps 命令有多种不同的使用方法,这常常给初学者带来困惑。在各种 Linux 论坛上,询问 ps 命令语法的帖子屡…

双向链表--C语言实现数据结构

本期带大家一起用C语言实现双向链表🌈🌈🌈 文章目录 一、链表的概念🌎二、链表中数据元素的构成🌎 🌍三、链表的结构🌎 🌍 🌏四、 双向带哨兵位循环链表的实现&#x1f3…

ROS2 中 使用奥比中光 Orbbec Astra Pro 深度相机

本文将以 Ubuntu 20.04 和 ROS2 foxy 环境为例,详细介绍如何在 ROS2 中使用奥比中光 Orbbec Astra Pro 深度相机。在这一篇文章中,你会学到如何创建工作空间,使用 usb_cam 功能包,编译安装使用 ros_astra_camera 等。 文章目录 1.…

年薪50万的程序员和一般的中学教师相比,被亲戚看不起

我是一名程序员,已经工作五年,年薪大概有50万左右。然后,亲戚家的孩子是博士生,在一所中学教书,自己一年的工资可以抵达五六年的薪资,不过还是被亲戚给鄙视了。 很多人都持有不同的观点。我自己是一名程序…

vue-事件修饰符+键盘事件

事件修饰符 1、prevent&#xff1a; 阻止默认事件&#xff08;或在方法中使用e.preventDefault()&#xff09; <a hrefhttps://blog.csdn.net/weixin_52993364?typeblog click.preventshowInfo>点我</a> 说明&#xff1a;这样点击后就不会发生地址的跳转 2、s…

Linux查找指令 时间查看

date 我们在windows中想要看一下时间&#xff0c;我们可以直接在显示器上看到&#xff0c;但是如果我们用的是linux远程登录软件我们像查看一下时间&#xff0c;我们应该怎么做&#xff1f; 我们直接输入date&#xff0c;我们就可以看到当前的时间&#xff0c;不过这个是系统按…

蚁群算法ACS处理旅行商问题TSP【Java实现】

1. 介绍 蚁群算法是一种群体智能算法&#xff0c;模拟了蚂蚁寻找食物时的行为&#xff0c;通过蚂蚁之间的信息交流和合作&#xff0c;最终实现全局最优解的寻找【是否找得到和迭代次数有关】。 蚁群算法的基本思想是将搜索空间看作一个由节点组成的图&#xff0c;每个节点代表…

Linux awk [-v] {print} 命令

AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 语法&#xff1a;语法&#xff1a;awk 条件1 {动作 1} 条件 2 {动作 2} … 文件名 awk是处理文本文件的语言&#xff0c;所以要传入文本数据供其处理&#xff08;文件逐行读入&#xff09;&#xff0c;…

合宙Air780e C-SDK开发

Air78e简介 AirXXXE系列模组&#xff0c;是合宙通信基于移芯EC618平台设计研发的新款4G Cat.1模组。 Air780e的资料点击这里打开。 Air78e开发板简介 一代 IPEX 天线连接器&#xff08;选配&#xff09;4G 弹簧天线一个下载/调试串口&#xff0c;两个通用串口IO 口默认电平…

电子电气架构——车辆电子电气架构的网络安全汇总

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本文主要分享关于车辆电子电气架构的网络安全常见隐患和对应现阶段解决办法。 背景信息 不知道是否还记得《速度与激情8》中黑客Cipher通过网络侵入车辆,…

PyTorch2.0向后兼容性和加速效果浅探

前言 在PyTorch2022开发者大会上&#xff0c;PyTorch团队发布了一个新特性——torch.compile&#xff0c;将PyTorch的性能推向了新的高度&#xff0c;称这个新版本为PyTorch2.0。torch.compile的引入不影响之前的功能&#xff0c;其是一个完全附加和可选的功能&#xff0c;因此…

Linux系统调用函数(300多个)

前言&#xff1a;这里只是给出中文描述&#xff0c;方便浏览熟悉&#xff0c;具体情况建议去具体环境&#xff08;Linux系统&#xff09;下执行 1&#xff09;man 2 systemcalls &#xff08;查看所有系统调用函数&#xff09;&#xff1b;2&#xff09;man 2 open &#xff08…