一板网电子技术论坛

天南地北客
发表于: 2015-11-3 09:09:55 | 显示全部楼层

stm32nucelo-gcc-eclipse-toolchain.jpg

最近我手里得到了意法半导体的一个新的开发板:STM32Nucleo。该开发板基于STM32单片机,并且引脚兼容Arduino UNO。也就是说可以使用适用于Arduino的数百个扩展板。然而这仅在理论上是可行的,因为Arduino世界里最重要的方面是软件(基于库、例程等),来组成这个受欢迎的平台。

有很多关于如何基于STM32平台开始编程的教程和指南。ST提供了一个官方的框架,叫做STM32Cube,生来就是为了加快该平台的开发过程。STM32是一个真正强大且复杂的平台,并且该控制器的学习曲线可以和Atmel AVR类似的简单平台相比较(Arduino不过是围绕AVR系列的一个巨大的代码样板而已)。但是STM32Cube不足以开始开发你的Nucleo板。你也需要一个IDE(不是严格必须的,但是会很有用)和编译器套件。ST仅提供支持(包含文档和例程)商业化的IDE,如IAR。如果你想简单地尝试一个低成本的平台,如NUCLEO板(成本低于€15),这会是一个很大的问题。好消息是,你并不需要一个5.000美元的IDE:你需要的是Eclipse和GCC(加上我们将在本系列的下部分看到的一些其他的工具)。坏消息是,并不能简单而快速的建立一个工作开发环境。

我花了两个周末的时间来在STM32 Nucleo板设置编写代码、编译、Flash下载和调试应用程序的工作环境,解决了几个错误,然后才建立起一个完好工作的环境。在这个系列中,由三部分组成,我想分享如何建立STM32平台的开发环境。在这第一篇文章的最后,我们将能够编译NUCLEO的示例程序(一个简单的LED闪烁程序 - 电子学的“Hello World”),并且使用ST的ST-Link Utility工具上传至NUCLEO板。现在我不会给你太多的细节(但是我会认为你知道C语言和单片机编程的基础知识)。要设置工具链,我们将使用这两个基本工具:

Eclipse:它是一个流行的免费开源IDE,广泛应用在Java世界,同时也可用于C/ C++编程。我们将使用最新的稳定版本:4.4(叫做Luna)。

GCC for ARM-Cortex:STM32是基于ARM的Cortex内核(M0,M3,M4等)的微控制器家族。这意味着我们可以用最好的编译器之一(或者,也许是最好的),可以免费获得。我们将使用ARM的Cortex平台的交叉编译器版本。


该系列教程提到的系统和硬件需求最低是:

■  Windows SP SP3 32位(整个系列都是基于XP系统,但是我认为在Vista和Win7系统也可以使用。对于64位的平台,请选择相应的安装包)。

■  一个STM32 NUCLEO开发板(具体的型号无关)- 我的例程是基于STM32Nucleo-F401RE板。

■  Java 7.17或者更高版本,在安装其他软件之前(可以在本页面下载),请确保安装有最新版本的Java7;不要说我没提醒过你。


安装Eclipse Luna

第一步安装Eclipse。实际上,Eclipse并不是开始使用NUCLEO板编程的很必要的条件。GCC和其他一些工具足以编译和Flash编程MCU。如果你属于那类只喜欢用Vim编辑器写代码的人(像我一样),那么我将在下篇文章介绍这个主题。在这个系列中,我会尽量保持较低的学习曲线,所以我选择使用Eclipse IDE。本教程基于Eclipse的最新版本,叫做Luna(4.4)。你也可以在本页面下载“Eclipse IDE for C/C++ Developers"的release版本。该版本主要为使用C/C++编程语言开发应用程序而设计。

Schermata.png

下载的文件仅仅是一个ZIP的压缩包。你可以解压到C:\STM32 Toolchain目录(注意:路径并不是强制的,但是我假设在这些教程中你将整个工具链安装在该目录,如果你决定将工具链安装在其他路径,请随后改写我的指令)。安装完成后,你可以启动可执行文件C:\STM32Toolchain\eclipse\eclipse.exe。Eclipse第一次启动时,它会向你询问默认的项目文件夹。我建议使用路径C:\STM32Toolchain\projects。当IDE启动后,跳转到Help->Install New Software...。

