使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

        中间由于一直在忙一些项目,所以已经有一段时间没有更新博客了。这次接着上次的话题来继续探讨用VS开发STM32的一些问题,上次是基于stm32f1来说明如何建立一个新的32工程,不清楚的可以先看一下这个:

https://blog.****.net/Chen_Shaiyin/article/details/96706433

本次我建立的是stm32f4工程,因为手里面正好在用F401的板子,所以就直接拿现成的来用了。不管用的是F4还是F1的板子,建立固件库工程都是一样的。

我在建立完F4的工程时发现了一些问题

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

可以看到输出说明asm未定义,我们可以将asm("nop")改为__asm("nop"),需要注意的是这里asm前面有两个下划线。

一切准备工作没问题后,例程文件如下图所示:

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

接下来开始将Delay()函数换成delay_ms()函数。首先随便找到一个MDK5的工程,找到里面的delay文件夹和sys文件夹,将文件夹拷贝到我们的建立的VS工程里。

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

delay文件夹里有两个文件,一个源文件和一个头文件,同样sys文件夹内有类似的两个文件。

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

拷贝路径可以自己选择,我拷贝到了工程文件夹下的VisualGDB文件夹中

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

 然后将delay和sys文件夹内的源文件加工程中,并把头文件包含进去。

可以在解决方案资源管理器中新建一个分组,右键解决方案-》添加-》新建筛选器,这里我们可以仿照MDK5将名字改为SYSTEM

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

右键SYSTEM-》添加-》现有项,然后找到自己复制到工程中的delay和sys文件夹,将delay.c和sys.c文件添加进去

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

 点击“添加”即可,添加完之后就会有delay.c和sys.c如下图所示:

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

 我们可以看到错误比较多,那是因为没有将头文件的路径包含进去。

点击菜单栏的项目-》VisualGDB Project Properties,或者是右键解决方案-》VisualGDB Project Properties。

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

 找到MSBuild settings,在Include directoris中将我们的头文件包含进去

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

点击绿色的+号将头文件的路径添加进去。具体怎么找,应该都有过MDK5的经验,在这里就不在这里罗嗦了:

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

注意要将sys.h和delay.h都要包含进去。添加完之后一步步点击OK就行啦。

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

点击“Apply”,然后点击“OK”

可以看到,delay.c文件中的报错信息消失

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

 然后我们打开sys.h头文件,载文件中再包含misc.h,如下图所示:

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

打开sys.c文件,可以看到一些汇编指令存在错误,如果现在生成解决方案的画会出现错误信息:

error :  expected '(' before 'void'

如下图所示:

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数将这些指令进行修改即可,例如:

__asm void WFI_SET(void)
{
     WFI;
}

改为下面的这种格式:

void WFI_SET(void)
{
    __asm volatile("WFI");
}

将所有的更改之后如下图所示

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

现在可以点击F7,生成解决方案,输出串口提示没有错误。

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

到此为止,我们的文件就正式的移植完毕。

接下来就可以再main函数所在的文件中添加上:

#include “delay.h”

并在main函数中进行延时函数初始化:

delay_init(84); //如果使用的是F1的板子,初始化函数中不需要参数。

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

初始化完成后,就可以将原来的自动生成的Delay()函数改为移植好的delay_ms()函数:

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

 点击F5运行程序:

使用Visual Studio开发STM32(四):移植MDK5中的delay_ms函数

 其实当我们真正理解了STM32这些库的内在联系之后,每个人都可以成功移植。本文旨在为大家指明一些方向。希望大家在移植时出现问题时要善于独立的解决,以后出现类似的问题才不会束手无策。其实看完这篇文章之后,可以去试着移植一些其他的东西到工程中。

VS中的printf函数直接移植过来之后并不能直接向串口发送数据,有兴趣的可以写一个自己的printf函数来试试。或者试试不自己写的话能不能解决这个移植问题。当然我是写过自己的printf函数的,也将MDK5中的printf函数进行了成功的移植,以后的博文有空我会再为大家讲解,其实并没有那么难,只是一个串口发送函数而已。