1 c c++ arduino stm32 libraries
我有一个 Arduino 草图,可以在我的 Arduino Mega 2560 上完美运行,但我应该将该代码从 Arduino IDE 移植到 STM32Cube IDE(基于 eclipse),因为我的项目必须使用 stm32f100。我是 stm32 世界的新手,而不是使用基于 Eclipse 的 IDE 的老手,所以我不知道在我的 stm32 上使用 Arduino 代码的最佳方法是什么。考虑到我在 Arduino IDE 上使用了这 2 个库:https : //github.com/olikraus/u8g2用于驱动我的 lcd; https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino对于 modbus 协议。我需要帮助来了解将代码从 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);
}
Run Code Online (Sandbox Code Playgroud)
接下来尝试一些 UART 通信。我个人更喜欢为此使用低级库 - 因为它为接收串行数据提供了更多的控制。例如,使用 LL 接口通过 UART 发送一个字节,看起来像
while (1) {
HAL_Delay(500);
HAL_GPIO_TogglePin(MyLED_Port, MyLED_Pin);
}
Run Code Online (Sandbox Code Playgroud)
请注意,LL_USART
如果您已经使用 LL 接口初始化了 USART 外设,则您应该只在代码中使用例程。如果使用 HAL 接口对其进行初始化,则应在整个代码中仅使用 HAL 例程。您可能会发现从 HAL 库开始更容易。
顺便说一句......一些STM32开发板通过USB端口提供串行通信 - 这对于原型设计和调试非常有用。
您将需要了解中断 - 如果您还没有这样做的话。例如,这对于 UART/串行通信可能很重要。
解释为什么中断在串行通信中很重要......
假设一个字节到达您的 UART 缓冲区,并且您在下一个字节到达之前没有读取它。在这种情况下,您将遇到 UART 溢出错误(将在相关外设的状态寄存器中设置特定标志)。缓解这种情况的最佳方法之一是使用 UART 接收中断 - 并写入该中断内的循环缓冲区。
Arduino 库会自动为您处理。例如,它Serial.read()
和Serial.print()
例程都在幕后使用中断。如果您切换到 STM32CubeMX - 使用 HAL 或 LL(低级)接口 - 您将需要自己处理中断。
我再怎么强调学习中断的重要性都不为过。谷歌是你的朋友。
微控制器最有用的功能之一是它们的硬件定时器。您还将希望在适当的时候了解这些。结合中断,它们可以用于各种各样的事情。
除非您打算使用诸如 FreeRTOS 之类的 RTOS(我不确定您的 STM32F100 设备是否有足够的内存),否则您需要考虑如何处理多项任务 - 如果您有多个任务。理想情况下,您不希望您的任何任务被“阻塞”。将您的任务实现为状态机是实现这一目标的一种方法。
您可能已经在您的 Arduino 代码中执行了此操作 - 在您的loop()
函数中。无论如何,这可能是了解“超级循环架构”和状态机的好机会。
您在帖子中提到您计划使用 HAL 接口。在适当的时候,您可能会发现低级 (LL) 驱动程序对于某些外设(例如 UART)具有更多功能。无论您为特定外围设备使用哪种接口,请记住,您不应将两者混合用于同一外围设备。即,如果您使用 HAL 库初始化外设,则不要尝试在程序稍后使用 LL 函数与该外设进行交互。一旦您为外围设备选择了接口,请在整个代码中坚持使用它。
如果您使用 STM32 开发板进行原型设计,它们通常具有内置 ST-Link 设备 - 并提供开箱即用的良好调试体验。相比Arduino,其实调试体验要好很多。使用 Arduino 库,您依赖于Serial.print()
在整个代码中插入的语句。使用 Truestudio / Eclipse / STM32CubeIDE + ST-Link 设备,您就有了合适的调试器——可以插入断点、查看调用堆栈、检查局部和全局变量、特殊功能寄存器等。
因此,即使上述建议可能会造成陡峭的学习曲线,调试器至少可以使某些事情变得更容易 - 并帮助您克服出现的任何问题。
如果以上所有听起来工作量太大 - 或者学习曲线太陡峭 - 您可以按照评论中的建议查看STM32duino。我没有这方面的经验,所以不能发表评论。