Schermata-2014-12-20-alle-17.28.28.png

下一步,选择C/C++开发工具库,并且仅勾选“CDT Main Feature”条目,如下图所示:

Schermata-2014-12-20-alle-17.34.29.png

现在,点击“Next”,并按照说明进行操作。安装需要一段时间来完成。最后根据要求重新启动IDE。


安装GNU ARM plug-ins for Eclipse

现在我们要安装GNU ARM plug-ins for Eclipse。这些接插件向Eclipse CDT添加了丰富的功能,并集成到GCC ARM 工具链接口。此外,它们还为STM32平台提供了特定功能。插件是由Liviu Ionescu开发和维护,在提供GCC ARM工具链的支持上工作非常出色。如果没有这些插件,几乎不可能使用Eclipse在STM32平台开发和运行代码。要安装GCC ARM插件,转到Help->Install New Software...,然后单击“Add...”按钮。使用以下方式填写文本字段:

名称:GNU ARM Eclipse Plug-ins

路径:http://gnuarmeclipse.sourceforge.net/updates

然后点击“OK”按钮。一段时间后,将显示可用插件的完整列表。选择需要安装的插件,如下图所示:

Schermata-2014-12-20-alle-17.44.45.png

然后,单击“Next”,并按照说明进行操作。当要求时,重新启动IDE。


安装GCC ARM工具链

下一步安装ARM Coretex平台的GCC工具链。你可以从这个网站为你的操作系统下载一个预生成版本。我成功地测试了4.8-2014-q3-update版本。你可以下载该安装程序,并开始进行安装。当被询问时,安装工具链到目录: C:\STM32Toolchain\gnu-arm\4.8-2014q3(就像我之前说的,你可选择你想要安装的路径,但是在接下来的步骤我假设安装在该路径)。重要提示:我强烈建议不要勾选条目“Add path to environment variable”,特别是你在PC端液晶安装有其他的编译器或者IDE(例如,如果你使用MinGW或者相似的Windows包管理器)。现在继续下一步。


安装生成工具

历史上的Windows缺少一些UNIX世界必不可少的工具。其中之一就是make,该工具由Richard Stallman制作,控制使用C/C++编写的程序的编译过程。如果你已经安装了像MinGW或者其他类似的产品,可以跳过这个步骤。如果没有安装,你可以安装GCC ARM plug-ins for Eclipse同一作者制作的生成工具包。你可以在这里下载安装程序。当询问时,将这些工具安装到文件夹: C:\STM32Toolchain\Build Tools。重启Eclipse。


安装STM32 Nucleo板的ST LINK驱动

这是一个非常重要的一步。请注意以下的操作。在安装其他软件之前,最好先安装STM32Nucleo板的驱动程序。

NUCLEO板的主要特点之一是它已经提供了STM32 MCU的片上编程器:ST-Link。事实上,Nucleo板是由两部分组成:ST-Link编程器(带有USB接口)和目标板(带有Arduino形式的扩展插头)。

nucleo.png

需要强调的是和商业ST-Link编程器不同的是,Nucleo板提供了版本较新的ST-Link:2.1版本。也就是说,即使你已经有一个ST-Link编程器,你也需要更新驱动程序。可以在这里下载最新的驱动程序。安装驱动程序,检查一切是否工作正常。如果连接Nucleo板到PC,你应该看到两个新的外设:ST-Link编程器和一个虚拟串口。如果一切工作正常,可以继续下一步。


安装STM32CubeMX和ST-Link Utility

当STM32 MCU启动时,需要硬件配置才能正常工作。该配置取决于特定的MCU及所选择的硬件的配置。当CPU启动时必须先执行该配置。不幸的是,这并不是一项简单的任务,它需要具体MCU的深入了解。但是,我们有一项更快捷的方式来完成这项工作。ST为我们提供了一个专门生成初始化代码的工具。这个工具叫做STM32CubeMX,而且在这个系列教程的下一部分会非常有用。那么,你可以在这里下载该工具。根据建议的配置进行安装。

