SAM4E单片机之旅——13、LCD之ASF初步

在Atmel Studio 6中,集成了Atmel Software Framework(ASF框架)。通过它提供的库,可以很快速地完成新的项目。

这次的最终目标使用ASF在LCD上显示出文字“Hello World!”,现阶段目标是点亮LCD的背光,学习目标是了解怎么样使用ASF提供的模块。

 

一、 ASF Wizard

新建一个项目,根据所使用的开发板选择模板。

wps_clip_image-12098

然后可以通过ASF Wizard进行所需模块的配置。

wps_clip_image-12152

默认情况下,已经选择了两个模块。在之前我们以前使用过了其中Generic board support模块提供的头文件sam4e_ek.h了。

wps_clip_image-18626

为了解模块添加的方法,先把这两个模块移除。

 

二、 通过ASF设置时钟

  1. 添加模块

    在可用模块里找到“System Clock Control”模块,展开它。

    wps_clip_image-22996

    可以看到它依赖的模块,以及相应的API文档等内容。

    添加该模块后,它会自动地把依赖的模块添加进去。添加完成后点击Apply按钮,使改变生效。

    现在在asf.h文件中,就已经导入了一系列的模块相关的头文件。如刚刚使用的系统时钟控制模块的:

    // From module: System Clock Control - SAM4E implementation
    #include <sysclk.h>

    同时,在文件夹config下,多了一个文件conf_clock.h。

    wps_clip_image-20415

  2. 配置

    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 <asf.h>
    int main (void)
    {sysclk_init();while(1);
    }
  3. 编译

    但是在编译时,发现缺少头文件board.h。这说明ASF Wizard在解决依赖时也有那么一点Bug。尝试再手动添加一个模块Generic board support,再编译,发现又缺少头文件ioport.h,继续添加模块IOPORT,编译通过。IOPORT模块依赖了System Clock Control模块,可以将手动添加的这个模块删除,至此,又回到了新建项目时的模块设置了。

    添加不必要的模块会增加编译的时间,也可能会增加生成的目标文件的大小。如果熟悉相关头文件的作用,也可以修改asf.h中包含的头文件。

    另外,也可以通过了解ASF中函数的实现,来学习相关的配置过程。

    wps_clip_image-29383

  4. 查看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背光控制器

wps_clip_image-15044

开发板使用的LCD背光控制器是AAT31系列的。同时PC13连接的是它的使能、控制引脚。

另外,假设我们不知道这个背光控制器的亮度控制方法是向EN/SET引脚发送N个脉冲波,那该怎么使用这个控制器呢?RTFM?找它的芯片手册当然是一个能够深入了解它的方法,但假如我们的目标仅仅是能用就好,又或是使用起来太过麻烦呢?

嗯,我们这次学的就是ASF。

  1. 添加模块

    在ASF Wizard中添加Display – AAT31XX Backlight Controller模块。添加后项目里多了个头文件conf_at31xx.h,这个头文件主要的作用就是在未定义EN/SET引脚的接线时,对其进行定义(在sam4e_ek.h这个文件中已经做好相关的定义了)。同时asf.h中也包含了相关的头文件了。

  2. 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( )函数。

  3. API的使用

    可以查看相应的API的文档,以了解ASF提供的API。

    wps_clip_image-20800

    更直接的方法是阅读相应的头文件(aat31xx.h),这里面可能会有一些文档中未提到的部分。如以下几个宏就未在API文档中说明:

    #define AAT31XX_MIN_BACKLIGHT_LEVEL 1
    #define AAT31XX_AVG_BACKLIGHT_LEVEL 8
    #define AAT31XX_MAX_BACKLIGHT_LEVEL 16

    现在,就可以很方便地使用背光控制器了。如以下代码将配置背光为最大亮度:

    aat31xx_set_backlight(AAT31XX_MAX_BACKLIGHT_LEVEL);

 

四、 LCD控制器

