使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数
中间由于一直在忙一些项目,所以已经有一段时间没有更新博客了。这次接着上次的话题来继续探讨用VS开发STM32的一些问题,上次是基于stm32f1来说明如何建立一个新的32工程,不清楚的可以先看一下这个:
https://blog.****.net/Chen_Shaiyin/article/details/96706433
本次我建立的是stm32f4工程,因为手里面正好在用F401的板子,所以就直接拿现成的来用了。不管用的是F4还是F1的板子,建立固件库工程都是一样的。
我在建立完F4的工程时发现了一些问题
可以看到输出说明asm未定义,我们可以将asm("nop")改为__asm("nop"),需要注意的是这里asm前面有两个下划线。
一切准备工作没问题后,例程文件如下图所示:
接下来开始将Delay()函数换成delay_ms()函数。首先随便找到一个MDK5的工程,找到里面的delay文件夹和sys文件夹,将文件夹拷贝到我们的建立的VS工程里。
delay文件夹里有两个文件,一个源文件和一个头文件,同样sys文件夹内有类似的两个文件。
拷贝路径可以自己选择,我拷贝到了工程文件夹下的VisualGDB文件夹中
然后将delay和sys文件夹内的源文件加工程中,并把头文件包含进去。
可以在解决方案资源管理器中新建一个分组,右键解决方案-》添加-》新建筛选器,这里我们可以仿照MDK5将名字改为SYSTEM
右键SYSTEM-》添加-》现有项,然后找到自己复制到工程中的delay和sys文件夹,将delay.c和sys.c文件添加进去
点击“添加”即可,添加完之后就会有delay.c和sys.c如下图所示:
我们可以看到错误比较多,那是因为没有将头文件的路径包含进去。
点击菜单栏的项目-》VisualGDB Project Properties,或者是右键解决方案-》VisualGDB Project Properties。
找到MSBuild settings,在Include directoris中将我们的头文件包含进去
点击绿色的+号将头文件的路径添加进去。具体怎么找,应该都有过MDK5的经验,在这里就不在这里罗嗦了:
注意要将sys.h和delay.h都要包含进去。添加完之后一步步点击OK就行啦。
点击“Apply”,然后点击“OK”
可以看到,delay.c文件中的报错信息消失
然后我们打开sys.h头文件,载文件中再包含misc.h,如下图所示:
打开sys.c文件,可以看到一些汇编指令存在错误,如果现在生成解决方案的画会出现错误信息:
error : expected '(' before 'void'
如下图所示:
将这些指令进行修改即可,例如:
__asm void WFI_SET(void)
{
WFI;
}
改为下面的这种格式:
void WFI_SET(void)
{
__asm volatile("WFI");
}
将所有的更改之后如下图所示
现在可以点击F7,生成解决方案,输出串口提示没有错误。
到此为止,我们的文件就正式的移植完毕。
接下来就可以再main函数所在的文件中添加上:
#include “delay.h”
并在main函数中进行延时函数初始化:
delay_init(84); //如果使用的是F1的板子,初始化函数中不需要参数。
初始化完成后,就可以将原来的自动生成的Delay()函数改为移植好的delay_ms()函数:
点击F5运行程序:
其实当我们真正理解了STM32这些库的内在联系之后,每个人都可以成功移植。本文旨在为大家指明一些方向。希望大家在移植时出现问题时要善于独立的解决,以后出现类似的问题才不会束手无策。其实看完这篇文章之后,可以去试着移植一些其他的东西到工程中。
VS中的printf函数直接移植过来之后并不能直接向串口发送数据,有兴趣的可以写一个自己的printf函数来试试。或者试试不自己写的话能不能解决这个移植问题。当然我是写过自己的printf函数的,也将MDK5中的printf函数进行了成功的移植,以后的博文有空我会再为大家讲解,其实并没有那么难,只是一个串口发送函数而已。