为了简化教程中的这部分,我们没有使用Eclipse IDE里的任何调试工具。而是使用官方的ST-Link Utility工具编程Nucleo板。你可以在这里下载该工具。使用建议的配置进行安装。

ST-Link安装完成后,将Nucleo板连接到PC,检查ST-Link Utility是否检测到该Nucleo板。

跳转到指定楼层
天南地北客
发表于: 2015-11-9 14:01:26 | 显示全部楼层

创建一个测试工程

好了,我们已经做了大量的准备工作。现在我们要检查一下所有的是否工作正常。我们将使用前面安装的Eclipse插件创建一个测试工程(一个简单的Led闪烁应用程序)。

首先,启动Eclipse,然后转到File->New->C Project。如果你有一个STM32Nucleo-F4板,那么你可以使用以下的配置选项。否则,你要根据你的Nucleo处理器系列进行调整。你可以填写自己想要的工程名称(我填写的是“test1”)。点击“Next”。

Schermata-2014-12-20-alle-18.58.16.png

下一步你要根据Nucleo板设置正确的芯片系列。对于Nucleo-F401RE板,正确的系列是STM32F401xE。重要提示:注意选择正确的芯片系列,否则测试例程可能无法工作。设置其他的配置参数,如下图所示:

Schermata-2014-12-20-alle-19.02.42.png

点击“Next”。在接下来的步骤你可以保留默认参数。最后一步是有关GCC工具链的。可以使用这些值:

工具链名称:GNU Tools for ARM Embedded Processors (arm-none-eabi-gcc)

工具链路径:C:\STM32Toolchain\gnu-arm\4.8-2014q3\bin

点击“Finish”。

现在,如果这是你第一次接触到Eclipse IDE,你可能会对它的界面有点小惊讶。Eclipse是一个多窗口的IDE,并且窗口可以被组织成几个称为透视图的组,在Eclipse它们被称为gibberish。介绍Eclipse如何工作超出了本篇文章的目标。我建议你使用下图用红色标识的按钮。

Schermata-2014-12-20-alle-22.16.28.jpg

经过几次点击后,你应该获得一个类似下图所示的界面。

Schermata-2014-12-20-alle-22.22.50.png


编译测试工程

在我们可以编译测试工程之前,需要完成一些其他的步骤。但是,让我们开始熟悉IDE,并且尝试编译该项目。转到“Project->Build all"。几秒钟后,在编译器控制台将会出现错误信息:

Schermata-2014-12-20-alle-22.26.36.png

该信息只是意味着IDE无法找到用于编译源文件的make.exe程序。如果你还记得,我们已经在前面的步骤安装了生成工具。现在我们需要设置生辰工具的正确路径。转到Window->Preference。将会显示Eclipse的首选项窗口。转到C/C++->Build->Environment,然后点击“Add”。

Schermata-2014-12-20-alle-22.26.36.png

在”Name“栏输入字符串Path,然后在Value栏输入 C:\STM32Toolchain\Build Tools;${Path} 。首先点击”OK“,再点击“Apply”,最后再点击“OK”。然后转到Project->Build all重新开始编译。这次的编译时间会长一些。最后再编译器控制台会出现此信息:

Schermata-2014-12-20-alle-22.37.36.png

好了。我们已经成功编译了基于Nucleo板的测试项目。


下载二进制文件到STM32 Nucleo的MCU

我们使用ST-Link Utility将二进制镜像文件上载到Nucleo的MCU。连接Nucleo板到PC。启动ST-Link Utility,然后转到Target->Connect。LD1发光二极管(靠近mini-USB接口)将开始绿色/红色闪烁,并且ST-Link Utility将会显示Nucleo芯片的信息。现在,我们可以上传二进制镜像文件了,转到Target->Program&Verify...。出现选择文件窗口。转到 C:\STM32Toolchain\projects\test1\Debug并选中test1.hex文件。将会显示一下窗口:

Schermata-2014-12-20-alle-22.46.08.png

点击“Start”。几秒钟后,上载完成。成功编程了Nucleo板。


根据Nucleo板改写测试代码

好了,停下来。你的板子没有损坏。绿灯(PCB标识为LD2)没有闪烁,因为我们需要做一些其他的配置步骤。还记得STM32CubeMX么?现在是时候使用它了。

