迟来的爱 - SAM4L8 Xplained Pro测评
发布时间:2015-11-03
分享到:
迟来的爱 - SAM4L8 Xplained Pro测评
发布时间:2015-11-03
分享到:

SAM4L系列MCU算爱特梅尔早起的一款基于ARM Cortex-M4处理器的低功耗微控制器,不久前有幸拿到了SAM4L8 Xplained Pro开发板,一起来看看板子的功能吧,实物图如下。

外包装一贯的白色底色,图案也是一贯独具个性的机器人造型,整体显得精美上档次。

评估板的大小比银行卡稍大,做工还是延续爱特梅尔一贯的风格,深蓝色喷油沉稳大气、板子的布局合理、几乎所有IO通过扩展接口引出、镀金焊接工艺一流、板材用料扎实,无论都哪个角度都是一件非常耐看的艺术品!

简介

SAM4L8 Xplained Pro评估板是一个理想的用来评估和原型开发的平台,用于评估SAM4L8(Cortex – M4核)微控制器,这块评估板可以作为一个评估和入门套件,配套的扩展板也可以独立购买。

SAM4L8 Xplained Pro评估板关键特性:

1,  SAM4LC8CA微处理器

2,  一个机械复位按钮

3,  一个机械用户按钮(可作为唤醒、bootloader入口、或其他通用功能)

4,  一个Qtouch按钮

5,  一个黄色用户指示灯

6,  USB主机、设备共用物理接口

7,  32.768kHZ外部晶振

8,  12MHz外部晶振

9,  四个扩展接口

10, 一个用于断码显示的通用用户扩展接口

11, LDO/BUCK稳压模式可选

12, LCD插座电源控制可选

13, 板载调试器

(1)       板ID自动识别

(2)       黄色状态指示灯

(3)       绿色电源指示灯

(4)       灵活数据类型包括范围信息的符号化调试

(5)       烧录

(6)       EDBG与MCU通过USART,TWI和4个GPIO通信

(7)       虚拟串口通信

14, USB供电

15, ASF应用例程支持

评估板功能全貌

评估板方框图

SAM4L8MCU特性:

  • SAM4L是爱特梅尔M4核家族的一员,能运行最高48MHz频率
  • 内置超低功耗picoPower技术,灵活的电源控制技术能够带来低至90uA/MHz电流消耗
  • 灵活的配置能在性能与功耗之间取得非常宽的调整范围,让用户能够在复杂的应用场合取得最低的功耗
  • 等待和保留模式能够保留所有逻辑电平和RAM,两种模式下的最低功耗能分别达到3微安和1.5微安
  • 并且拥有低于1.5微秒的快速唤醒能力。并且,在等待模式下,支持SleepWalking特性
  • 在备份模式下,CPU、外设、RAM的电源关闭,消耗的电流低于0.9微安,并且可以由外部中断来唤醒
  • SAM4L提供丰富的外设比如段码控制器、QTouch、USB设备、USB主机、128位AES加密、音频接口
  • 高速串行外设如USART、SPI、I2C。另外,根据系统和SleepWalking技术允许外设之间直接进行通信
  • 根据外设的电平来智能地决定一个事件源,比如I2C地址匹配或AD阈值等
  • 可以支持使用Atmel AS6.2快速进行项目开发

开发调试

将OLED扩张板与核心板的EXT2扩展口对接,然后将miniUSB口接入核心板的DEBUG USB接口,插入电脑的任意一个USB接口,驱动程序会自动安装。

需要注意的是,核心板有两个USB接口另外一个是SAM4LC8的USB接口,要注意区分。

1、选择File – New – Example Project

2、由于ASF库集成了SSD1306的例程,直接选择从ASF库中选择SSD1306的例程,笔者使用的ASF版本是3.27.0.

3、工程建好之后,已经具备SSD1306的底层驱动函数了,我们只需要加入自己的相关代码即可,比如画点、画线、字库、显示字符、字符串等等。

我们可以使用字符取模函数来建立需要的字体、字体大小的字库,或者开机画面等。

附上自定义完整代码>>>>>>>>>>>>>>>>>

/*

 * mycodes.c

 *

 * Created: 2015/10/27 21:38:27

 *  Author: Huang

 */

#include "mycodes.h"

