AVR单片机入门+使用keil-MDK裸奔TQ2440

2019-11-30来源: eefocus关键字:AVR单片机  keil  MDK  裸奔TQ2440

两三个月没更新博客了,近两个月在学习AVR单片机,芯片的复杂度提高了不少,光300页的数据手册就看了三遍才有个大概的认识。接下来要做实验来熟悉各个模块啊,就找到了马潮老师的《单片机C语言程序设计实训--基于AVR PROTEUS仿真》这本极好的入门书籍,到现在基础练习就差一个上位机和下位机通信和看门狗实验没有做了,遗憾的是这本书布置的“作业”整体难度不高,有些作业一眼就能想出解决方案的就没有做,我认为还不清楚该怎么做的就一个也不放过。


每次开始学习新类型单片机的时候,都需要做的事是:

1)选择合适的单片机芯片

2)选择合适的开发环境

3)选择合适的烧写工具

4)学写裸奔程序以此熟悉单片机片上的资源

这样才能开始应用级的开发。我从游戏开发的需求出发,选择的是atmega1284P,开发环境是AVR Studio 4,五代安装麻烦,而且无法和winAVR编译器配合而导致_delay_us(variable)方法无法通过编译,只能使用常量做为延时参数。这个bug太让人不爽了,所以无奈换成四代+winAVR,网上其他的开发环境用过IAR,编译器比较下来更喜欢gcc提供的接口,所以才最终确定使用AVR Studio 4。烧写用不着,因为全部使用proteus仿真。之后实验的方式和在51上差不多,就是一个片上资源一个一个实验透。


转眼又一个多月过去了,做到了lcd控制器T6963C的实验,一个很严重的问题出现了,就是:一像素占1bit的图形lcd,画像素点以及基于此的画几何图形的效率极低。读写数据都是至少8bits,也就是以字节为单位。这样想要写个像素,需要

1)读取像素所在的字节

2)改变相应的位

3)写回显存

这样画像素的结果就是无法实现我希望的物理粒子效果,也许这种低效的方式也能实现粒子效果,但我没有去尝试。看看早期的游戏像“俄罗斯方块”和“推箱子”都不是平滑移动的,这样就可以避免不必要的位操作而把操作粒度放大到字节。即使像“贪吃蛇”这样的看似平滑移动的游戏,它的帧率是远低于一般游戏的,所以可以容忍低效的像素操作。而我要做的是基于精灵动画的游戏,需要对一个图片进行平滑移动,这样1bit像素lcd如果没有bit级别的块拷贝的话,实现起来极其麻烦,我唯一想到的办法是使用串行接口的lcd,这样可以在数据前后加bit达到数据的平移。


另一方面,网上有配合TFT显示屏的AVR单片机卖,那我的另一条出路是买个AVR开发板在上面继续实验。而我现成的有一块ARM7的板子和一块带触摸屏的ARM9的板子,权衡考虑后我决定升级到ARM平台,arm9的板子三年前就买好了,现在应该有能力驾驭了。 


cpu已经没的选了,就是S3C2440,开发环境我知道不能选早过气的ADS,极不友好的编译错误提示信息简直让人崩溃,搜搜发现可以用keil,那再好不过了。从ARM官网下了个MDK4.5评估版,烧写用和板子同时期买的J-link,调试一番后可以正常工作。可是最后一步的“裸奔”花了我几天的时间,网上的办法多少带点问题,根源是ARM的启动Flash有Nor和Nand两种,启动方式也有两种,所以参考了网上很多资料加上对启动过程的学习理解,才最终让led正确的亮起来。由于flash的刷写次数的限制,理想的裸奔方式是直接下载到RAM中去运行程序,几天的辛苦没白费。

 

keil-MDK裸奔TQ2440重点:

I.启动过程的理解。 

51单片机和AVR单片机的裸奔很简单,只要把编译出来的hex文件下载到单片机中就可以了,所以不会有复杂的地址配置。ARM就不同了,可以从Nor闪存启动,也可以选择从Nand闪存启动。

下图截自S3C2440A的数据手册(datasheet)。

 

1)左边的图可以是Nor闪存的启动内存映射,应该可以用其他rom代替,比如eeprom。这种模式和51,AVR就没有什么区别了,适合裸奔的应用。Nor闪存可以像RAM一样以字节的粒度存取,所以在Nor闪存中的程序就好像在RAM中一样被执行,你也可以选择把程序搬到真正的RAM中再执行。

2)右边的图是Nand闪存的启动内存映射,适合带操作系统的大型程序启动,Nand闪存的访问类似于电脑上的硬盘,是个块设备,启动方式也类似。先是搬Nand闪存开头4KB的引导程序到ARM内部的静态内存中(SRAM),引导程序的作用就是把更大的启动程序加载到真正RAM中再跳转过去执行。

 

II.创建并编写裸奔程序。

1)创建的时候cpu要选择s3c2440,也让MDK自动生成*.s的启动代码,网上有一篇不用MDK启动代码的从ADS移植裸奔程序的牛人文档,要改地东西较多,而我只想要个点亮led的裸奔程序,以我的51和AVR经验,我直觉的认为应该不需要很复杂的配置。

2)*.s的文件在MDK中可以可视化配置,这个做的比较人性化,

 

 主要的配置就是RAM内存的大小,我的TQ2440是64M,还有就是Led连接的端口,下图是核心板的电路图:

 

可以看到Led连接到GPB端口上。

3)主程序的编写。这个比较简单。

 

III.目标选项配置(Project->Option for Target)

Target,Linker,Debug,Utilities需要配置, 我是按Nand启动配置的,Nor的大家自己琢磨琢磨吧。


