在Atmel Studio 6中,集成了Atmel Software Framework(ASF结构)。经过它供给的库,能够很快速地完结新的项目。
这次的最终方针运用ASF在LCD上显示出文字“Hello World!”,现阶段方针是点亮LCD的背光,学习方针是了解怎样样运用ASF供给的模块。
一、 ASF Wizard
新建一个项目,依据所运用的开发板挑选模板。
然后能够经过ASF Wizard进行所需模块的装备。
默许情况下,现已挑选了两个模块。在之前咱们曾经运用过了其间Generic board support模块供给的头文件sam4e_ek.h了。
为了解模块增加的办法,先把这两个模块移除。
二、 经过ASF设置时钟
增加模块
在可用模块里找到“System Clock Control”模块,打开它。
能够看到它依靠的模块,以及相应的API文档等内容。
增加该模块后,它会主动地把依靠的模块增加进去。增加完结后点击Apply按钮,使改动收效。
现在在asf.h文件中,就现已导入了一系列的模块相关的头文件。如刚刚运用的体系时钟操控模块的:
// From module: System Clock Control – SAM4E implementation
#include
一起,在文件夹config下,多了一个文件conf_clock.h。
装备
conf_clock.h里保存的便是时钟相关的装备了。这儿面的注释很清楚,装备办法也很简单。并且在该文件的结尾也阐明晰默许情况下,装备的成果:
// ===== Target frequency (System clock)
// – XTAL frequency: 12MHz
// – System clock source: PLLA
// – System clock prescaler: 2 (divided by 2)
// – PLLA source: XTAL
// – PLLA output: XTAL * 16 / 1
// – System clock: 12 * 16 / 1 / 2 = 96MHz
为了使这个时钟的装备收效,调用sysclk_init()即可:
#include
int main (void)
{
sysclk_init();
while(1);
}
编译
可是在编译时,发现短少头文件board.h。这阐明ASF Wizard在处理依靠时也有那么一点Bug。测验再手动增加一个模块Generic board support,再编译,发现又短少头文件ioport.h,持续增加模块IOPORT,编译经过。IOPORT模块依靠了System Clock Control模块,能够将手动增加的这个模块删去,至此,又回到了新建项目时的模块设置了。
增加不必要的模块会增加编译的时刻,也或许会增加生成的方针文件的巨细。假设了解相关头文件的效果,也能够修正asf.h中包括的头文件。
其他,也能够经过了解ASF中函数的完结,来学习相关的装备进程。
检查MCK的频率
如sysclk_init()相同,ASF中完结了许多常用的功用。如咱们需求检查MCK的频率的话,也很简单:
volatile uint32_t freq;
freq = SystemCoreClock; /* 4 000 000 */
/* 这个函数是依据conf_clock.h中宏的界说来核算的。
便是调用sysclk_init()后MCK的值 */
freq = sysclk_get_cpu_hz(); /* 96 000 000 */
sysclk_init();
/* 调用sysclk_init()后会主动修正这个变量 */
freq = SystemCoreClock; /* 96 000 000 */
三、 LCD背光操控器
开发板运用的LCD背光操控器是AAT31系列的。一起PC13衔接的是它的使能、操控引脚。
其他,假定咱们不知道这个背光操控器的亮度操控办法是向EN/SET引脚发送N个脉冲波,那该怎样运用这个操控器呢?RTFM?找它的芯片手册当然是一个能够深化了解它的办法,但假设咱们的方针仅仅是能用就好,又或是运用起来过分费事呢?
嗯,咱们这次学的便是ASF。
增加模块
在ASF Wizard中增加Display – AAT31XX Backlight Controller模块。增加后项目里多了个头文件conf_at31xx.h,这个头文件首要的效果便是在未界说EN/SET引脚的接线时,对其进行界说(在sam4e_ek.h这个文件中现已做好相关的界说了)。一起asf.h中也包括了相关的头文件了。
ASF中对组件进行初始化
运用背光操控器之前,需求进行相关装备。这个作业能够手动完结,也能够运用ASF完结。
在conf_board.h文件里,能够指定好一系列需求装备的组件。然后在履行board_init()函数时,就能够依据这些宏的界说履行相应的初始化作业。这个头文件里现现已过注释阐明晰装备USART等引脚时,宏是怎么界说的,可是却不知道怎么背光组件相关的界说。
检查board_init()的完结,能够发现以下几句:
#ifdef CONF_BOARD_AAT3155
/* Configure Backlight control pin */
ioport_set_pin_dir(BOARD_AAT31XX_SET_GPIO, IOPORT_DIR_OUTPUT);
#endif
经过这儿就能够得到需求的宏的姓名,以及ASF初始化时详细的作业了。现在就在conf_board.h中,加上相应的界说就好了:
/* Configure Backlight control pin */
#define CONF_BOARD_AAT3155
其他,aat31xx.h头文件也需求这个宏的声明以判别详细的操控器的类型。
最终不要忘掉调用board_init( )函数。
API的运用
能够检查相应的API的文档,以了解ASF供给的API。
更直接的办法是阅览相应的头文件(aat31xx.h),这儿面或许会有一些文档中未说到的部分。如以下几个宏就未在API文档中阐明:
#define AAT31XX_MIN_BACKLIGHT_LEVEL 1
#define AAT31XX_AVG_BACKLIGHT_LEVEL 8
#define AAT31XX_MAX_BACKLIGHT_LEVEL 16
现在,就能够很方便地运用背光操控器了。如以下代码将装备背光为最大亮度:
1aat31xx_set_backlight(AAT31XX_MAX_BACKLIGHT_LEVEL);
四、 LCD操控器
开发板运用的LCD操控器是ILI93xx系列的。ASF供给的模块为Display – ILI93xx LCD Controller。conf_board.h中,相应的宏声明为CONF_BOARD_ILI93XX。
board_init( )中初始化的作业仅有装备GPIO引脚的复用,可是还有其他作业需求完结。所以LCD暂时还不能用。剩余的部分鄙人一次阐明。