菜鸟学习笔记1当我还是个纯菜鸟的时候,发现论坛上的很多帖子都看不懂,现在我已经由纯菜鸟变成一般菜了,在这写点东西给纯菜鸟,希望能帮助他们快速入门LM3S的开发。
有错误或者表达不清楚的地方也请大家批评指正啊。;P
软件准备:
1、MDK4.12+**
2、LM Flash Programmer
3、开发板驱动
4、StellarisWare
(2、3、4光盘里都有,MDK可能需要自己到网上下)
文档准备(个人觉得比较有用的):
1、LM3S8962英文版datasheet(中文版可能有翻译不准的地方,备着。。。)
2、周立功翻译的LM3S8962数据手册
3、Stellaris驱动库用户指南解锁2750版580页(讲API的)
4、8962_EvalBoard.pdf(里面有板子原理图)
5、其他。。。
(光盘里有一部分,论坛里也有一部分)
刚刚拿到板子,先按照论坛上前辈的帖子,把MDK4.12开发环境搭好,板子的驱动装好。
之后就开始研究入门的第一个程序——blinky。
可以打开StellarisWare\boards\ek-lm3s8962\blinky下的工程blinky.uvproj,打开后点击Flash->download就可以把程序下载到板子里了,这个程序的功能是让小灯闪烁。但这是TI给的示例工程,作为一个新手,我更需要知道的是从建立新工程到编译下载的流程。下面我就白手起家,演示一下从新建空工程到下载的过程。
打开MDK4.12,选择Project->New uVersion Project,然后给工程起个名字保存在一个文件夹里。
之后选择CPU型号LM3S8962。
1.JPG (113.52 KB)
2010-12-23 13:14
之后MDK会提示是否将Startup代码加入到工程中,选择是。一个空工程建好了。
2.JPG (27.82 KB)
2010-12-23 13:14
下面配置工程属性。
选择Project->Options for Target 'Target 1'弹出如下对话框
3.JPG (56.31 KB)
2010-12-23 13:14
Target下Xtal设为8.0,这是告诉编译器板子上主晶振的频率;
C/C++有个Include Paths框,这里是编译器查找include文件的路径,如果没有指定路径,编译器将无法找到头文件。
4.JPG (62.94 KB)
2010-12-23 13:14
5.JPG (48.16 KB)
2010-12-23 13:14
6.JPG (57.7 KB)
2010-12-23 13:14
7.JPG (51.15 KB)
2010-12-23 13:14
可以添加多条路径,我一般会添加StellarisWare根目录和StellarisWare\boards\ek-lm3s8962这两个目录
Utilities下选择Use Target Driver for Flash Programming,下面的下拉框选择Stellaris ICDI;
之后点击OK,工程属性配置完成。
然后就是敲代码了。。。
首先File->New新建一个文件,点击保存,命名为main.c。
右键点击左侧的工程文件目录的文件夹,选择add files to group ...,将main.c加入工程。
将示例程序中的blinky.c代码沾到main.c中(偷懒了)。按F7编译。
8.JPG (122.06 KB)
2010-12-23 13:14
点Flash->Download下载。
这就是从新建工程到完成下载的流程了。。。
下面来研究研究这个例程,建议初学者先看一下数据手册的系统控制部分和GPIO部分,系统控制部分主要注意RCGC寄存器,GPIO主要注意DEN,DATA,DIR寄存器,其他寄存器大致了解一下就行了;
#include "inc/lm3s8962.h" //LM3S8962的头文件,里面用宏定义了各个寄存器的地址以及寄存器各位的宏定义
int
main(void)
{
volatile unsigned long ulLoop; //定义了一个变量,变量名以ul开头表明变量类型是unsigned long,这是一个好习惯。。。
SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF; //将SYSCTL_RCGC2_R寄存器赋值为SYSCTL_RCGC2_GPIOF,这两个宏在lm3s8962.h中有定义,这句话执行之后系统将为GPIOF模块提供时钟。
ulLoop = SYSCTL_RCGC2_R; //给ulLoop随便赋个值,占用几个时钟周期,等待系统提供给GPIOF模块的时钟稳定,这样对DIR和DEN寄存器的赋值才能成功。
GPIO_PORTF_DIR_R = 0x01; //将PF0定义为输出端口
GPIO_PORTF_DEN_R = 0x01; //PF0数字使能,否则PF0将为高阻态;
while(1)
{
GPIO_PORTF_DATA_R |= 0x01; //PF0 = 1;小灯亮
for(ulLoop = 0; ulLoop < 200000; ulLoop++) //delay
{
}
GPIO_PORTF_DATA_R &= ~(0x01); //PF0 = 0;小灯灭
for(ulLoop = 0; ulLoop < 200000; ulLoop++) //delay
{
}
}
} |