注意:经过尝试,我发现其实只要一个DebugInRAM_config.ini配置文件就可以运行程序了,里面重要的是SetupForStart(),PC值要设置在RAM的开头,我的就是BANK6的开头0x30000000。貌似J-link是直接把程序加载到外部内存的开头,这个也许跟Init()的配置相关。如果要调试的话就要把信息填填全。

关键字:AVR单片机  keil  MDK  裸奔TQ2440 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481602.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR单片机熔丝位的设置和详细的拯救方法
下一篇:单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PIC单片机以及51单片机和AVR单片机的IO口操作方法介绍
对于pic单片机的学习,很多朋友总是能充满激情,不断利用闲余时间研究pic单片机的各类技术。而谈及pic单片机,必须牵扯至51、AVR单片机。因此本文中,将探讨pic单片机以及51、AVR单片机对于IO口的操作。对于本文,希望大家认真研读,以在pic单片机的学习之路上更为精进。一.51单片机IO口的操作51单片机IO口的结构比较简单,每个IO口只有一个IO口寄存器Px,而且这个寄存器可以位寻址,操作起来是所有单片机里最简单的,可以直接进行总线操作也可以直接进行位操作,这也是51单片机之所以成为经典的原因之一。下例的运行坏境为Keil软件,器件为AT89S52。#i ncludesbit bv=P2^0;//定义位变量,关联P2.0
发表于 2019-12-05
PIC单片机以及51单片机和AVR单片机的IO口操作方法介绍
轻松玩转LCD12864-基于AVR单片机的LCD12864串行显示
:VO,对比度调整,一般接+5V就行了4:D/I(CS*),片选,也叫使能,接+5V5:R/W(SID*),数据输入端6:E(SCLK*),时钟输入端7~14:DB0 ~ DB7,并行数据总线15:PSB,串并模式选择,串行模式下接地,并行模式下接+5V16:NC,空引脚,不需要连接17:RSTB,复位端,低电平有效,一般接+5V就行了18:VEE,空引脚,不需要连接19:BLA,背光正极,接+5V20: BLK,背光负极,接地在实际编程时,有串行、并行两种模式可以选择。个人觉得,并行模式占用单片机引脚多(11个),优点是速度快(一次传8位数据,速度自然快),串行模式占用引脚少(2个),速度慢点。我喜欢使用串行模式,AVR单片机
发表于 2019-12-04
轻松玩转LCD12864-基于AVR单片机的LCD12864串行显示
AVR单片机教程——开发环境配置
;以上为废话,我们来配置开发环境吧。快速导航:下载 安装 配置1. 概述我们要安装以下几个软件:Atmel Studio 7.0(简称AS7),是Atmel为自家单片机推出的IDE,基于Visual Studio 2015;AVRDUDESS,是支持多种下载器的AVR单片机烧写工具AVRDUDE的GUI版,如果你熟悉命令行,直接用AVRDUDE也行;Zadig,用于安装USB驱动,无需安装,下载即用,只需要用一次;Serial Port Utility(简称SPU),是一个串口通信工具,界面比同类软件干净;串口工具的驱动,取决于你使用的型号,一般只有PL2303和CH340两种,在网上下载并安装对应的驱动即可。2.
发表于 2019-12-03
AVR单片机教程——开发环境配置
AVR单片机教程——点亮第一个LED
中的函数就可以了。用单片机来控制,最简单的就是点亮LED了。这个程序没有输入,有一个输出,就是让LED亮起。但即使简单,它也需要库,请在这里下载。库下载完以后是不能直接用的,我们要把它放进编译器的包含目录下。在EElib1.0.7z文件中有两个目录,分别是include和lib。打开Atmel Studio 7.0的安装目录,一路找toolchain→avr8→avr8-gnu-toolchain→avr,我是默认位置安装的,找到的目录就是C:Program Files (x86)AtmelStudio7.0toolchainavr8avr8-gnu-toolchainavr,这个目录下也有include和lib两个文件夹。把压缩包
发表于 2019-12-03
AVR单片机教程——点亮第一个LED
AVR单片机教程——闪烁LED
上次我们把LED点亮了。你可能已经试过把 LED_RED 换成其他灯,也可能已经用 led_on() 把所有LED一起点亮了。但是LED点亮以后,程序就退出了,之后LED一直没有暗,直到没有供电。这一次,我们用程序来控制LED的亮和暗。新建一个C executable项目,选择ATmega324PA单片机,在项目属性中添加库libee1,将配置改为Release。这是本教程现阶段中每一次新建项目都要做的。我刚才尝试用project template简化,然而设置无法导入。默认生成的main.c中的内容我们还是不要,全部删除后敲入以下代码: 1 #include <ee1/led.h> 
发表于 2019-12-03
AVR单片机教程——流水灯
,以及 int16_t 、uint16_t 等,一直到64位。avr-gcc还提供了24位整型作为编译器扩展:__int24、 __uint24 ,但它们毕竟是编译器扩展,尽量别用;同时如果你的单片机程序中有16位整数搞不定的东西,那就应该考虑简化一下了。我们用的单片机是8位机,指令只能处理8位整数,如果是16位,则需要多条指令进行组合。而C语言内置类型 int 在这个环境中是16位的。因此,为了节省空间、提升性能,当一个数可以用8位表示时,应该使用 int8_t 或 uint8_t 代替 int 。讲了这么多,为什么LED可以用 uint8_t 表示呢?把光标移动到任一表示LED的宏上,右键,点击Goto Implementation,或按下
发表于 2019-12-03
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved