风筝
发表于: 2017-11-28 10:09:17 | 显示全部楼层

本文主要介绍Atmel ATSAMD20 XPlained Pro开发板以及如何开始上手使用。

SAMD20 Xplained Pro.png

SAM D20基于ARM Cortex-M0+内核,是Atmel发布的最新的基于闪存的微控制器之一。 有四种不同的器件系列,分别是D10、D11、D20和D21。 再加上它们的外围设置和低功耗功能,很好的补充了他们的产品线。

SAM D20运行速度最高可达48MHz。 它结合了Atmel事件系统、单周期32x32乘法器、2阶段流水线和单周期 I/O访问。 所有的器件都具有Atmel SERCOM(串行通信接口),这是一个非常灵活的串行接口,可以配置为I2C、SPI或USART。 每个接口可以通过复用分配到不同的I / O引脚,增加了器件的灵活性。 有多个16位定时器/计数器的例子,每个都可以编程来执行频率和波形生成。 它有两种睡眠模式:空闲和待机,可通过软件进行选择。


软件

Atmel Studio 6.2- 如果您有以前版本的Studio 6.x,我建议您在安装最新版本之前卸载这些版本。 我发现一个问题,从6.1(Build 2562)升级到6.2时,Atmel Software Framework(ASF)基本上会从Studio中删除。 我回去删除Studio 6.1(2562),6.0和5.0(只是为了确定),然后安装完整版本6.1(2674)。 随后ASF 3.9.1版本安装并可以使用。


硬件

如果您熟悉AVR Xplained套件,那么您知道设计这些套件是为了让设计人员能够更轻松地开始入门使用各种Atmel器件。自推出以来,可以使用的开发板数量已经扩大,主要面向ATxmega、UC3和SAM4等高端产品。和这些电路板一起,他们设计了一些附加电路板来展示如何使用安装的微控制器来实现各种传感器。在得到现场及其客户的反馈后,Atmel决定推出一款Xplained Pro主板,让用户更加方便地访问各种GPIO和外设。当然,当你这样做的时候,你必须有一些可以与这些外围器件结合的板子。因此,Atmel开发了适合Xplained Pro板的附加板。为了让您更容易,Atmel将他们的SHA204产品整合到这些新的电路板中,以便Atmel Studio能够识别哪些电路板已连接。 Atmel Studio实际上会让你知道你连接了哪个电路板,以及连接了哪个扩展板。


SAMD20 Xplained Pro开发板的主要特性

●     采用Atmel ATSAMD20J18微控制器

●     板载调试模块EDBG:

       ●     USB接口

       ●     通过串行线调试(SWD)编程和调试电路板上的SAM D20

       ●     通过串行线调试(SWD)编程和调试外部目标器件

       ●     虚拟COM端口,通过UART连接目标,四路GPIO实现代码导入

       ●     数据网关接口(DGI),通过同步UART或TWI连接目标

●     数字I/O:

       ●     两个机械按钮,用户按键和复位按键

       ●     一个用户LED指示灯

       ●     三个扩展插头

●     两种不同供电方式

       ●     外部供电

       ●     嵌入式调试器USB供电

●     32kHz晶振

SAMD20 Xplained Pro Overview.png

跳转到指定楼层
风筝
发表于: 2017-11-28 14:07:52 | 显示全部楼层

示例项目

我要在这里展示的所有例子都是使用Atmel Studio编写和编译的。如果您需要Atmel软件框架中的当前可用应用程序列表,请转至Atmel SAMD20 Pro ASF。您还可以找到有关支持的Atmel器件和开发板的ASF的更多信息。


LED指示灯闪烁示例

也许最基本的程序是闪烁一个LED。为什么这样说呢?好吧,让我们考虑一下。当你实现在一个电路板上切换LED时,究竟发生了什么?首先,你必须初始化系统。这意味着需要配置时钟并且正常运行。这意味着您已将GPIO引脚初始化为能够驱动LED的电流,并在某些情况下具有按钮输入。这也意味着你必须配置中断。可能来自按钮或计时器。如果您使用计时器(如下一个示例所示),则还需要进行初始化。基本上,运行闪烁LED程序,你必须使用芯片的一些最重要的部分。那么,让我们开始吧。


幸运的是,Atmel Studio软件中包含一个SAMD20 Xplained Pro开发板的发布版本,并且能够使用它的软件。虽然与上面显示的电路板没有明显的不同,但是在哪些地方引脚出现了一些差异。但是,就我们的目的而言,这不会有什么不同。代码有一些差异,但影响不大。一个在下面的代码块中。我认为下面的版本比更新后的版本更容易理解。如果您以前从未使用过Atmel Studio,我建议您转到“帮助”菜单下的“查看帮助”(或按CTRL-F1)并查看Atmel Stuido文件和Atmel Software Framewor文件。


所以,使用Studio 6,我选择从起始页面创建一个新的示例项目,从所有项目更改,并按套件排序。我选择了正确的ASF版本,向下滚动,直到找到SAM D20 Xplained Pro并选择LED切换应用程序。当你按下SW0时,该项目所做的几乎是什么,LED0打开。在这一点上,你认为“这有什么意义呢?你可以用硬线来做同样的事情。”然而,这是Atmel使它更容易改变东西并显示部分功能的地方。