开发板使用的LCD控制器是ILI93xx系列的。ASF提供的模块为Display – ILI93xx LCD Controller。conf_board.h中,相应的宏声明为CONF_BOARD_ILI93XX。

board_init( )中初始化的工作仅有配置GPIO引脚的复用,但是还有别的工作需要完成。所以LCD暂时还不能用。剩下的部分在下一次说明。

转载于:https://www.cnblogs.com/h46incon/p/3453137.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV坐标体系的初步认识

实验基础本次实验通过一个简短的例子&#xff0c;主要来说明下面4个问题&#xff1a; 1. 坐标体系中的零点坐标为图片的左上角&#xff0c;X轴为图像矩形的上面那条水平线&#xff1b;Y轴为图像矩形左边的那条垂直线。该坐标体系在诸如结构体Mat,Rect,Point中都是适用的。&…

在Visual Studio上开发Node.js程序

在Visual Studio上开发Node.js程序 原文:在Visual Studio上开发Node.js程序【题外话】 最近准备用Node.js做些东西&#xff0c;于是找找看能否有Visual Studio上的插件以方便开发。结果还真找到了一个&#xff0c;来自微软的Node.js Tools for Visual Studio&#xff08;NTVS&a…

mpls工作原理通俗解释_用这两种方法向最终用户解释NLP模型的工作原理还是不错的...

点击上方关注&#xff0c;All in AI中国上周&#xff0c;我看了一个关于“NLP的实践特性工程”的演讲。主要是关于LIME和SHAP在文本分类可解释性方面是如何工作的。我决定写一篇关于它们的文章&#xff0c;因为它们很有趣、易于使用&#xff0c;而且视觉上很吸引人。所有的机器…

三层架构——配置文件

1、配置文件是什么&#xff1f; 配置文件是随安装程序一起被安装到计算机上的文件&#xff0c;里面存放着安装好的应用程序执行时所须要的參数。 应用程序配置文件是标准的XML文件&#xff0c;XML标记和属性是区分大写和小写的。它能够按须要更改&#xff0c;开发者可使用配置文…

《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——02-04项目范围(Scope)管理...

本节书摘来异步社区《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》一书中的第2章&#xff0c;第2.4节&#xff0c;作者&#xff1a;邱毅凌&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 02-04项目范围&#xff08;Scope&#xff09;管理 嵌入式…

flex(入门)之timer的使用,键盘,鼠标的监听

