用于 IO 和 SERCOM 的引脚寻址(ARM SAM D 系列)

Posted

技术标签:

【中文标题】用于 IO 和 SERCOM 的引脚寻址(ARM SAM D 系列)【英文标题】:Pin addressing (ARM SAM D series) for IO and SERCOM 【发布时间】:2016-07-15 03:56:27 【问题描述】:

不确定我是否找错地方了,但我很难找到一些分步代码,这些代码显示了如何操作引脚 IO,以及控制 I2C、SPI 和 USART。

挖掘互联网,我确实找到了 2 个使用 Atmel studio 7 显示引脚上的 IO 以打开 LED 的示例

#include <asf.h>

#define F_CPU sysclk_get_cpu_hz()
#define __DELAY_CYCLE_INTRINSICS__

int main (void)

    board_init();
    PORT ->Group[0].DIRSET.reg = PORT_PA10;
    while (1)
    
        PORT ->Group[0].OUTSET.reg = PORT_PA10;
    

在另一个示例中,打开引脚的相同操作以完全不同的方式完成,具有额外的延迟以使 LED 闪烁。我记得这是“ASF”,Atmel API 用来简化事情。

#include <asf.h>

int main (void)

    system_init();
    delay_init();

    while(true)
    
        delay_ms(250);
        port_pin_set_output_level(LED_PIN, LED_ACTIVE);
        delay_ms(250);
        port_pin_set_output_level(LED_PIN, LED_INACTIVE);

    

这一切都很棒;我确实对如何做事有所了解;但我现在想使用 SERCOM 与其他具有 USART、I2C 和 SPI 的设备进行通信。对于这种用法,我很难获得一个清晰的逐步示例。

我确实尝试过自己进行实验,但现在我需要一些东西来学习,无论是书籍、教程还是视频。也许我找不到一些文档,因为我在寻找特定芯片的示例?但并非所有 ARM 芯片都以相同的方式工作,使用相同的代码,所以我很迷茫……作为 ARM 编程的初学者也无济于事。

【问题讨论】:

你可以试试 Atmel Start (start.atmel.com)。使用您的目标设备创建一个项目,添加您需要的功能(pinmux 一点),然后将其导出。这应该为您提供所需的库代码,以及一些示例函数来向您展示如何使用它。那里还有完整的示例,您可以下载和使用。 请注意,这是关于微控制器外围设备,而不是 CPU 内核,因此它实际上与 ARM 无关,与 Atmel 无关(例如,我认为他们的一些外围模块可能很常见到基于 ARM 和基于 AVR32 的部分)。 @IvarBonsaksen:有一些例子,但它们令人困惑。大多数时候,API 都有很好的示例,但在 Atmel 的情况下,他们在文档方面做得很好,但是对于示例,它们在评估板上有很多相关性,这在某些方面有所不同。我希望看到一个清晰的示例,您可以从头开始,但我只找到了一个显示如何为 LED 启用引脚的示例。 @Notlikethat:我部分同意,因为根据我的调查,在 ARM 芯片上运行代码有不同的方法:一种是通过直接操作寄存器,另一种是通过 Atmel API图书馆,这应该有助于这项工作并创建一个共同的入口点来驱动他们的大部分产品。遗憾的是,示例很少,它们没有明确的方法来展示如何从芯片开始,如何为各种串行连接分配引脚,以及如何与设备通信。这一切都以某种方式解释,但不清楚:( 关键在于,在“直接操作寄存器”中,有问题的寄存器是 Atmel 设计的外围设备的一部分,仅在 Atmel 部件中可用(除非它可能是许可的第 3 方 IP 块来自 Synopsys 之类的公司)。无论哪种方式,由于您正在编写 C 代码,因此进行这些外围设备访问的 CPU 内核的体系结构不会产生盲目的差异 - 尝试寻找一般的“ARM”资源可能最终会比它更令人困惑有帮助... 【参考方案1】:

嗯,Atmel 是我最喜欢的制造商之一,因为他们的开发工具免费、全面且文档齐全。我特别喜欢他们的 API,因为它使用起来简单灵活。 大多数时候,API 是最好的解决方案(例如,实现您自己的 USB 驱动程序/堆栈非常困难)。不过,我知道在某些情况下您不想使用 API,但这仍然是一个很好的起点。

我建议您在 Atmel Studio 中创建一个示例项目(文件/新建/示例项目)。然后,您可以复制并粘贴您需要的位(您不会侵犯许可证,因为您仍在使用 Atmel 部件)。例如,有一个“SAM SERCOM USART 驱动程序的快速入门”。

如果您想要有关 API 的文档,只需单击 ASF 资源管理器中的 API 文档即可。例如,SAMD21 的 SERCOM USART 记录在 here 和 here。

【讨论】:

好吧,我并不是不想使用他们的 API,我想使用一些快速学习并且有大量示例的东西。如前所述,我花了数周时间才找到一个关于如何使用大头针的清晰示例。 Atmel 很棒,因为它有免费的工具和大量的 API,但是如果你是新手,并且不使用评估板,事情会很快变得复杂。我确实从示例开始;他们使用他们的评估板。对于评估板,我可以按照引脚定义标题指定的方式连接我的芯片,但首先我必须了解我在做什么;这就是文档和示例中缺少的桥梁。 我确实检查了包含引脚定义的标题,并从那里开始,但后来我被卡住了,因为 Atmel.com 上的应用程序文档中的内容与我在示例中看到的不同.如果您查看不同的来源,即使是串行示例也是一团糟。如果在 Atmel 网站上有,IT 会容易得多;一个“0 级”教程,向您展示如何连接裸芯片,如何启用串行、I2C 和 SPI 引脚,然后显示示例“hello world”,所有这些都使用相同的编码方法,并且保持一致。我花在寻找上的时间越多,我编写的代码就越少。 我编辑了我的帖子以包含 SERCOM USART 文档的链接。在那里,他们逐步解释了如何使用 API。我认为唯一的困难在于引脚分配,您需要在头文件中挖掘以找到看起来像 PINMUX_PA22C_SERCOM3_PAD0 的宏。

以上是关于用于 IO 和 SERCOM 的引脚寻址(ARM SAM D 系列)的主要内容,如果未能解决你的问题,请参考以下文章

ARM裸机开发:蜂鸣器实验

51单片机中DS1302芯片的引脚配置原理是啥?

基础原理 | 善用数据手册

ARM芯片学习(S5PV210开发)——GPIO控制LED

stm32的引脚注意!!!

m283屏幕花屏问题