|
示例项目
我要在这里展示的所有例子都是使用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处理程序,使用中断或不使用中断作出反应。这使您能够调试使用各种方法查看引脚更改的代码。
- /*
- USE_INTERRUPTS USE_EIC Result
- -------------- ------- ---------------------------------------------
- false false Polled via PORT driver
- false true Polled via EIC driver
- true false Polled via PORT driver, using SysTick handler
- true true Polled via EIC driver, using EIC handler
- */
-
- #define USE_INTERRUPTS true
- #define USE_EIC true
复制代码
那么,让我们分解一下Atmel为实现这个计划而采取的步骤。 第一步是系统初始化,system_init()。 这个函数依次调用system_clock_init()和system_board_init()函数。 - void system_init(void)
- {
- /* Configure GCLK and clock sources according to conf_clocks.h */
- system_clock_init();
-
- /* Initialize board hardware */
- system_board_init();
- }
复制代码
他们创建的system_clock_init()函数有一系列#if语句来检查哪个时钟被启用,建立一个结构,然后把它放到一个配置函数中。 下面是一个如何完成的例子。 - #if CONF_CLOCK_XOSC_ENABLE == true
- struct system_clock_source_xosc_config xosc_conf;
- system_clock_source_xosc_get_default_config(&xosc_conf);
-
- xosc_conf.external_clock = CONF_CLOCK_XOSC_EXTERNAL_CRYSTAL;
- xosc_conf.startup_time = CONF_CLOCK_XOSC_STARTUP_TIME;
- xosc_conf.auto_gain_control = CONF_CLOCK_XOSC_AUTO_GAIN_CONTROL;
- xosc_conf.frequency = CONF_CLOCK_XOSC_EXTERNAL_FREQUENCY;
- xosc_conf.on_demand = CONF_CLOCK_XOSC_ON_DEMAND;
- xosc_conf.run_in_standby = CONF_CLOCK_XOSC_RUN_IN_STANDBY;
-
- system_clock_source_xosc_set_config(&xosc_conf);
- system_clock_source_enable(SYSTEM_CLOCK_SOURCE_XOSC);
- #endif
复制代码
system_board_init()函数将完全依赖于正在使用的电路板。 制作自己的电路板时,必须制作自己的board_init函数。 在这个功能中,所有Atmel都设置了LED输出和按钮输入的端口引脚。 我不得不承认,他们看起来有些复杂,但是所有的开发委员会似乎都有效。
- void system_board_init(void)
- {
- struct port_config pin_conf;
- port_get_config_defaults(&pin_conf);
-
- /* Configure LEDs as outputs, turn them off */
- pin_conf.direction = PORT_PIN_DIR_OUTPUT;
- port_pin_set_config(LED_0_PIN, &pin_conf);
- port_pin_set_output_level(LED_0_PIN, LED_0_INACTIVE);
-
- /* Set buttons as inputs */
- pin_conf.direction = PORT_PIN_DIR_INPUT;
- pin_conf.input_pull = PORT_PIN_PULL_UP;
- port_pin_set_config(BUTTON_0_PIN, &pin_conf);
- }
复制代码
在这一点上,代码开始进入一系列#if语句,以确定它应该如何对按钮按下作出反应。 所以,根据你如何设置USE_INTERRUPTS和USE_EIC将决定它是否使用EIC,中断和systick。 - #if USE_EIC == true
- configure_extint();
- #endif
-
- #if USE_INTERRUPTS == true
- # if USE_EIC == false
- configure_systick_handler();
- # else
- configure_eic_callback();
- # endif
-
- system_interrupt_enable_global();
-
- while (true) {
- /* Do nothing - use interrupts */
- }
- #else
- # if USE_EIC == false
- while (true) {
- update_led_state();
- }
- # else
- while (true) {
- if (extint_chan_is_detected(BUTTON_0_EIC_LINE)) {
- extint_chan_clear_detected(BUTTON_0_EIC_LINE);
- update_led_state();
- }
- }
- # endif
- #endif
复制代码
再次,如果您经过Atmel Studio并选择一个新的示例项目,您可以找到列出的这个项目。
|