怎样将STM32F4xx标准外围设备库与MikroC Pro for ARM集成

2024-01-17  

STM32F4xx系列微处理器比市场上同类产品先进得多。除了是快速的32位MCU,STM32F4还具有丰富的硬件外设支持以及DSP引擎优势。就功能和价格而言,STM32F4是全胜者。最近,STM32用户社区激增。 STM32 Discovery开发板正在以前所未有的速度增长。最近,我几次收到读者关于STM32F4xx标准外设库(SPL)与MikroC Pro for ARM集成的切实询问,因此,尽管这不是我关于STM32 ARM的主流文章之一,但我还是觉得我应该解决这个话题。之前,我展示了如何通过MikroC移植STM32F1xx系列设备的STM32F1xx SPL。这篇文章与以前的文章没有什么不同-只是微小的变化。我建议读者在阅读这篇文章之前先阅读较早的帖子。


目前MikroC编译器是为数不多的尚未正式为SPL集成提供任何支持的编译器之一。希望他们将来会添加此支持,但是MikroC解决方案的方式与其他编译器不同。 MikroC拥有非常强大的IDE和丰富的库基础支持,而SPL为用户提供了对芯片硬件的更多控制权。就像我之前说过的一样,它们变成了一把双刃剑。


所需的工具

首先,您需要MikroC Pro for ARM。该编译器的演示版本提供8k代码限制,足以满足第一手ARM经验。您需要一块STM32F4xx板。我使用了STM32F407VG发现。 ST Microelectronics的该板 某种程度上是STM32F4系列的旗舰Discovery板,并且非常受欢迎。最后,您将需要我包含在示例中的STM32F4xxx SPL。修改其中的文件以使其与MikroC环境兼容。


要做的事情

首先,我们需要准备用于ARM编译器的MikroC PRO,以链接SPL。我假设编译器已预先安装。首先转到编译器的安装文件夹,然后找到 include 文件夹。就我而言,它是: C: Users Public Documents Mikroelektronika mikroC PRO for ARM Include 。

在此文件夹中,有一个名为 stdint.h的文件。将其重命名为 stdint(备份).h 并从提供的文件夹中复制新的 stdint.h 文件到这个位置。如果您在上一篇文章中已经这样做,或者已升级到MikroC Pro for ARM版本4.15(在撰写本文时为最新版本),请跳过此部分。

接下来,我们必须更改编译器的某些选项。启动编译器,并如下所示:

工具》》选项》》输出设置

检查 区分大小写 。应用并关闭此窗口。如果您之前已经做过,请再次跳过此部分。

从现在开始要谨慎命名和字母大小写,因为编译器现在对此很敏感,否则您将注定要陷入编程不幸的深渊。只是一个简单但有用的提示-在进行一些编辑或修改后,很少会编译您的代码。这将极大地帮助您调试一小段编码窗口中的微小错误。

最后将SPL保持在安全的位置。每当您使用SPL编码新项目时,都应从该位置复制该新项目并与该项目一起使用。这样可以确保原始的SPL副本不会被意外修改。

使用SPL编码

示例代码只是另一个闪烁的代码示例,可以满足要求。我不会告诉您如何在MikroC中创建新项目。我想这是众所周知的。创建一个新项目,并使用 项目管理器 添加SPL文件夹中的所有源文件和头文件。您可以仅添加所需外围设备的头文件和源文件,也可以添加所有文件(如果不确定哪个代表哪个)。前一种方法比后者花费更少的编译时间。另外,添加 defines.pld 项目级别定义文件。现在您可以使用SPL进行编码了。

请注意,由于MikroElektronika尚未正式集成SPL,因此您会注意到红色带有SPL的代码各部分下的错误标记。这并不罕见,也不是错误。所以不用担心。

代码:

#include “stm32f4xx_gpio.h” #include “stm32f4xx_usart.h” #include “stm32f4xx_rcc.h” void setup_GPIOs(); void check_LEDs(); void main() { unsigned char s = 0; setup_GPIOs(); check_LEDs(); while(1) { if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1); s++; } if(s 》= 6) { s = 0; } switch(s) { case 1: { GPIO_SetBits(GPIOD, GPIO_Pin_12); break; } case 2: { GPIO_SetBits(GPIOD, GPIO_Pin_13); break; } case 3: { GPIO_SetBits(GPIOD, GPIO_Pin_14); break; } case 4: { GPIO_SetBits(GPIOD, GPIO_Pin_15); break; } case 5: { GPIO_SetBits(GPIOD, GPIO_Pin_12); GPIO_SetBits(GPIOD, GPIO_Pin_13); GPIO_SetBits(GPIOD, GPIO_Pin_14); GPIO_SetBits(GPIOD, GPIO_Pin_15); break; } default: { break; } } Delay_ms(90); GPIO_ResetBits(GPIOD, GPIO_Pin_12); GPIO_ResetBits(GPIOD, GPIO_Pin_13); GPIO_ResetBits(GPIOD, GPIO_Pin_14); GPIO_ResetBits(GPIOD, GPIO_Pin_15); Delay_ms(90); } } void setup_GPIOs() { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); } void check_LEDs() { GPIO_SetBits(GPIOD, (GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)); Delay_ms(900); GPIO_ResetBits(GPIOD, (GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)); }



演示视频链接:https://www.youtube.com/watch?v=ngk-4Lm11yU。

我个人还没有到目前为止,我一直依赖SPL,而且我相信原始级别的编码学习。 SPL允许在STM32领域中输入教科书。难怪它使编码变得容易,但是在我看来,它的不利影响是它的用户花在参考手册和数据表上的时间更少。反过来,这将影响他们获得对内部硬件外围设备及其工作原理的扎实学习。如果SPL通过这种方式使生活变得轻松,那为什么不使用MikroC库。这些甚至更易于使用。有时图书馆是救星,而有时它们是诅咒。有时您不想重新发明“轮子”,但您当然想用它制造汽车,而我的朋友比什么都值钱。在这一点上,我不想就此事进一步辩论。我将这个选择留给用户。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。