/* 定义缓存,用来存储128 x 32个点的显示信息 */

uint8_t pixels[128 * 4];

/* 保存点显示信息 */

void save_pixel(uint8_t page,uint8_t col,uint8_t dat)

{

       pixels[128 * page + col] = dat;

}

/* 获取点显示信息 */

uint8_t get_pixel(uint8_t page,uint8_t col)

{

       return pixels[128 * page + col];

}

/* 显示一个点 */

void draw_pixel(uint8_t x,uint8_t y,uint8_t f) //x[0,127],y[0,31]

{

       uint8_t col,page;

       uint8_t d,n;

       col = x;

       page = (y / 8);

       n = y % 8;

       d = get_pixel(page,col);

       d &= ~(0x80 >> (7 - n));

       if(f) {

              d |= (0x80 >> (7 - n));

       } else {

              d &= ~(0x80 >> (7 - n));

       }

       ssd1306_set_page_address(page);

       ssd1306_set_column_address(col);

       ssd1306_write_data(d);

       save_pixel(page,col,d);

}

/* 清全屏 */

void clr_all(void)

{

       uint8_t i,j;

       for(i = 0;i < 4;i++) {

              ssd1306_set_page_address(i);

              for(j = 0;j < 128;j++) {

                     ssd1306_set_column_address(j);

                     ssd1306_write_data(0);

              }

       }

}

/* 定义ASC字模 */

