LM3S811使用心得(一)
4月28日接到EEWORLD的EK‐LM3S811 EVALUATION BOARD,非常开心;下班后搜集
了相关的资料文档,便开始了LM3S冲浪学习(公司产品计划从16位单片机升级到32位ARM,未雨绸缪,非常必要),花了将近两天时间熟悉了一下,写下心得体会,以作滥竽充
数;Cortex‐M3性能,整体架构,接口协议等,各种书籍基本开篇前几章就啰嗦这些,自己
看去;有DEMO板,代码调试当然是第一步。
仅仅就心得写八百字确实有难度,于是乎把使用的过程加上滥竽充数,希望对大伙有所
帮助。
我们的口号延续以往竞赛精神:只要懂C语言就会开发ARM!
好了,开始我们的第一步:
一.开发环境的选择:
a)IAR Embedded Workbench V5.30
b)Keil uvision4
在之前MSP430开发时,选用过IAR,感觉不是很好;根据个人习惯,选择了KEIL。
二.开发前的准备工作:
1)软件:
a)Keil uvision4 或IAR Embedded Workbench for ARM
b)LM Flash Programmer(可选)
2)硬件:LM3S811评估板及配套的窄口USB下载线
三.把握方向
Cortex‐M3学习中把握什么?
四.简单案例
LED灯流水灯的制作
●选择的理由:经典简单,比较有利于熟悉整个硬件环境;切合DEMO板的实际
情况;
●目的:掌握GPIO引脚控制,复现DEMO固件代码。熟悉在KEIL环境下程序的
调试和下载。
●参考资料:Stellaris驱动库用户指南
●EK_LM3S811评估板硬件图的简要说明:
LED:
PB1/PWM3‐‐‐‐‐‐‐‐‐‐‐L6,blue
PE0/PWM4‐‐‐‐‐‐‐‐‐‐‐L7,green
PE1/PWM5‐‐‐‐‐‐‐‐‐‐‐L8,red
PD0/PWM0‐‐‐‐‐‐‐‐‐‐‐‐‐‐L3,blue
PD1/PWM1‐‐‐‐‐‐‐‐‐‐‐‐‐‐L4,green
PB0/PWM2‐‐‐‐‐‐‐‐‐‐‐‐‐‐L5,red
S1‐‐‐‐‐‐‐硬复位按钮
PC4‐‐‐‐‐‐‐‐可人为拉低,可做硬中断
PC5‐‐‐‐‐‐‐工作指示灯,1‐‐‐ON,0‐‐OFF
与JTAG接口复用的GPIO是:PB7(/TRST)、PC0(TCK)、PC1(TMS)、PC2(TDI)、PC3(TDO)。
代码如下所示(备注说明):
/****************引用文件*****************************/
#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_types.h"
#include "gpio.h"
#include "sysctl.h"
#define uint unsigned int
#define uchar unsigned char
/***********宏定义LED控制引脚***************/
#define LED_PERIPBH SYSCTL_PERIPH_GPIOB //LED外围 B端口作为通用输入/输出 宏定义
#define LED_PERIPDH SYSCTL_PERIPH_GPIOD //LED外围 D端口作为通用输入/输出 宏定义
#define LED_PERIPEH SYSCTL_PERIPH_GPIOE //LED外围 E端口作为通用输入/输出 宏定义
#define BLUE1_L GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,0) //BLUE1管脚为低
#define GREEN1_L GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_0,0) //GREEN1管脚为低
#define RED1_L GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_1,0) //RED1管脚为低
#define BLUE2_L GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_0,0) //BLUE2管脚为低
#define GREEN2_L GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_1,0) //GREEN2管脚为低
#define RED2_L GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0,0) //RED2管脚为低
#define BLUE1_H GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,1) //BLUE1管脚为高
#define GREEN1_H GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_0,1) //GREEN1管脚为高
#define RED1_H GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_1,1) //RED1管脚为高
#define BLUE2_H GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_0,1)
//BLUE2管脚为高
#define GREEN2_H GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_1,1) //GREEN2管脚为高
#define RED2_H GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0,1) //RED2管脚为高
/**************** 如无外部按键设计,可省略**************/
/
/ 定义KEY
#define KEY_PERIPH SYSCTL_PERIPH_GPIOC
#define KEY_PORT GPIO_PORTC_BASE
#define KEY_PIN GPIO_PIN_4
// 防止JTAG失效
void jtagWait(void)
{
SysCtlPeripheralEnable(KEY_PERIPH); // 使能KEY所在的GPIO端口 GPIOPinTypeGPIOInput(KEY_PORT, KEY_PIN); // 设置KEY所在管脚为输入
if (GPIOPinRead(KEY_PORT, KEY_PIN) == 0x00) // 若复位时按下KEY,则进入
{
while(1); // 死循环,以等待JTAG连接
}
GPIOPinIntDisable(KEY_PERIPH,KEY_PIN); // 禁止KEY所在的GPIO端口
}
//延迟函数
void delay (uint a)
uint i,j;
for(i=256;i>0;i‐‐)
for(j=256;j>0;j‐‐)
while(a>0)
a‐‐;
}
int main(void)
{
jtagWait(); // 防止JTAG失效,,建议习惯加上
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ);
//SysCtlClockSet函数()系统时钟设置 采用主振荡器 外接6MHz晶振 不分频
//使能LED所在引脚
SysCtlPeripheralEnable(LED_PERIPBH);
SysCtlPeripheralEnable(LED_PERIPDH);
SysCtlPeripheralEnable(LED_PERIPEH);
//GPIO输出型的
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_1);
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_0);
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_1);
c语言编程入门指南pdfGPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_0);
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_1);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0);
//初始化过程拉低全部LED控制脚
BLUE1_L;
BLUE2_L;
RED1_L;
RED2_L;
GREEN1_L;
GREEN2_L;
while(1)
{
delay(50);//延迟时间随意写的,根据实际调试,人眼可观察变化
BLUE1_L;
RED1_H;
delay(50);
RED1_L;
GREEN1_H;
delay(50);
GREEN1_L;
BLUE1_H;
SysCtlDelay(150* (SysCtlClockGet( )/ 3000)); // 延时约150ms
BLUE2_L;
RED2_H;
delay(50);
RED2_L;
GREEN2_H;
delay(50);
GREEN2_L;
BLUE2_H;
}
}
对上述代码的简要说明:
1.头文件:主要对器件引脚地址的定义和对外部函数的引用说明。
2.宏定义:结合硬件环境和功能要求进行的常规定义,同时可简化代码量,能让人从字面含义了解该函数所实现的功能。
3.子函数:作为主函数的引申,方便多次调用。
4.主函数:
首先是为防止JTAG失效,引入JTAGwait函数,尤其在JTAG引脚存在复用时,
该函数必不可少。我们建议在编写每一个应用程序时都在主函数的开始处插入
一段能够预防JTAG失效的代码。
该函数的工作原理是:
芯片正常复位时,由于KEY(为硬件电路设计时加入的按键)没有被按下,因
此会直接运行后面的代码,即JTAGwait()函数不影响正常操作。
当需要JTAG连接时,先按住KEY不松手,再复位,则程序进入一个死循环,以
等待JTAG连接,在此状态下连接是非常可靠的。有了JTAGWAIT函数的保障,
我们可以放心使用与JTAG接口复用的GPIO了,不必担心JTAG接口再被锁死的
问题。此外,我们还可以充分利用JTAG接口这一特性来为自己的程序加密,以
防止非法复制。
其次,时钟的选择:
表1.5 函数SysCtlClockSet( ) 功能 系统时钟设置
原型 void SysCtlClockSet(unsigned long ulConfig)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论