如何编写一个简单的裸机程序?

How do I write a simple bare-metal program?

此处假设:假设您有一个处理器连接到某种形式的 USB 存储器和一个电机。我将如何编写一个简单的裸机程序来告诉电机移动 10 秒?我想学习如何裸机编程,有一个程序可以查看和分析会很棒。 (任何语言都很好)

1) 您必须了解相关处理器的启动方式。有核心处理器本身,然后是 non-volatile 存储。例如 raspberry pi 有点独特,因为逻辑上有一些东西(或片上 ROM?)读取 SD 卡,启动 gpu,然后 gpu 将 arm 程序复制到 ram 并释放手臂进入那只公羊。大多数微控制器都有板载闪存和内存,闪存被映射到处理器从 and/or 启动的地址 space 有一个供应商提供的引导加载程序可以启动处理器然后调用您的代码。

2) 您必须学习如何启用和初始化您喜欢使用的外围设备。一个计时器,如果你想数到 10 秒。

3) 编写应用程序。

调试是诀窍,您有时可以通过 jtag 使用硬件调试器,或者有时通过 gdb 或某些接口(如 uart)上的其他程序使用 rom 监视器。或者几乎总是可用的一个闪烁的 LED 或一个 UART 来发送文本或数字以查看发生了什么。当然还有示波器,您可以摆动 gpios 或做其他事情并在示波器上看到它们。

驱动电机太笼统了,你需要具体了解电机的类型以及如何驱动它,你直接从微控制器驱动它的可能性为零,你可能有晶体管 h 桥之外的东西或其他东西隔离微控制器,或者您有一种特定类型的电机驱动器 chip/circuit,您可以通过离散信号、i2c 或 spi 或其他方式与它通话,以告诉它驱动电机,然后可能有一些模拟来处理高功率或者该芯片可能是混合动力。所以你必须知道所有这些,或者至少你必须知道所有这些的编程方面,什么接口 and/or 什么信号必须以什么方式改变状态才能使电机做某事。它可以像您创建的在您和电机之间放大的 pwm 一样简单。 pwm 可能涉及首先学习如何弄乱其中一个定时器,然后是另一个外围设备或定时器的子集以从中产生 pwm 信号。示波器或逻辑分析仪在这里也很有用,或者如果您有另一个微控制器,您可以比生成的信号更快地对 gpio 进行采样,您可以将其变成逻辑分析仪。

从寻找电路板开始,使 LED 闪烁,弄清楚如何 运行 计时器,准确地使 LED 闪烁。弄清楚你真正 运行 正在使用的时钟速率,而不是猜测,弄清楚如何配置 uart,发送一些字符,现在你有一个调试界面,了解你的定时器参考时钟速度是多少,以及现在可以尝试数到 10 秒,然后输入电机所需的信号。估计要炸掉几块板,买一些备用的。