使用STM32Cube IDE将代码从Arduino移植到stm32f100

时间:2019-06-21 01:32:29

标签: c++ c arduino libraries stm32

我有一个可以在Arduino Mega 2560上完美工作的Arduino草图,但是我应该将该代码从Arduino IDE移植到STM32Cube IDE(基于Eclipse),因为我必须在项目中使用stm32f100。我是stm32领域的新手,而不是使用基于eclipse的IDE的资深人士,所以好像我不知道在我的stm32上使用Arduino代码的最佳方法是什么。 考虑到我正在Arduino IDE上使用theese 2库: https://github.com/olikraus/u8g2用于驱动我的LCD; https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino用于modbus协议。 我需要帮助以了解将代码从Arduino移植到stm32的最佳方法是什么: 如果可能的话,这样做有多容易? 可能会更好地找到为stm32编写的不同库,并且基本上改变了我以前的代码? 考虑一下,我使用基于eclipse的IDE效果不佳,关于HAL的概念也很少。 谢谢您的帮助。

1 个答案:

答案 0 :(得分:3)

尽管我还没有使用过STM32CubeIDE,但它是-AFAIK-本质上是STM32CubeMX和Atollic Truestudio的组合。我的以下建议部分基于我的经验。

关于驱动程序...您所引用的驱动程序-用于LCD和Modbus通信-不太可能无需修改即可工作。尽管如此,如果您对这个事实不感到害怕,请继续阅读。

从简单开始

如果您以前从未为STM32编程过,那么最好先从简单的内容开始-在尝试实现或集成LCD驱动器和RS485功能之前。像他们所说的那样跑步之前先走动。

首先切换LED。

while (1) {
   HAL_Delay(500);
   HAL_GPIO_TogglePin(MyLED_Port, MyLED_Pin);
}

接下来尝试一些UART通信。我个人更喜欢为此使用低级库-因为它为接收串行数据提供了更多的控制。例如,使用LL接口通过UART发送一个字节,看起来像

uint8_t byte = 'a';
LL_USART_TransmitData8(USART2, byte);

请注意,如果您已使用LL接口初始化了USART外设,则仅应在代码中使用LL_USART例程。如果使用HAL接口对其进行了初始化,则应在整个代码中仅使用HAL例程。您可能会发现从HAL库开始更容易。

顺便说一句...某些STM32开发板通过USB端口提供串行通信-这对于原型设计和调试非常有用。

中断

您将需要了解有关中断的信息-如果您还没有这样做的话。例如,这对于UART /串行通信可能很重要。

解释为什么中断在串行通信中很重要...

想象一下,一个字节到达了您的UART缓冲区,而在下一个字节到达之前您没有读取它。在这种情况下,您将遇到UART溢出错误(将在相关外围设备的状态寄存器中设置特定标志)。减轻这种情况的最好方法之一是使用UART接收中断-并在该中断内部写入循环缓冲区。

Arduino库自动为您处理此问题。例如,其Serial.read()Serial.print()例程均在后台使用中断。如果使用HAL或LL(低级)接口切换到STM32CubeMX,则需要自己处理中断。

我不能足够强调学习中断的重要性。 Google是你的朋友。

计时器

微控制器最有用的功能之一是其硬件计时器。您还将希望在适当的时候了解这些。与中断结合使用,它们可以用于各种各样的事情。

多任务和并发性

除非计划使用FreeRTOS之类的RTOS(我不确定您的STM32F100设备是否有足够的内存),否则您需要考虑如何处理多个任务-如果您有多个任务。理想情况下,您不希望任何任务被“阻止”。将您的任务作为状态机实现是实现这一目标的一种方法。

您可能已经在Arduino代码中的loop()函数中执行了此操作。无论如何,这都是学习“超级循环体系结构”和状态机的好机会。

HAL或LL接口?

您提到打算在帖子中使用HAL界面。您可能会在适当的时候发现,对于某些外设(例如UART),低级(LL)驱动程序更加通用。无论您将哪个接口用于特定的外围设备,请记住,请勿在同一外围设备上同时使用这两种接口。也就是说,如果您使用HAL库初始化外围设备,请不要在程序的后面尝试使用LL函数与该外围设备进行交互。选择外围设备的接口后,请在整个代码中坚持使用它。

调试经验

如果您使用STM32开发板进行原型制作,则这些通常都具有内置的ST-Link设备-并提供了开箱即用的良好调试体验。与Arduino相比,事实上,调试体验好得多。使用Arduino库,您将依靠在整个代码中插入的Serial.print()语句。使用Truestudio / Eclipse / STM32CubeIDE + ST-Link设备,您将拥有一个合适的调试器-可以插入断点,查看调用堆栈,检查局部和全局变量,特殊功能寄存器等。

因此,即使以上建议可能会带来陡峭的学习曲线,但调试器至少可以使某些事情变得更容易-并且可以帮助您克服出现的任何问题。

替代项

如果以上所有听起来都太麻烦了-或学习曲线太陡了-您可以按照评论中的建议去查看STM32duino。我对此没有经验,所以无法发表评论。