GNU ARM for Eclipse生成的模板代码设计的目的并不是在Nucleo板运行,而是在更流行的STM32 Discovery平台运行。所以我们需要改写代码使得能够在Nucleo板上正常工作。基本上我们需要修改两件事情:LED LD2连接的MCU引脚( 在Nucleo板,它被映射到不同的引脚)和正确的晶振配置。我们的Nucleo板(STM32Nucleo-F401RE)没有提供外部晶振,我们需要使用内部晶振,允许MCU运行最高仅84Mhz(太神奇了)。你应该检查Nucleo板的正确配置,因为其中一些会提供外部晶振。但是,使用我将要展示的解决方案,我们将可以正确设置每个Nucleo板。STN32CubeMX可以派上用场来解决这个任务。

启动STM32CubeMX,然后转到“New Project”。点击“Board Selection”选项卡。在“Type Of Board”选择Nucleo。在“MCU Series”下拉列表选择你的Nucleo目标MCU。下一步在“Peripheral Selection”列表的Led和Button行添加1。在“Board List”表格中,选择正确的Nucleo版本。

Schermata-2014-12-21-alle-07.28.23.png

点击“OK”。CubeMX将会显示你的目标MCU以及它的配置信息。

Schermata-2014-12-21-alle-07.29.47.png

描述CubeMX软件并不在本教程的目标内。我将会在下篇文章详细介绍该工具。我们只是使用该工具生成正确的时钟配置。进入“Projcet->Generate Code”,并填写空白字段,如下图所示:

Schermata-2014-12-21-alle-07.33.10.png

单击“OK”按钮。CubeMX将会询问我们是否需要下载STM32Cube框架的最新版本。在我们的例子中,可以选择“NO”,因为GNU ARM插件已经提供了最新版本的框架。在下一个消息框点击“Continue”。当生成结束后,点击“Open Folder”,并进入“src”文件夹。打开“main.c”,并复制函数SystemClock_Config(void)的全部内容。如果你有和我一样的Nucleo板,产生的代码和这个一样。

  1.   RCC_OscInitTypeDef RCC_OscInitStruct;
  2.   RCC_ClkInitTypeDef RCC_ClkInitStruct;

  3.   __PWR_CLK_ENABLE();

  4.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);

  5.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  6.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  7.   RCC_OscInitStruct.HSICalibrationValue = 6;
  8.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  9.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  10.   RCC_OscInitStruct.PLL.PLLM = 16;
  11.   RCC_OscInitStruct.PLL.PLLN = 336;
  12.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
  13.   RCC_OscInitStruct.PLL.PLLQ = 7;
  14.   HAL_RCC_OscConfig(&RCC_OscInitStruct);

  15.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;
  16.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  17.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  18.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  19.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  20.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
复制代码

该代码是我们的Nucleo板的系统时钟的正确配置。正如你看到的,STM32 MCU有不同寻常的时钟配置。CubeMX大大简化了这一步。允许我们专注于应用程序的开发。将生成的代码复制到SystemClock_Config()函数中。现在,返回到Eclipse,打开“src”文件夹下的_initialize_hardware.c文件。使用我们刚才复制的代码替换configure_system_clock(void) 函数的全部内容。现在跳转到“include”文件夹,并编辑BlinkLed.h文件。转到第30行,使用以下方式修改LED端口配置。

  1. #define BLINK_PORT_NUMBER               (0)
  2. #define BLINK_PIN_NUMBER                (5)
  3. #define BLINK_ACTIVE_LOW                (0)
复制代码

通过使用这种方式,我们将使用LED LD2连接的A5引脚。保存所有修改过的文件(请注意保存所有文件,因为Eclipse不会自动保存),并且重新编译该工程。现在我们可以再次使用ST-Link Utility编程Nucleo。LED LD2终于闪烁了。:-)

任务完成。我们成功编程Nucleo板。在接下来的文章我将介绍如何使用Eclipse编程MCU及一步步的进行调试。敬请关注!




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 35 | 回复: 53



手机版|

GMT+8, 2019-12-13 18:43 , Processed in 0.140623 second(s), 31 queries . Powered by Discuz! X3.4

YiBoard一板网 © 2015-2018 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表