一,概括
程序的移植包括以下几步
1.观察待移植程序调用了哪些文件,将这些文件放入移植的工程当中
2.在keil当中添加这些文件,并且添加.h文件的路径
3.处理头文件及软件版本匹配的问题
二,详解
步骤一:
1.观察待移植程序调用了哪些文件,将这些文件放入移植的工程当中。
2.最好是新建一个文件夹专门存储这些文件。
3.不建议移植STM32系统文件,可以将系统的头文件改成移植工程当中的系统文件。如果有哪些东西缺失,单独用宏定义添加。
步骤二:
1.在keil当中添加这些文件,并且添加.h文件的路径
步骤三
1.处理头文件及软件版本匹配的问题
2.尽量利用宏定义,把一些移植后没有定义的量写在一个文件里面。
三,如何调试?
不要对别人的程序盲目的信任,可能会爆出很多的错误。如果错误过多,需要重新调试。
1.将代码功能模块单独拆下来,单独进行实验,尤其是在出现大量错误的时候。
2.一段程序的移植可能涉及以下方面
时钟
中断系统
GPIO管脚的配置
四,例子
比如我想用OLED液晶显示器,它的一些编程可以从商家那里得到。
打开目录下的工程文件。发现该工程中运用的是STM32f103C8,而我的单片机也正是这个。
但是,不要高兴太早。我想新建一个工程,然后把有用的文件放到工程当中。
这是我的工程模板,有了这个模板,以后就不用新建工程,直接复制粘贴到新的地方就可以使用了
1.接下来开始移植操作,先要找到我们要移植哪些文件。从商家给的工程里面的main.c所调用的头文件中判断。
在分别从这几个头文件的.c文件当中看看还需要什么文件。
把这些.c和.h文件一起拷贝到你的工程当中
这里我拷贝了delay.h,delay.c,sys.c,sys.h,oled.c,oled.h,bmp.h,oledfont.h,usart.c,usart.h
我没有拷贝系统文件,我也不建议拷贝系统文件,因为很可能会出现大量重复定义的东西,尤其是你所用的固件库的版本和商家给的工程文件的固件库版本不一致的时候。如果出现了问题,咱们再处理。
2.打开我们的工程添加这些文件
还要添加头文件的目录
3.打开商家的工程,把main.c里的语句拷过来试试。
编译一下,发现错误
4.这个错误出在了系统文件里面,不建议修改系统文件。这个错误很可能是版本不兼容所致。
我们需要反过来看看,哪个文件调用了系统文件。打开所有移植过来的文件。
经过查找,发现sys.h当中,调用了"stm32f10x.h"这个系统文件,但是这个系统文件不是我的程序这个版本所需要的。我们原来工程当中的系统文件是stm32f10x_lib.h,索性直接让sys.h调用这个stm32f10x_lib.h文件
5.再次,编译。
还是有错误,这次错误更新了。
User\OLED\delay.c(61): error: #20: identifier “SystemCoreClock” is undefined
User\OLED\delay.c(121): error: #20: identifier “SysTick_CTRL_ENABLE_Msk” is undefined
User\OLED\delay.c(141): error: #20: identifier “SysTick_CTRL_ENABLE_Msk” is undefined
这些错误统统都出来了delay.c文件上。这个也是版本兼容的问题,我的工程当中调用的固件库里面,无法识别SystemCoreClock及SysTick_CTRL_ENABLE_Msk,我们需要知道它们是什么意思。前者代表系统时钟,后者代表systick使能。
如果你愿意花费时间去翻阅固件库手册修改这两个内容的话也可以,但是我建议直接自己别写一个类似的文件,方便以后的工程移植。因为delay.c的内容基本是一致的:利用systick进行ms或者us的延迟。这个自己编写出来并不困难。所以我直接把这个文件删了,自己编写了一个,需要保证函数名和函数功能一致即可。
6.再次编译,还是报错
User\OLED\usart.c(109): error: #20: identifier “USART1_IRQn” is undefined
是这句话有误:NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
这个是在NVIC当中的错误,也是版本兼容的问题,我的版本当中没有这个宏。
在上下文找到我们版本下的USART1的通道的表达形式,并将其复制回来。
再次编译,发现有些函数重复定义了,我们根据情况把函数内容合并就可以了。
注意,要注释掉stm32f10x_t.c下的使用到的中断函数。
7.编译后,还是有错误,耐心一点,成功就在前方。
这些错误,都是与USART有关的,其实我们前面就应该注意到,我们移植的时候还要加入相关官方的功能性.c文件,比如这里的stm32f10x_usart.c,是因为这个文件没加所以才引起的错误。这个错误在一开始就需要避免,你加入了什么功能,就需要用到什么样的文件。
再次编译,就没有错误了,希望大家能从这次演示当中学得一些有用的技巧。