在主文件(led_toggle.c)中,靠近顶部的是一些定义。通过改变这些#define语句,你可以改变零件对按钮的反应。它可以通过PORT驱动程序,EIC驱动程序,使用SysTick处理程序,或使用EIC处理程序,使用中断或不使用中断作出反应。这使您能够调试使用各种方法查看引脚更改的代码。


  1. /*
  2. USE_INTERRUPTS      USE_EIC         Result
  3. --------------      -------         ---------------------------------------------
  4. false               false           Polled via PORT driver
  5. false               true            Polled via EIC driver
  6. true                false           Polled via PORT driver, using SysTick handler
  7. true                true            Polled via EIC driver, using EIC handler
  8. */
  9.   
  10. #define USE_INTERRUPTS  true
  11. #define USE_EIC         true
复制代码

那么,让我们分解一下Atmel为实现这个计划而采取的步骤。 第一步是系统初始化,system_init()。 这个函数依次调用system_clock_init()和system_board_init()函数。

  1. void system_init(void)
  2. {
  3. /* Configure GCLK and clock sources according to conf_clocks.h */
  4. system_clock_init();
  5.   
  6. /* Initialize board hardware */
  7. system_board_init();
  8. }
复制代码

他们创建的system_clock_init()函数有一系列#if语句来检查哪个时钟被启用,建立一个结构,然后把它放到一个配置函数中。 下面是一个如何完成的例子。

  1. #if CONF_CLOCK_XOSC_ENABLE == true
  2.     struct system_clock_source_xosc_config xosc_conf;
  3.     system_clock_source_xosc_get_default_config(&xosc_conf);
  4.   
  5.     xosc_conf.external_clock        = CONF_CLOCK_XOSC_EXTERNAL_CRYSTAL;
  6.     xosc_conf.startup_time          = CONF_CLOCK_XOSC_STARTUP_TIME;
  7.     xosc_conf.auto_gain_control     = CONF_CLOCK_XOSC_AUTO_GAIN_CONTROL;
  8.     xosc_conf.frequency             = CONF_CLOCK_XOSC_EXTERNAL_FREQUENCY;
  9.     xosc_conf.on_demand             = CONF_CLOCK_XOSC_ON_DEMAND;
  10.     xosc_conf.run_in_standby        = CONF_CLOCK_XOSC_RUN_IN_STANDBY;

  11.     system_clock_source_xosc_set_config(&xosc_conf);
  12.     system_clock_source_enable(SYSTEM_CLOCK_SOURCE_XOSC);
  13. #endif
复制代码

system_board_init()函数将完全依赖于正在使用的电路板。 制作自己的电路板时,必须制作自己的board_init函数。 在这个功能中,所有Atmel都设置了LED输出和按钮输入的端口引脚。 我不得不承认,他们看起来有些复杂,但是所有的开发委员会似乎都有效。


  1. void system_board_init(void)
  2. {
  3.     struct port_config pin_conf;
  4.     port_get_config_defaults(&pin_conf);
  5.   
  6.     /* Configure LEDs as outputs, turn them off */
  7.     pin_conf.direction = PORT_PIN_DIR_OUTPUT;
  8.     port_pin_set_config(LED_0_PIN, &pin_conf);
  9.     port_pin_set_output_level(LED_0_PIN, LED_0_INACTIVE);

  10.     /* Set buttons as inputs */
  11.     pin_conf.direction = PORT_PIN_DIR_INPUT;
  12.     pin_conf.input_pull = PORT_PIN_PULL_UP;
  13.     port_pin_set_config(BUTTON_0_PIN, &pin_conf);
  14. }
复制代码

在这一点上,代码开始进入一系列#if语句,以确定它应该如何对按钮按下作出反应。 所以,根据你如何设置USE_INTERRUPTS和USE_EIC将决定它是否使用EIC,中断和systick。

  1. #if USE_EIC == true
  2.     configure_extint();
  3. #endif

  4. #if USE_INTERRUPTS == true
  5. # if USE_EIC == false
  6.     configure_systick_handler();
  7. # else
  8.     configure_eic_callback();
  9. # endif

  10. system_interrupt_enable_global();

  11. while (true) {
  12. /* Do nothing - use interrupts */
  13. }
  14. #else
  15. # if USE_EIC == false
  16.     while (true) {
  17.     update_led_state();
  18.     }
  19. # else
  20.     while (true) {
  21.         if (extint_chan_is_detected(BUTTON_0_EIC_LINE)) {
  22.             extint_chan_clear_detected(BUTTON_0_EIC_LINE);
  23.         update_led_state();
  24.         }
  25.     }
  26. # endif
  27. #endif
复制代码

再次,如果您经过Atmel Studio并选择一个新的示例项目,您可以找到列出的这个项目。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 16 | 回复: 21



手机版|

GMT+8, 2024-12-21 20:53 , Processed in 0.066334 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表