5824|0

138

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

SAMD21开发板试用心得 + avrstudio 6.2 调试SAMD21 Xplained pro+实例1-led点亮程序 [复制链接]

本帖最后由 xinxiaojun 于 2014-9-30 20:15 编辑

SAMD21开发板试用心得 + avrstudio 6.2 调试SAMD21 Xplained pro 开发板1-led点亮程序


       拿到SAMD21 Xplained Pro开发板有短时间了, 前前后后做了一些功能.不错的厂商,不错的M0芯片,不错的开发板.比信用卡稍大的体积,将所有的引脚全部引出,安排好插针,方便我们做测试.可惜没有拿到对应的扩展板, 板载的普通外设只剩下led ,按钮,io口 .算上pwm  dac.板子上带了大家都知道的在板调试器EDBG,无需外接jlink或者其他调试器,此举符合当前cortex M单片机市场的通常做法.
      除了上面的几个外设,还带了:
1 板载flash ,8M哦;
2 usb口,可以进行usb通信联系.


板子的做工总体不错.看看32khz晶振就知道整体质感如这晶振一样,不错.板载的主芯片,是
ATSAMD21J18A ,查了数据手册,这是本系列中的最高配置了:


64PIN;256KBflash;


相对于竞争对手的配置,这也算是豪华了.M0+内核, usb ,DMA都有了. 唯一剩下的就是价格了.如果价格亲民,势必无敌;        
        言归正传,开始学习SAMD21的首篇体验----LED_TOGGLE1 (指示灯切换显示程序)


1, First ,先打开avrstudio 6.2, 然后插上咱们的宝贝开发板 SAMD21 Xplained Pro, 在avrstudio中自动识别后,正确显示出了板卡的照片,并且附带图片,方便我们确认识别的结果.
如下图所示:


2,  avrstudio提供了很好的ide能力.尽量的便捷用户,基本可以做到0代码编程,比如我们这个led程序,因为led的位置和引脚固定.我们就可以大胆放心的坐享其成,官方为我们写好这样一个例程,让我们能够迅速通过不同的方式来掌握io引脚的输入输出,,本例程就是关于板载的按键和一个黑色led( yellow led), 点击快速例程模版: new example project, 能够迅速建立起一个示例代码工程,





,这是我的选择


3,  avrstudio asf ,就是一个编程框架,有点类似于其他arm芯片的固件库,无非是厂家提供给我们的api和bsp类似的东西,方便我们快速开发,
选择对应的asf版本,双击,则出现存在的例程列表,选择需要的例程,本篇从最近的io开始,



4 工程建立了.点击LED_TOGGLE1,会出来一个完整的项目结构




5  工程建立以后,点击各个部分,有文件夹,源码 .c .h ,跟其他的ide大同小异,只不过avrstudio 增加了asf的组织结构显示,还有VA显示功能




  我们看下,重点代码,这是main函数所在地,相当于应用程序,未来我们通过asf来建立项目的益处就是在于此,集中精力写好我们的应用代码,而且是基于一定框架和api来写,尽量远离底层,涉及到底层,大部分通过配置来实现,所谓配置,就是勾勾选选的事情了.大大降低劳动程度,复用了代码,减少重复劳动.
    未来的框架,涵盖了软件和硬件,使得我们有更多的精力来集中于应用.


以下是led_toggle.c的代码,整个软件框架,或者说是库函数,仅需加载asf.h,就可以轻松拥有在高层访问底层的能力. 将来我们利用这个asf,同样的芯片.不同的程序,不同的之处,最后集中异同与app.c,不同工程就这个应用代码有区别,其他都是强大的asf,经历简单的配置后,就能 胜任.
如此功能强大的atmel M0 被巧妙地抽象成了这样一个asf ,实在是妙不可言.

#include



/** If \true, interrupts are used to alter the board state, when \false polling
*  is used.
*/
#define USE_INTERRUPTS   true

/** If \true, the External Interrupt Controller module is used to check when the
*   button state changes, when \false the PORT module is used.
*/
#define USE_EIC          true


/** Updates the board LED to the current button state. */
static void update_led_state(void)
{
        bool pin_state = port_pin_get_input_level(BUTTON_0_PIN);
        port_pin_set_output_level(LED_0_PIN, pin_state);
}

#if USE_INTERRUPTS == true
#  if USE_EIC == true
/** Callback function for the EXTINT driver, called when an external interrupt
*  detection occurs.
*/
static void extint_callback(void)
{
        update_led_state();
}

/** Configures and registers the External Interrupt callback function with the
*  driver.
*/
static void configure_eic_callback(void)
{
        extint_register_callback(extint_callback,
                        BUTTON_0_EIC_LINE,
                        EXTINT_CALLBACK_TYPE_DETECT);
        extint_chan_enable_callback(BUTTON_0_EIC_LINE,
                        EXTINT_CALLBACK_TYPE_DETECT);
}
#  else
/** Handler for the device SysTick module, called when the SysTick counter
*  reaches the set period.
*
*  \note As this is a raw device interrupt, the function name is significant
*        and must not be altered to ensure it is hooked into the device's
*        vector table.
*/
void SysTick_Handler(void)
{
        update_led_state();
}

/** Configures the SysTick module to fire a SysTick interrupt every 999 system
*  clock source cycles.
*/
static void configure_systick_handler(void)
{
        SysTick->CTRL = 0;
        SysTick->LOAD = 999;
        SysTick->VAL  = 0;
        SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
}
#  endif
#endif

#if USE_EIC == true
/** Configures the External Interrupt Controller to detect changes in the board
*  button state.
*/
static void configure_extint(void)
{
        struct extint_chan_conf eint_chan_conf;
        extint_chan_get_config_defaults(&eint_chan_conf);

        eint_chan_conf.gpio_pin           = BUTTON_0_EIC_PIN;
        eint_chan_conf.gpio_pin_mux       = BUTTON_0_EIC_MUX;
        eint_chan_conf.detection_criteria = EXTINT_DETECT_BOTH;
        eint_chan_conf.filter_input_signal = true;
        extint_chan_set_config(BUTTON_0_EIC_LINE, &eint_chan_conf);
}
#endif

int main(void)
{
        system_init();

#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
}

   avrstudio的编程风格很好.非常齐整,各种条件配置开关,简约易读,代码本身就是很好的说明书,不知道是否是启用了doxygen或者类似的规则.
    经过这次试用,对avrstudio 6.2之前的"启动慢,界面卡的"映象大大改观,以后我们可以利用avrstudio 6.2来方便的做各种开发,在avr->cortex -M4等 8-32bit mcu间自由驰骋,便利.最最重要他自己免费.所带的gcc编译器亦是免费.
      在mcu进入2014这样一个历史节点的时候, 各种性能优异的芯片和功能爆棚的软件,竞相问世, atmel 已用惊艳的产品为我们的设计续写一如既往的强大支撑. 非常期待在国内的推广应用, 在主流cortex -M市场上又能看到这样一款利器.为我们的产品多一个可靠选择;









   







此帖出自单片机论坛
点赞 关注
个人签名 与时间赛跑
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表