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收购。期待被收购之后,爱特梅尔稳定、优异的性能和优良的品质能够得到最大的传承和发展,这也是爱特梅尔铁粉们,共同的心声。
参考资料
- 评估板概述
- 评估板用户指南
- SAM4L系列数据手册
- 评估板原理图
- AS7开发工具下载
原创申明:本文为爱板网原创,谢绝转载!
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快速进行项目开发