SAM4S 初始化步骤
Posted
技术标签:
【中文标题】SAM4S 初始化步骤【英文标题】:SAM4S initialization in baby steps 【发布时间】:2015-05-09 21:29:01 【问题描述】:这个问题可能很明显,很愚蠢,但我没有找到答案。
我正在尝试为 Atmel 的 sam4s xplained 板制作一个简单的 makefile 项目。
我是 ARM 的新手,对如何让工作正常工作感到有些迷茫。以下是我试图让 LED 工作的方法:
/* Enable clock for PIOC. */
PMC->PMC_WPMR = PMC_WPMR_WPKEY_PASSWD;
PMC->PMC_PCER0 = PMC_PCER0_PID13; /* PIOC clock enable. */
/* Enable output for LED. */
PIOC->PIO_WPMR = PIO_WPMR_WPKEY_PASSWD; /* Enable writing to registers. */
PIOC->PIO_PER = PIO_PER_P10 | PIO_PER_P17; /* Enable pio 10, 17. */
PIOC->PIO_OER = PIO_OER_P10 | PIO_OER_P17; /* Set pio10 and 17 as output. */
PIOC->PIO_SODR = PIO_SODR_P10; /* Set pio10. */
PIOC->PIO_CODR = PIO_CODR_P17; /* Clear pio17 . */
但绝对没有任何反应。我错过了什么吗?
PIOC 10 和 17 应该有用户 LED。
电路板原理图: http://www.atmel.com/webdoc/sam4s16xplained/sam4s16xplained.boardScematics.section_ggo_tyg_xf.html
【问题讨论】:
不确定 SAM,但对于大多数其他 Cortex-M MCU,时钟使能、端口方向等寄存器包含用于不同功能的单个位。所以你只需要改变这些位,而不是覆盖完整的寄存器内容。使用|=
和&= ~
(或使用相应的逻辑运算符进行正常赋值),除非您绝对确定要立即更改整个寄存器内容。否则,您可能会禁用其他(必需)外围设备的时钟。输出设置/复位寄存器通常是一个例外,因为它们在硬件中执行此操作。
另外:你能读取从寄存器写入的值吗?硬件真的执行了写入吗?
@Olaf 上面用到的寄存器都是只写的。数据表指定写入 0 无效,这就是我在上面使用它们的原因。有一个单独的“清除”寄存器用于禁用。至于阅读寄存器,我还没有让 OpenOCD 为董事会工作,所以到目前为止我一直在盲目工作,否则我会检查一下。
嗯..有趣。刚刚看了一下数据表。是的,它们似乎确实为所有寄存器提供了这些功能;不错的功能;大多数其他 ARM-MCU 仅将其用于输出寄存器。但是,您实际上可以读取寄存器的值。这只是每个四边形寄存器的另一个寄存器,称为“状态寄存器”(退后一步,看看整个画面)。实际上,有一个寄存器可以从四个相邻的地址寻址并实际编码设置/复位/读取;对于某些寄存器,例如输出数据寄存器,状态可以是:读和写。
【参考方案1】:
问题不在于代码,而在于 Atmel 用于对电路板进行编程的工具。我一直在使用 SAM-BA 系统内编程器对电路板进行编程,但由于某种原因,它未能更改闪存的内容。即使在内存视图中手动设置单曲也会失败。
我尝试了 Seggers JLink 软件并执行了以下步骤:
-
使用 Atmel Studio 6 更新板上的 JLink 驱动程序(此步骤需要 Windows)。
从 Segger 下载了适用于 Linux 的 J-Link 软件包:https://www.segger.com/jlink-software.html。
使用 JLinkExe 对开发板进行编程,如下所示:
-
确保 JP25 已断开 - 仅 sam-ba 需要。
通过 usb 与 jtag 连接器连接。
启动 JLinkExe
在 JLink 终端中执行:
JLink> device at91sam4s16c
JLink> loadbin <target.bin>, 0x400000
有时我需要在编程后重置电路板才能工作。现在也可以使用 Segger 工具进行调试。使用 JLinkGDBServer 启动 gdb 服务器并使用 arm-none-eabi-gdb 连接:
(gdb) target remote :2331
(gdb) file <target.elf>
【讨论】:
以上是关于SAM4S 初始化步骤的主要内容,如果未能解决你的问题,请参考以下文章