package {import flash.display.Shape;import flash.display.Sprite;import flash.events.Event;import flash.events.KeyboardEvent;import flash.events.MouseEvent;import flash.events.TimerEvent;import flash.utils.Timer;import mx.controls.Label;//窗体大小&#xff0…

python 线程超时设置_python 条件变量Condition(36)

文章首发微信公众号&#xff0c;微信搜索&#xff1a;猿说python对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition.一.线程条件变量Condition相关函数介绍acquire() — 线程…

MsWord 操作总结

转自&#xff08;http://www.cnblogs.com/eye-like/p/4121219.html&#xff09; Msdn上的word操作api&#xff08;不过只有英文版&#xff0c;英文差的先闪过&#xff09; Word2007的API&#xff1a;http://msdn.microsoft.com/en-us/library/bb257531(voffice.12).aspxWord201…

两数之和 python_同一屏幕播放两个视频 视频左右两个画面或视频上下两个画面如何制作...

咱们在网上经常可以看到一些视频画面是可以在同一屏幕播放两个视频&#xff0c;有的是视频左右两个画面或视频上下两个画面这些是如何制作的呢&#xff0c;其实熟悉视频编辑软件的网友应该会比较了解这些操作&#xff0c;好嘞&#xff0c;来&#xff0c;现在就让小编来演示一下…

dlib人脸特征点对齐

前面我们介绍了使用dlib进行人脸检测&#xff0c;下面我们给出如何使用dlib进行人脸特征点检测。我们直接贴出代码。我们的代码包括如下几部分功能&#xff1a; 检测单张图片检测一个视频检测一个camera 先给出代码&#xff1a; #include <dlib/image_processing/frontal_…

《LoadRunner 12七天速成宝典》—第2章2.6节第二个性能测试案例

本节书摘来自异步社区《LoadRunner 12七天速成宝典》一书中的第2章&#xff0c;第2.6节第二个性能测试案例&#xff0c;作者陈霁&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.6 第二个性能测试案例云云&#xff1a;烤鱼吃得很爽。 恋恋&#xff1a;就…

MongoDB_1

突然想去看下MongoDB的东西&#xff0c;于是有了这篇文章。其实很早以前就看过一些关于NoSql的文章&#xff0c;还记得当时里面有介绍MongoDB的&#xff0c;多瞅了2眼&#xff0c;并且在Window下安装了MongoDB的驱动&#xff0c;小玩了会。今天重新翻出来&#xff0c;没成想在命…

pyqt5从子目录加载qrc文件_实战PyQt5: 045-添加资源文件

添加资源文件在使用PyQt进行图形界面开发的时候不免要用到一些外部资源&#xff0c;比如图片&#xff0c;qss配置文件等。在前面代码中&#xff0c;遇到这类问题&#xff0c;我们使用绝对路径的方式来解决&#xff0c;这种方式&#xff0c;本身有其不方便之处(比如&#xff0c;…

西门子ddc_铁门关西门子两通电动阀VVF42.25-10C+SKD60西

铁门关西门子两通电动阀西SIEMENS/西门子电动温控阀、控制箱、电动蝶阀、电动球阀、超声波热量表、超声波流量计、电磁流量计阀体灰口铸铁 EN-GJL-2502.霍尼韦尔主营&#xff1a;楼宇资料系统、热网自控系统、风机盘管电动两通阀、空气压差开关、水流开关、电动执行器、风阀执行…

JS-键盘事件之方向键移动元素

注意三点&#xff1a; 1&#xff1a;事件名称onkeydown。 2&#xff1a;事件加给document&#xff0c;而非window。 3&#xff1a; 把元素的top&#xff0c;left值分别用offsetTop&#xff0c;offsetLeft来设定。 <!DOCTYPE html> <html><head><meta char…

Swift学习字符串、数组、字典

一.字符串的使用 let wiseWords "\"I am a handsome\"-boy" var emptyString "" if emptyString.isEmpty{ println("这是一个空值") }简单说明&#xff1a;isEmpty方法是用来判断字符串是否为空值的&#xff0c;之后会执行if语句中的…

python对excel操作简书_Python读写Excel表格,就是这么简单粗暴又好用

最近在做一些数据处理和计算的工作&#xff0c;因为数据是以.CSV格式保存的&#xff0c;因此刚开始直接用Excel来处理。 但是做着做着发现重复的劳动&#xff0c;其实并没有多大的意义&#xff0c;于是就想着写个小工具帮着处理。 以前正好在一本书上看到过&#xff0c;使用Pyt…

halcon/c++接口基础 之 halcon初认识

从今天开始&#xff0c;开始更新博客&#xff0c;主要分享自己最近正在翻译的Halcon/C教程。先给出第一篇文章&#xff0c;由于此文章&#xff0c;是用latex写的&#xff0c;直接导成html&#xff0c;保存在七牛云存储上&#xff0c;所以直接点击链接就看到&#xff0c;后面我将…

指数型组织形成的 9 大驱动因素

指数时代&#xff0c;是一个前所未有的激动人心的世界。 Airbnb, 谷歌, 亚马逊和GitHub这些知名的公司&#xff0c;都有一个让人称羡的共同点&#xff0c;那就是——他们都是非常成功的指数型组织&#xff08;Exponential Organizations&#xff0c;ExO’s&#xff09;。 “在当…

mysqld:表mysql.plugin不存在_99%测试工程师不知道的数据库知识|干货

点击上方“蓝字”关注我们数据库&#xff0c;简而言之可视为电子化的文件柜——存储电子文件的处所&#xff0c;用户可以对文件中的数据进行新增、查询、更新、删除等操作。所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立…