繁体   English   中英

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

[英]Code porting from Arduino to stm32f100 using STM32Cube IDE

我有一个 Arduino 草图,可以在我的 Arduino Mega 2560 上完美运行,但我应该将该代码从 Arduino IDE 移植到 STM32Cube IDE(基于 Eclipse),因为我的项目必须使用 stm32f100。 我是 stm32 世界的新手,而不是使用基于 Eclipse 的 IDE 的老手,所以就像我不知道在我的 stm32 上使用 Arduino 代码的最佳方法是什么。 考虑到我在 Arduino IDE 上使用 theese 2 库: https ://github.com/olikraus/u8g2 来驱动我的液晶显示器; 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);
}

接下来尝试一些 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.read()Serial.print()例程都在幕后使用中断。 如果您切换到 STM32CubeMX - 使用 HAL 或 LL(低级)接口 - 您将需要自己处理中断。

我怎么强调学习中断的重要性都不为过。 谷歌是你的朋友。

计时器

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

多任务和并发

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

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

HAL 还是 LL 接口?

您提到您计划在帖子中使用 HAL 接口。 在适当的时候,您可能会发现低级 (LL) 驱动程序对于某些外围设备(例如 UART)更加通用。 无论您为特定外围设备使用哪种接口,请记住,您不应将两者混合用于同一外围设备。 即,如果您使用 HAL 库初始化外围设备,则不要尝试在程序稍后使用 LL 函数与该外围设备进行交互。 一旦为外围设备选择了接口,请在整个代码中坚持使用它。

调试经验

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

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

备择方案

如果以上所有内容听起来工作量太大 - 或者学习曲线太陡峭 - 您可以按照评论中的建议查看STM32duino 我没有这方面的经验,所以无法发表评论。

使用 stm32duino。 您将能够大量使用现有代码。 要避免的事情是,例如通过直接写入 io 寄存器来进行低级端口操作。 而是编写您的代码,以便在 AVR 和 stm32 上编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM