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

标签 c++ c arduino libraries stm32

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

最佳答案

尽管我还没有使用过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接口(interface)通过UART发送字节

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

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

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

中断

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

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

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

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

我不能足够强调学习中断的重要性。 Google是您的 friend 。

计时器

微 Controller 最有用的功能之一就是其硬件计时器。您还将希望在适当的时候了解这些。与中断结合使用,它们可用于多种用途。

多任务和并发

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

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

HAL或LL接口(interface)?

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

调试经验

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

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

备择方案

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

关于c++ - 使用STM32Cube IDE将代码从Arduino移植到stm32f100,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56695786/

相关文章:

c - 如何从条目中获取用户输入? GTK 4C

c - freopen 用于在定向到文件后将输出重定向回标准输出

arduino - 使用 Arduino Wifi 客户端发送可靠的 HTTP 请求

c++ - 为什么 windows.h 禁用包警告?

c++ - 为什么我不能使用指针和长度创建 vector

c++ - 逐字节读取二进制 istream

c - 意外的 ./用 C 编码时的输出

arduino - 有没有办法处理 AVR/Arduino 微 Controller 中的堆内存碎片?

JavaScript/网络开发 : Why do you need a server to connect to hardware?

c++ - 这个复制赋值操作安全吗?