uint8_t  const sysfont_glyphs[] = { \

       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,          /* " " */ \

       0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20,          /* "!" */ \

       0x50, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00,          /* """ */ \

       0x50, 0x50, 0xf8, 0x50, 0xf8, 0x50, 0x50,          /* "#" */ \

       0x20, 0x78, 0xa0, 0x70, 0x28, 0xf0, 0x20,          /* "$" */ \

       0xc0, 0xc8, 0x10, 0x20, 0x40, 0x98, 0x18,          /* "%" */ \

       0x60, 0x90, 0xa0, 0x40, 0xa8, 0x90, 0x68,          /* "&" */ \

       0x60, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00,          /* "'" */ \

       0x10, 0x20, 0x40, 0x40, 0x40, 0x20, 0x10,          /* "(" */ \

       0x40, 0x20, 0x10, 0x10, 0x10, 0x20, 0x40,          /* ")" */ \

       0x00, 0x50, 0x20, 0xf8, 0x20, 0x50, 0x00,          /* "*" */ \

       0x00, 0x20, 0x20, 0xf8, 0x20, 0x20, 0x00,          /* "+" */ \

       0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x40,          /* "," */ \

       0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00,          /* "-" */ \

       0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60,          /* "." */ \

       0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00,          /* "/" */ \

       0x70, 0x88, 0x98, 0xa8, 0xc8, 0x88, 0x70,          /* "0" */ \

       0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x70,          /* "1" */ \

       0x70, 0x88, 0x08, 0x10, 0x20, 0x40, 0xf8,          /* "2" */ \

       0xf8, 0x10, 0x20, 0x10, 0x08, 0x88, 0x70,          /* "3" */ \

       0x10, 0x30, 0x50, 0x90, 0xf8, 0x10, 0x10,          /* "4" */ \

       0xf8, 0x80, 0xf0, 0x08, 0x08, 0x88, 0x70,          /* "5" */ \

       0x30, 0x40, 0x80, 0xf0, 0x88, 0x88, 0x70,          /* "6" */ \

       0xf8, 0x08, 0x10, 0x20, 0x40, 0x40, 0x40,          /* "7" */ \

       0x70, 0x88, 0x88, 0x70, 0x88, 0x88, 0x70,          /* "8" */ \

       0x70, 0x88, 0x88, 0x78, 0x08, 0x10, 0x60,          /* "9" */ \

       0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00,          /* ":" */ \

       0x00, 0x60, 0x60, 0x00, 0x60, 0x20, 0x40,          /* ";" */ \

       0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08,          /* "<" */ \

       0x00, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x00,          /* "=" */ \

       0x80, 0x40, 0x20, 0x10, 0x20, 0x40, 0x80,          /* ">" */ \

       0x70, 0x88, 0x08, 0x10, 0x20, 0x00, 0x20,          /* "?" */ \

       0x70, 0x88, 0x08, 0x68, 0xa8, 0xa8, 0x70,          /* "@" */ \

       0x70, 0x88, 0x88, 0x88, 0xf8, 0x88, 0x88,          /* "A" */ \

       0xf0, 0x88, 0x88, 0xf0, 0x88, 0x88, 0xf0,          /* "B" */ \

       0x70, 0x88, 0x80, 0x80, 0x80, 0x88, 0x70,          /* "C" */ \

       0xe0, 0x90, 0x88, 0x88, 0x88, 0x90, 0xe0,          /* "D" */ \

       0xf8, 0x80, 0x80, 0xf0, 0x80, 0x80, 0xf8,          /* "E" */ \

       0xf8, 0x80, 0x80, 0xe0, 0x80, 0x80, 0x80,          /* "F" */ \

       0x70, 0x88, 0x80, 0x80, 0x98, 0x88, 0x70,          /* "G" */ \

       0x88, 0x88, 0x88, 0xf8, 0x88, 0x88, 0x88,          /* "H" */ \

       0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70,          /* "I" */ \

       0x38, 0x10, 0x10, 0x10, 0x10, 0x90, 0x60,          /* "J" */ \

       0x88, 0x90, 0xa0, 0xc0, 0xa0, 0x90, 0x88,          /* "K" */ \

       0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf8,          /* "L" */ \

       0x88, 0xd8, 0xa8, 0x88, 0x88, 0x88, 0x88,          /* "M" */ \

       0x88, 0x88, 0xc8, 0xa8, 0x98, 0x88, 0x88,          /* "N" */ \

       0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70,          /* "O" */ \

       0xf0, 0x88, 0x88, 0xf0, 0x80, 0x80, 0x80,          /* "P" */ \

       0x70, 0x88, 0x88, 0x88, 0xa8, 0x90, 0x68,          /* "Q" */ \

       0xf0, 0x88, 0x88, 0xf0, 0xa0, 0x90, 0x88,          /* "R" */ \

       0x78, 0x80, 0x80, 0x70, 0x08, 0x08, 0xf0,          /* "S" */ \

       0xf8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,          /* "T" */ \

       0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70,          /* "U" */ \

       0x88, 0x88, 0x88, 0x88, 0x88, 0x50, 0x20,          /* "V" */ \

       0x88, 0x88, 0x88, 0xa8, 0xa8, 0xd8, 0x88,          /* "W" */ \

       0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88,          /* "X" */ \

       0x88, 0x88, 0x50, 0x20, 0x20, 0x20, 0x20,          /* "Y" */ \

       0xf8, 0x08, 0x10, 0x20, 0x40, 0x80, 0xf8,          /* "Z" */ \

       0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38,          /* "[" */ \

       0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00,          /* "\" */ \

       0xe0, 0x20, 0x20, 0x20, 0x20, 0x20, 0xe0,          /* "]" */ \

       0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00,          /* "^" */ \

       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,          /* "_" */ \

       0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00,          /* "`" */ \

       0x00, 0x00, 0x70, 0x08, 0x78, 0x88, 0x78,          /* "a" */ \

       0x80, 0x80, 0xb0, 0xc8, 0x88, 0x88, 0xf0,          /* "b" */ \

       0x00, 0x00, 0x70, 0x80, 0x80, 0x88, 0x70,          /* "c" */ \

       0x08, 0x08, 0x68, 0x98, 0x88, 0x88, 0x78,          /* "d" */ \

       0x00, 0x00, 0x70, 0x88, 0xf8, 0x80, 0x70,          /* "e" */ \

       0x30, 0x48, 0x40, 0xe0, 0x40, 0x40, 0x40,          /* "f" */ \

       0x00, 0x00, 0x78, 0x88, 0x78, 0x08, 0x30,          /* "g" */ \

       0x80, 0x80, 0xb0, 0xc8, 0x88, 0x88, 0x88,          /* "h" */ \

       0x20, 0x00, 0x60, 0x20, 0x20, 0x20, 0x70,          /* "i" */ \

       0x10, 0x00, 0x30, 0x10, 0x10, 0x90, 0x60,          /* "j" */ \

       0x40, 0x40, 0x48, 0x50, 0x60, 0x50, 0x48,          /* "k" */ \

       0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70,          /* "l" */ \

       0x00, 0x00, 0xd0, 0xa8, 0xa8, 0x88, 0x88,          /* "m" */ \

       0x00, 0x00, 0xb0, 0xc8, 0x88, 0x88, 0x88,          /* "n" */ \

       0x00, 0x00, 0x70, 0x88, 0x88, 0x88, 0x70,          /* "o" */ \

       0x00, 0x00, 0xf0, 0x88, 0xf0, 0x80, 0x80,          /* "p" */ \

       0x00, 0x00, 0x68, 0x98, 0x78, 0x08, 0x08,          /* "q" */ \

       0x00, 0x00, 0xb0, 0xc8, 0x80, 0x80, 0x80,          /* "r" */ \

       0x00, 0x00, 0x70, 0x80, 0x70, 0x08, 0xf0,          /* "s" */ \

       0x40, 0x40, 0xe0, 0x40, 0x40, 0x48, 0x30,          /* "t" */ \

       0x00, 0x00, 0x88, 0x88, 0x88, 0x98, 0x68,          /* "u" */ \

       0x00, 0x00, 0x88, 0x88, 0x88, 0x50, 0x20,          /* "v" */ \

       0x00, 0x00, 0x88, 0x88, 0xa8, 0xa8, 0x50,          /* "w" */ \

       0x00, 0x00, 0x88, 0x50, 0x20, 0x50, 0x88,          /* "x" */ \

       0x00, 0x00, 0x88, 0x88, 0x78, 0x08, 0x70,          /* "y" */ \

       0x00, 0x00, 0xf8, 0x10, 0x20, 0x40, 0xf8,          /* "z" */ \

       0x10, 0x20, 0x20, 0x40, 0x20, 0x20, 0x10,          /* "{" */ \

       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,          /* "|" */ \

       0x40, 0x20, 0x20, 0x10, 0x20, 0x20, 0x40,          /* "}" */ \

       };

/* 显示一个字符 */

void disp_char(const char c,uint8_t x,uint8_t y)

{

       uint8_t n = c - ' ';

       uint8_t byte = sysfont_glyphs[n * 7];

       uint8_t i,j;

       uint8_t x_ = x,y_ = y;

       for(i = 0;i < 7;i++) {

              byte = sysfont_glyphs[n * 7 + i];

              for(j = 0;j < 6;j++) {

                     if(byte & 0x80) {

                            draw_pixel(x_,y_,1);

                            asm("nop");

                     }

                     x_++;

                     byte <<= 1;

              }

              x_ = x;

              y_++;

       }

}

/* 显示字符串,带换行控制 */

void disp_str(const char *c,uint8_t x,uint8_t y)

{

       uint8_t x_ = x,y_ = y;

       uint8_t newLines = 0; // 记录换行次数

       while(*c) {

              if(*c >= ' ' && *c <= '}') {

                     disp_char(*c,x_,y_);

                     c++;

                     x_ += 6;

                     y_ = y + (7 + 1) * newLines;

              } else if (*c == '\n') { // 遇换行符换行

                     newLines++; // 换行数累加

                     c++;

                     x_ = x;

                     y_ = y + (7 + 1) * newLines;

              } else {

                     return;

              }

       }

}

程序加载之后的显示效果图如下,

显示

-WWW.EEFOCUS.COM

-SAM4L8 Xplained Pro!\n

-Any key continue..

小结

使用爱特梅尔SAM4L8 Xplained Pro套件,能够最大限度地在项目启动前进行对SAM4L8微控制器和应用模型全方位的评估。同时结合爱特梅尔配套的开发生态链,能够非常迅速地进行ATMEL全系列的开发。

近期半导体行业掀起收购狂潮,ATMEL也被德国半导体Dialog收购。期待被收购之后,爱特梅尔稳定、优异的性能和优良的品质能够得到最大的传承和发展,这也是爱特梅尔铁粉们,共同的心声。

参考资料

 原创申明:本文为爱板网原创,谢绝转载!
加入微信技术交流群

技术交流,职业进阶

关注电路设计技能公众号

了解最新技术方案

加入电路城 QQ 交流群

与技术大牛交朋友

讨论 (3)

讨论区
halo501 ·  2015-11-10
月光9850 ·  2015-11-06
xuanboo ·  2015-11-04