前言
因为项目的需求或者成本控制等因素,我们经常会遇到更换MCU的情况,这时我们可能需要将以前项目使用的代码移植到新的MCU上面。可能是同系列的不同型号,也可能是不同系列不同架构的MCU,对于一些新手来说,这个事情乍一看好像挺简单,但是上手之后又发现好像无从下手。我也经常收到一些关于移植问题的私信,所以这一期就大概讲一下如何从一款MCU移植到另一款MCU,大概讲一下方法和思路。
1 硬件移植
硬件层面上的移植其实是比较简单的,因为不管是什么单片机,在功能上其实基本差不多,比如GPIO,GPIO在所有单片机上面都是最基本的接口,而且基本一样,最常见的区别无非是能不能做外部中断,有些单片机是所有IO都可以做外部中断,有些则不是。其次就是一些外设常用的接口,如串口,IIC,SPI等,不同型号的单片机区别可能只是接口的数量,引脚号等等,这些在硬件上的使用基本一样,所以移植的时候按照原有的功能重新布线即可。
2 软件移植
2.1 底层移植方法
2.1.1 移植原理
底层移植顾名思义就是在原有的软件工程上,用新MCU的底层库替换掉原有旧的库,并且对原有的应用层做一些兼容性的修改,最后得到一个新的工程,示意图如下:
![](https://img-blog.csdnimg.cn/bd8d834f94f84402886d770483648b58.png)
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的底层库,从而实现多种单片机之间的移植。
而且添加中间层以后,上层可以不用考虑底层的硬件实现,只需要做好应用部分的需求即可,而底层也不需要考虑上层复杂的逻辑关系,只需把每个硬件接口做好接口,这有利于项目的分工和细化。
层级关系如下所示:
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAngAAAIzCAYAAACTCGSVAAAgAElEQVR4nOzdeXjU5aH3/w8h22SyZ7IxCUkgEAj7IlAWEWhV3CmoKNrqr7UeWxX69NinfaxF7dPztGoVn54ebX0QT4/2VMEFPVjkiFaKqBARAoQlC4QsZJmEbJNlAuT3x5CYIdskZMHb9+u65vIwy3fu8VzU93Xf3/v7HbZhw4aWu+66SwAAADCDz1APAAAAAP2LwAMAADAMgQcMkDVr1mjYsGE8ePDo4rFu3bqh/msKGIvAAwAAMIzvUA8AMN0z90trVgz1KIBLx5p/lZ7dNNSjAMzGDB4AAIBhCDwAAADDEHgAAACGIfAAAAAMQ+ABAAAYhsADAAAwDIEHAABgGAIPAADAMAQeAACAYQg8AAAAwxB4AAAAhiHwAAAADEPgAQAAGIbAAwAAMAyBBwAAYBgCDwAAwDAEHgAAgGEIPAAAAMMQeAAAAIYh8AAAAAxD4AEAABiGwAMAADAMgQcAAGAYAg8AAMAwBB4AAIBhCDwAAADDEHgAAACGIfAAAAAMQ+ABAAAYhsADAAAwDIEHAABgGAIPAADAMAQeAACAYQg8AAAAwxB4AAAAhiHwAAAADEPgAQAAGIbAAwAAMAyBBwAAYBgCDwAAwDAEHgAAgGEIPAAAAMMQeAAAAIYh8AAAAAxD4AEAABiGwAMAADAMgQcAAGAYAg8AAMAwBB4AAIBhCDwAAADDEHgAAACGIfAAAAAM4zvUAwAAD29LqpT0TUkJvfxsmSQ/SRH9PShJtZKGSwoagGMDQD8j8ABcWkZK2i7ppKQ7JaX04rPHJG2T5C8pqhefc53/vnRJ10mK7eQ9+/t47DpJDZKulDSnF58DgItA4AEYXD3Nsk2VNEFSttyzZu0VSHpH7pm9b6rr2bR5khZd8NxOuQNtUSev5Up6QdJxSTXqPPC6O3Z3dkr6q6QDktI0MLOLAHABAg/A4NohKUNStLoOtGy5zxD+u6SP2z1/SNIRSaGSmiUt7eYYfTFV0ph+PF6rSEmpIu4ADBoCD8DgC5b0LUmTh3ogAGAmAg8AvFUn6b/lnkX01im5N40AwCAi8ABcOnLlXnodqc6XXnfLPfuXPpiDaidYnZ/D152dcp9/15uNGQBwkQg8AEPnwmCLkbRFUrmkBRe8t1buc/J2yL279np1HoFdzbKdkpTfxWt1kgolzezLj+jB/PMPABhEBB6AoRMs6eD5/ztdUojcGxH2yT3j1X6mrkzupc5USePV9eaKrmbZetpFW9GnX9CzfZKsGpjNGwDQBQIPwNBJlzuA9kqKlzvu0uWe2fu43XOSewauTu5ryaUO+kg91Ur6VFJOD++rkHt5NlTS98R18AAMGgIPwNCKl3vZ1C73zFri+cdeSZP0ZRSdlHuGr7vZu4FUIvcFkS3nxzFO7l3A3V0zDwCGCPeiBTC0JsgdTdvlvv6d5I6+Srkj77TcM2aFcoffqCEYY6tgfRmXifI+7grkXh7O7umNANA/mMEDMLjqJJ3Rl//rEyN3LP233HeSGCP3smyo3GHnlOSQ+z6wk9T9xYJL1PVGiovdZOE6/88vJH12/jd4q/UCzXMkfVecjwdgwBF4AAZXndwzdqHtnouXNEzu24RJ7g0WoXIvhVrlnsmLknf3pR0j6QZ1vIjyxW6yqJT7FmuTJdnOj6f9UvFf5N4IcqOX4wSAAUTgARg8ZXIvuSbIffuuVhGSRsgdfpI0WtKPJPnLfV28ArnDLaGH45dIamx3nP6Sqy9n+KZ18vpOuS/h4if3uYKxGprzBAHgPAIPwOBxyH3mr12eATRe7l2m4e2eSzz/z91yx2BPs2IFkkrljkN7fwy2nYrzY+vsnLsCSe/JvdTcuvxaK3fMtj9nDwAGEYEHYPCUyr20eeFMXIiktC4+c1JSnHo+b+2U3Mu5qer/qMqRO0zjLni+Vu64C5G07IIxvif3kvM1YskWwKBjFy2AwZMv93JsspfvL5D7f6Vab/NVK+n/SXpCHXek5kgKU//HVJncYTpBngFXK+ktuc8pvDDuQiTdJClA0p8kfd7PYwKAHjCDB2Bw5Mp9btx4SSfk3jhR28NnTp3/Z6HcFz7Ol5Ql98xYjb5cEi2QVHX+2D2dp9dqn9xRGCypWF3vov1C7uXZ9nfVKJD0jtznCE4/P85THT+qKLl/5/PiQscABhWBB2BwtC61pko6K/dyaqi6v+yJt7LkPmdvai8+M1XuQHtT7sueBOnLmcJWZXJv3EiV58xglqRdckdhpNwbRBLknkGMO38cf0lz5Y7DP0s6LPcOXM7JAzAICDwAA69M7uAZoS8DJ6Sfjl0g91LoWHUfi0lyz/jFt3suXe5LniTIvUli9gWfOSH3rODEC56fK3fEeXPpliC5l3gv3FgCAAOIwAMw8GLOPwZC663NvHlfZ1p3v3ZmVhfPh6j7iyJf+N6VXr4XAPoJmywAAAAMQ+ABAAAYhsADAAAwDIEHAABgGAIPAADAMAQeAACAYQg8AAAAwxB4AAAAhiHwAAAADEPgAQAAGIbAAwAAMAyBBwAAYBgCDwAAwDAEHgAAgGEIPAAAAMMQeAAAAIYh8AAAAAxD4AEAABiGwAMAADAMgQcAAGAYAg8AAMAwBB4AAIBhCDwAAADDEHgAAACGIfAAAAAMQ+ABAAAYhsADAAAwDIEHAABgGAIPAADAMAQeAACAYQg8AAAAwxB4AAAAhiHwAAAADEPgAQAAGIbAAwAAMAyBBwAAYBgCDwAAwDAEHgAAgGEIPAAAAMMQeAAAAIYh8AAAAAxD4AEAABiGwAMAADAMgQcAAGAYAg8AAMAwBB4AAIBhCDwAAADDEHgAAACGIfAAAAAMQ+ABAAAYhsADAAAwDIEHAABgGAIPAADAML5DPQDAdD/+V/cDAIDBwgweAACAYYZt2LCh5a677hrqcQAAAKCfMIMHAABgGAIPAADAMAQeAACAYQg8AAAAwxB4AAAAhiHwAAAADEPgAQAAGIbAAwAAMAyBB+BroaioSB988IFyc3OHeigAMOAIPABfC1u3btVjjz2mTz/9dKiHAgADjsADYLzW2bsdO3Ywiwfga4HAA2C8rVu36rPPPpMkvffee8ziATAegQfAaBeee8e5eAC+Dgg8AEZrP3vXilk8AKYj8AAYq6vZOmbxAJiOwANgrM5m71oxiwfAZAQeACP1NEvHLB4AkxF4AIzU3exdK2bxAJiKwANgHG9n55jFA2AqAg+AcbyZvWvFLB4AExF4AIzS21k5ZvEAmIjAA2AUu92uV155RS0tLR6P1atXS5KeeeaZDq+tX79eo0ePHuKRA0D/IfAAAAAMQ+ABAAAYhsADAAAwDIEHAABgGAIPAADAMAQeAACAYQg8AAAAwxB4AAAAhiHwAAAADEPgAQAAGIbAAwAAMAyBBwAAYBgCDwAAwDAEHgAAgGEIPAAAAMMQeAAAAIYh8AAAAAxD4AEAABjGd6gHAABfBXl5eXrnnXc0YsQIXXnllQoLC7vkjpuVlaVPPvlEqampmjVrliwWS9trGzduVH5+vq6//nqlpaX16fhFRUV6++235XQ6L+o4AAYeM3gA4IXjx49ry5YtyszMlMvl6tdjf/zxx3rnnXdUUlJyUcdJT0+Xr6+vfvWrX+mtt95qe97hcOjdd9/V7t271dTU1Ofj2+12LVy4UDt37tQjjzyizMzMixovgIHDDB4AeCE7O1sLFy7U7bffrujo6H4//vTp0/tlRuzaa6/V7t27VVVV1fbcli1blJqaqhUrVnh8R1ZWls6dO6fRo0d7zPZJ7pnFgIAA2e12j+fT09O1atUq5efnKyAgoNMxOBwO+fn59dssJ4DeI/AAoJ3O4sTpdKqxsVHp6elKSUnp9rMul0sREREdgqm/FRUVaefOncrPz+/wWkxMjBwOh5544gk1NDQoMzNTERER2rx5c9t7GhoatGXLFjU3N+vXv/61rrnmGo9jv/LKKyorK1NiYmKH4zc0NMjHx8fjeBce94orrtBDDz00IDEMoGcEHgC0U1ZWpueee04NDQ0aO3asJKmyslKnTp1SYWGhsrOzu/zsrl27lJubq9WrV2vVqlUDGnl2u11LlizpdKZszZo1Sk5O1po1azr9c6u1a9d2euxdu3apqalJ3/3udzVz5kw5nU75+Ph49Xu2b9+ugoICxcbG9vtSNgDvEXgA0E5gYKBKS0s1d+7cDkHUk+eff14ZGRkaP378gM/gSZLNZuvT57pbQs3Ly9PGjRsVGBiokJAQSdKmTZv00Ucf6Y477tDixYvb3rtr1y4VFBRo1qxZSklJkcPhUGlpqe6++27Nmzevbz8KQL8g8ACgH1ksli7PTestp9Opv//974qNjdXMmTM7fU/rztmKioq25zIyMpSXl9c2g9b+z61LqOPGjdPDDz/c4by/gIAArVq1SikpKUpLS9PevXv19ttvKygoSEFBQaqoqNC+ffsUHR2tuXPnavv27frxj3+skJAQff/739eyZcsGJW4BdI/AA4BudLc82Z+bCT744IMOS5r79u3T9u3bNWbMGD3++OMes2etkpKSlJKS4jG+4uJijyXZC/98+vRphYSEKC4ursPx7HZ728aKrKwsPfnkk0pPT9eDDz6o6Ohobd++XWvXrtWIESP0i1/8QkuWLNG4ceP06KOPatmyZVqxYoV+8pOfcAkVYIgReADQjdLSUv3hD39QdXV12zl50pebCaZOnaqf//zn3W6+8MbixYt7vSQsSVartU/fFxUVpbCwsC53y+7du1d//OMfNW/ePN15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1dXV6brrruvyvMG8vDy9//77crlc+tGPfqSAgAA99thj3V74ubi4WPX19XrooYf0+OOPa8+ePbLb7Zo8eXL//VAAvULgAUA3AgICtHz5co0ePdrj+dDQUD366KOXxL1WnU6n1q9fL5vNpptuuqnL26ktWLBAL730knx9fbVs2bJOj9PS0qJly5a1/S5vIzYwMFD+/v6y2WxaunRp338MgH5B4AFAN+x2u2699dYOz9tstgHb6NBbmzZtUlBQkFasWNHtcuioUaM0e/Zsvfrqq3I6nR3OqbNarR1CFsBXE4EHAH3kcDhUUFDQtiSamZmp2traXh/nyJEjys/P79MYtmzZotraWq1YscKr689dccUV2rdvnx555BFt3rxZ999/v2bNmsXtxQDDEHgA0Ec2m001NTXasWOH1q9frwMHDuiBBx5ou8PDQHI6nXrjjTckSbfeemvbkqrD4WjbGNEZq9WqNWvWyGaz6bnnntNTTz2lBx98UPPnz+828i7cZNJeRkZGj5tBAAwuAg8A2qmqqtKUKVO83iAwatQorV69WhMnTtTnn3+uxYsX93rXaGJioqKjo3sVhvv37+90nDU1NUpMTFRSUpIkdwjOmDFDgYGBqq6uVlhYWNvFlJcvX+7VvXSnTZumKVOm6Jprrun09dDQUPn6+io4ONjr8QMYWMM2bNjQctdddw31OABgwKxZs0bPPvusnnnmmS53ggKASXyGegAAAADoXwQeAACAYTgHD4AxGhoaVFVVpaamJo/na2pqJLn***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)
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 两种移植方法比对
![](data:image/png;base64,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**5HcSmpsgMpyqooIlyQnhfWK99giPjvDHzooyEVmosKGd8BjSFEZzt0d+/YooWXkumJ4QljED17RnW6SCi0SCC06bld7Of5VcqBybmihRSzTISiRUgmERychObmpeFa6JhN88hL305BBcX89t3YZLjbOwF2M2kE85yDG0zGN43i5TwnVDc0zw2ct1GQgghF0JPLAqG8GJYHxW1ZdtG7UMfZlP9HAdVbqPCUtGrb2M3Oi9tyNrYPUpirTKPZ4kc6msF4aopgohxXRNMei+2R2indsAl5tfxLhwWQDiSxehrbbOcgNiHjLjuTV4f62Y8nCoYFjbxbjahRzbtruTOROMvBMW+mw+LcDZy/42KXM7FPRUrDncBnCoRmGxt0YQPow0+3Kvk8SyhWe6CSTj22s6G47gdxPSSe4cZFp/kJFYSOSTXCpKbvr15s7oh9RRogiz05G7bWAAAEMxJREFUDfs9TOQW8aw5i9uHZoIdPcN1As54dEf7PZSpcuCa/EezhDbLVrfT8D0k8ViLNx32mceIz16ySH6fTuHreNj4f8u5aiuq6Vkygst97xjt4DTch6TICxSdNzNIO8JBmofYDU47kis1n20C02ujzYeq8SDP7zddchtp83o0r8j63HuB/TYwOW+RlDUlWhTRzUXkkMf0/ooWy97HMGnzdngs3RtQe/VgNyGUZZYP2sy7hPamoVBqb9pi+o3HS2ihOSov3JtYqlzHs0TCUqJsVC424ZUNe2r0aD4M9OrYn5zXXFV6qIvUfe6Cc7OMhCWJh+r6Q2iOxsqQCUL6LX72AtEDkd0HPKQ5V95S7d42an20vniqZzfc+zTbedp+MBUwoytPZM16HzeVsYwXezyXl7YpCtq7aOTcxoV7MytI+aylyDyeqZVJGJzx3XGO9i9VJlHzWG+k74KMjvvYabtmigwm/x9M709iXvNf7NVzygQe0l1QTmhxr31bY3cb1S0VNgVs7wRH0reWqiyhruWTqKzVkVtMoI0gkmvAi8enaKdrzK8967BplTDep5Esxooe49mr55DQMshE8xVNEOj7cjTM5Ehe5/2Teg4r+rqrm0kU33A0b094Yia6OXMlta00osjq2kP9TMZZv2ZowuFaBQXlxlA6EExi7azeic8HH3yaBU6sQwOTw/VOcBSchnuOLO070r6x2ZviWxmQD7Z/39v6TY7blS3RpvVcCPxGtndLjOMaJnKL1kRy46JvzG8P9e0jW0iC6eqtesaLWZ4kbwQjg57tO1YqSaT5KpjEPQC+21HXUkdOOWBQIqQ+LT45QnD6Xp9yO8+EIB8evI8x16OgFk4ZxXz/QrTSuwkiKU***t2ejSeRErBVLPsZSzmpaN7qndF7gX29v1L3pP2kIuzDbJw68W+fZMOWnBeO51bJWtYkZtF8HlgR++FKxWe7RhR5HwCYc9K9eg6LufqpYn6/8+bNmzfygVevXuHatWsjXu7d5JtvvvH4zrwLIaaG0ac8Z7gCzwp3JJeaZfq1LZOAUb7BHj+kDu4fF4MTfKjepypGwN7OUfoBlg2nvPFT17OTF20PJTIs6ALbKO0ck7LEMT48xF6MpSahYoEdqb0uV+8r/Pqg/FbISHifFwkhbzvuJYrIZeTqz8/DKv3Ju8Slsvy+G7hlZFQQBYQGcB7lRAJlXeDq1bG9C7QVrleAKs5CYWEMp7CWzGFRcz2yTw7GNfomDRkX/YRDRXzNKbO8CYbth7BFC+6orjiwbNeobhrDttOFQW5ULtZUh3awT2mw3skRgqepOg4ITWw7inz/4LIRris/n5a8QSnIjzedPiGEvAv4Zk0XdkIuHsl6TogNCr/njrdawsKSp/8rjFQlj7JWWP2**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)
3 结束语
好了,关于MCU移植的介绍就讲到这里,本文其实讲的还是比较笼统的,不够全面,列举的例子也不多,实际的情况可能会更复杂,可能两个库之间差异很大,可能有些函数没看懂,不知道是做什么用的,可能在底层的基础上还有操作系统,文件结构更加复杂了,等等。这些情况我也没法一一列举,需要你根据实际情况去移植,但是基本原理是一样的,最终的目标都是功能替代,而实现的方法也不是唯一的,需要你灵活使用。
本文只是提供一个思路,不是唯一的方法,讲的也不全面,如果你有什么问题或者有更好的方法,欢迎在评论区留言。
————————————————
版权声明:本文为CSDN博主「柒壹漆」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ShenZhen_zixian/article/details/130660756
|